赤外線センサ1個によるライントレース
ライントレースの最も基礎的な形式である赤外線センサ(IRセンサ)1個によるライントレースから始めましょう。
赤外線センサは、肉眼では見ることができない赤外線を捉えることができます。その動作形態から、2種類に分類することができます。赤外線LEDを用いないパッシブタイプ、こちらはサッカーロボットのボールを捉えるセンサとして用いられます。ライントレースでは使いません。
もう一つが、赤外線LEDでセンサから赤外線を照射して、その反射を捉えるアクティブタイプです。ライントレースではこちらを用います。また、サッカーロボットでは、フィールド内での位置を知る(位置同定)ために使います。
アクティブタイプの赤外線センサの特性は、左図に示すとおりです。ただし、正確に言えば、このように調整したと言うべきでしょう。赤外線センサには、感度(人間の視力にあたるもの)調整用の半固定抵抗器があります。これで、白だと180くらい、黒だと50くらいになるように調整するのです。その場合の、赤外線センサの特性が左図のようになります。
黒ライン上だと赤外線がほとんど反射されないので、センサの出力は50程度です。反対に白の床面上だと反射が強いので、センサの出力は180程度です。ところが、センサをライン上から床面にゆっくりと移動させながらその出力を観察してみると、徐々に変化して、グラフに示すと直線を描きます。これについては、次のようなイメージで理解するとよいでしょう。
赤外線LEDが照射する赤外線は、懐中電灯から放たれる光のようにある一定の広がりを持っていて、その円形の赤外線が完全に黒ライン上にある状態から、一部が床面にはみ出し、徐々にそのはみ出しの割合が大きくなっていくのです。やがて完全に黒ラインからはみ出すので、反射が強くなって180程度の値を呈すると。
赤外線センサの反応特性がある程度理解できると、実際のロボットの動きを考えることにしましょう。
左図が、赤外線センサ1個によるライントレースの動きを示したものです。上から見た図だと思ってください。赤外線センサが白色の反応を示したら、黒ラインから離れているので左旋回(左のタイヤは停止・右のタイヤは前進)でラインに近づきます。その結果、赤外線センサが黒色の反応を示したら、ライン上に来たので今度は右旋回(左のタイヤは前進・右のタイヤは停止)でラインから離れます。これをくり返すことで、首を左右に振りながら、ラインに付かず離れず沿って進むことができます。
では、ここからプログラミング開始です。フローチャートは左図のようになります。ただし、このフローチャートは全てを表していませんが、あまり大きな図は見にくくなりますので、以降もこのような形式にします。
「もし、赤外線センサが黒色の反応なら右旋回、そうでなければ左旋回しないさい」というものですが、この条件分岐はif文を使って表します。if文の形式は、
if(条件式){
処理A;
}else{
処理B;
}
となります。
したがって、この場合は、
if(黒色){
右旋回;
}else{
左旋回;
}
と記述します。
赤外線センサのようにアナログ信号を扱う場合は、
AD_GETDATA関数を用います。
その形式は、
AD_GETDATA(AD_ポート番号,&変数名);
となります。
この関数は、if文の前に入れて、常に最新の情報で条件分岐をおこなうようにします。
実際のプログラム(RDP−903による)は、ダウンロードして確かめてください。
ロボットの構成は次のようになります。
CN1・・・タッチセンサ,CN3・・・赤外線センサ
M1・・・右側のモータ,M2・・・左側のモータ
▲ このページのトップにもどる 赤外線センサ1個によるライントレースの動作改善
赤外線センサ1個によるライントレースの問題点を探り出し、その解決方法を考えることにしましょう。
実際に走らせてみたロボットの動きはどうでしたか?大きく首を左右に振りながら走り、あまり安心して見ていられなかった人も少なくないでしょう。どうしてそうなるのでしょうか?
当然ですよね。黒色かそうでないか、2つの状態しか見ていない上に、その判断基準となる閾値(しきい値)の設定に問題があるのです。解答例では、センサの値が120以下なら黒色、それ以外は白色と判断するようになっています。できるだけ首振りを小さくしてやれば、動作が安定する上に、首振りという無駄な動きが排除されるので、速度の向上が見込めそうです。少しでも黒ラインから外れたら、即座に左旋回をすればこの問題は解決できそうです。
そこで、黒色かどうかの判断基準である閾値を80程度にしてみましょう。こうすれば、ラインから少し外れると即座に左旋回をし、ラインを見つける右旋回をくり返すはずです。結果はどうですか?
今度はラインから外れるときがありませんか?動作が不確実になった人はいませんか?閾値を下げて、狭い範囲で首振り動作をさせようと考えたところまではよかったのですが、外乱(例えば、太陽光や白熱電球などに含まれる赤外線)の影響を受けて、ライン上でも80と誤認識をして、左旋回を続けてラインを超えてしまうことがあります。
ここで、もう一度、考え直しましょう。黒色かそうでないかの判別が確実におこなうことができればよいわけです。しかも、なるべく首振りを小さくするためにはせきるだけ狭い範囲で判別ができることが理想です。ある程度外乱の影響を考慮して、センサの値が100より小さくなれば黒色、140以上なら白色と判別するようにしましょう。さらに、100〜139の範囲であれば、その中間(灰色としておきましょう)なので直進動作を取り入れれば、確実にライントレースをしながら、直進動作を含むので速度向上が期待できそうですが・・・。とりあえず、実験をおこなってみましょう!
この場合のフローチャートは左図のとおりです。
条件分岐が2つ程度なら問題ありませんが、幾重にもつながっている場合は、工夫して記述しないと、とても見にくいものになります。その結果、あとで見直すときに手間がかかるだけなく、間違いの元にもなり得ます。
そこで、else if文の登場です。一般的に、if文をつなげて記述する場合によく用いられる手法で、是非、覚えてください。
その記述形式は、
if(条件式1){
処理A;
}else if(条件式2){
処理B;
}else{
処理C;
}
となります。
したがって、この場合は、
if(IR3 >= 140){
左旋回;
}else if(IR3 >= 100){
直進;
}else{
右旋回;
}
と記述します。
実際のプログラム(RDP−903による)は、ダウンロードして確かめてください。
ロボットの構成は次のようになります。
CN1・・・タッチセンサ,CN3・・・赤外線センサ
M1・・・右側のモータ,M2・・・左側のモータ▲ このページのトップにもどる