2024年11月12日
004-2.ライントレース入門-第6回「十字のコースを進む2」
「ライントレースロボット」とは、床面にある線(ライン)を追いかける(トレースする)ロボットのことです。こうしたロボットには「入力」と「出力」という制御の基本が詰まっている(なおかつ奥が深い)ので、ロボット競技の世界では定番の要素となっています。
このコーナーでは、「教育用レゴ マインドストームNXT(以下、NXT)」を使ってライントレースロボットを作り、制御することの面白さをお伝えしたいと思います。(文/松原拓也)
◆ センサを2個にする

前回からの続きで、ロボットを改良していきます。ここでは光センサを2個にしてみました。左側のセンサはポート1、右側のセンサはポート2につないでいます。

裏側です。センサ以外は前回と同じ形状です。

光センサを2個にすると、どんな影響があるのか? 図にしてみました。
搭載しているセンサが1個の場合、床面の白色と黒色の中間を走ります。カバーできる範囲はセンサの幅2個ぶんです。
そして、センサが2個になった場合だと、カバーできる範囲はセンサの幅3個ぶんになります。
つまり、搭載するセンサが1個よりも2個のほうが範囲が広がってコースアウトしにくくなるわけです。

プログラム方法を考えてみましょう。
光センサを読み取るさいには、「白色を検出」「黒色を検出」のように2値ではなく、もっと細かくとらえるようにします。過去の連載第1~5回目の記事を参考にしてください。
連載第3回目の最初に作ったプログラムを使って、ラインの検出を行ってみたいと思います。

ライン検出のブロックを拡大してみました。
センサがラインに近づくと黒レベルという値が増えていきます。黒レベルには右側と左側があり、片方がもう片方を引くと、ラインの中心位置が求まるようになっています。

先のプログラムを実行してみます。
ラインの両側に光センサをはさむように配置して、実行します。
実行すると、最初に白レベルを学習(第2回目参照)して、それを元にラインの位置を算出します。

プログラムを実行時の様子を図にしてみました。
ラインに対してセンサの位置が中心の場合には「0」が表示されます。
センサが左にいくほど値を増えて、最高で20くらいになります。逆にセンサが右にいくと、値はマイナスになり、最高で-20くらいになります。
トータルで約40段階で、ラインの位置を求めることができるわけです。
◆ オーバルコースのトレース

先ほどのプログラムの青いワクのブロックを書き換えて、ロボットがラインをトレースするようにしてみました。
[Download]ライントレースロボットのプログラム2(NXTソフトウェア1.0で作成)

書き換えた部分を拡大してみました。ラインの位置に一定の値(ゲインと呼ぶ)をかけてから、足し算または引き算を行い、それをモータのパワーに代入しています。

プログラムを実行してみました。見事にラインをトレースしています。ライントレース特有のジグザグの動きをしていない点にも注目してください。
[Movie]ロボットの動いている様子のムービー1(Youtube.com)
センサが1個から2個に増えたことによりラインを追従できる範囲が広がっています。それによって、今まで以上に速くロボットを走らせられるようになっています。

ちなみに、コースを1周するタイムは6.5秒ほどになりました。
連載第1回目の最高タイムが1周あたり10秒だったことを考えると、劇的に速くなっていることが分ります。
◆ 十字コースでの一旦停止

いよいよ本題の十字コースに挑戦してみましょう。このプログラムで十字コースを通過した場合、左右の黒レベルに差が生じませんので、そのまま直進します。なので、前回(センサ1個だけの場合)のように十字を判別するプログラムを用意する必要はありません。

十字コースを直進する方法は解消されてしまいましたので、 次は左折・右折するを行ってみたいと思います。そこで、十字コースを認識する方法を考えてみます。

こちらが十字コースを検出して、モータを停止させるプログラムです。
[Download]ライントレースロボットのプログラム3(NXTソフトウェア1.0で作成)
青いワクの部分が、検出する処理です。左右の黒レベルを引かず、逆に足してみました。そして、それが30よりも大きくなったら「十字に到着した」と判定させています。 30÷2=15。 両方の黒レベルがそれぞれ15くらいに達する程度の「しきい値」に設定しました。

プログラムを実行すると、図のようにセンサがラインの上に来た状態で止まります。
◆ 十字コースでの左折

いよいよ最後の課題です。
プリンタで印刷した十字コースの紙を4枚並べてみました。

写真のように十字コースを左折しながら周回してみたいと思います。

ロボットは十字コースを「その場せん回(超信地旋回)」で曲がります。

ラインにタイヤが乗っている状態で、センサとの距離を測ってみました。長さは約6cmです。

両タイヤの距離(トレッド)も測ってみました。約10.5cmです。

以上のデータを元に、コースを曲がる制御を追加してみました。

その場せん回の部分を拡大してみました。 「56」というのは、使っているタイヤの直径です(mm)。

プログラムを実行してみます。十字コースで左折を繰り返して、コースを周回しています。成功です。
ライントレースロボットの話題は他にもいろいろあると思いますが、連載は以上で終了です。語り足りない部分はまた別の機会でご紹介できたらと思います。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。