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

NXTの「ライントレースロボット」で、最もおなじみなものが三輪車型のロボットです(正式名がわからないので、ここでは「三輪型ロボット」と呼びます)。三輪型ロボットはリテール版や教育用に付属するマニュアルで一番最初に紹介されています。
この三輪型ロボットは、モータ2個と光センサ(ライトセンサ)1個で構成されています。各モータにタイヤが1個ずつ付いていて、後ろにある3個目のタイヤはキャスターになっています。

このロボットの構造ですが、左右のモータは出力ポートBとCにつなぎ、光センサは入力ポート3につながっています。
今回はこの「三輪型ロボット」とモータとセンサの接続先を同じにした「互換機」を作ってみようと思います。なぜ、互換機を作るかというと、できるだけハードウェアを同じにしておいて、ソフトウェアを使いまわしたいからです。あと、三輪型ロボットは部品数が多く、組み立てがちょっと面倒です。そこで、互換機は部品を減らして簡単に作れるようにしたいと思います。

こちらが三輪型ロボットの互換機です。可能な限り部品数を減らしました。

うしろから見たようすです。

裏側から見たようすです。プーリーがキャスターになっています。
◆ 最も簡単なライントレースプログラム

ライントレース用のシートを床に広げます。

まず、最初に光センサの特性をチェックします。
「View」をメニュー選択して、「Reflected light」→「Port3」を選択します。

赤色LEDの光が直径1.5cmくらいの範囲を照らします。その光を床面の「白」と「黒」の中間に合わせて、値を読み取ります。
このセンサ値はあとで使いますので、覚えておいてください。

光センサと床面の距離は1cmくらいがベストです。
写真のようにシートが平らじゃないと、センサの値が数%変わってしまうので注意してください。

こちらが「ロボットエデュケータ」でも紹介されている、おそらく一番簡単なプログラムです。 NXTソフトウェアを使ってプログラムを作りました。これを1号機と名付けました。
このプログラムは、「スイッチブロック」を使って、光センサの値を「白」か「黒」かに分岐させています。
[Download]ライントレーサ1号機
(教育用NXTソフトウェア2.0で作成)

「スイッチブロック」の設定です。

こちらがプログラムが動いているときのムービーです。
[Movie]1号機の動作中のムービー(youtube)
よく見るとロボットはジグザグに進んでいます。
これはなぜでしょうか?

ライントレースロボットの動きを図にするとこのようになります。
青い矢印がC側のモータを動かした時の動き、
赤い矢印がB側のモータを動かした時の動き、です。
ロボットは BとCのモータを交互に動かして、線の切れ目を探しながら前に進みます。ロボットがジグザグに進んでいるのはこのためです。

スイッチブロックには先に測定した「白と黒の中間」のセンサ値を入力します。
自分の場合だと「42」が中間だったので、「42」を入力しました。
ここが「白でもない黒でもない位置」ということになります。
◆ なめらかに進むには

先に作った1号機はジグザグで進むので、動きが遅かったと思います。
そこで、プログラムを改良して2号機を作ってみました。変更点は赤いワクの部分のブロックです。
[Download]ライントレーサ2号機
(教育用NXTソフトウェア2.0で作成)
なお、センサには個体差があるので、自分の使っている光センサに合わせてブロックの値を調整してください。

1号機のプログラムでは、BとCのモータのうち、どちらかが止まっていました。そのため、ロボットはあまり前に進みません。
そこで、2号機では止まっている側のモータも少しだけ一緒に回すようにしました。

プログラムの動作する様子です。
1号機の時よりも前に進むようになりました。
[Movie]2号機の動作中のムービー(youtube)

しかし、これには欠点があります。よく観察してみると、ロボットがカーブを曲がるときにラインを「遠回り(コースアウト)」しています。
ロボットとラインがズレているわけですが、この現象はあまり良くありません。
外側のモータのパワーを増やせば戻りますが、それだと、戻りすぎた時にロボットがグラグラとゆれてしまいます。
内側のモータのパワーを落としてもいいのですが、それだと遅くなってしまいます。どっちにしても、ちゃんとした解決になりません。
◆ 遠回り(コースアウト)対策

2号機のラインから外れてしまう対策として、3号機のプログラムを作ってみました。
[Download]ライントレーサ3号機
(教育用NXTソフトウェア2.0で作成)
なお、センサには個体差があるので、自分の使っている光センサに合わせてブロックの値を調整してください。

制御方法を図にすると、このようになります。
ラインが中心値よりも遠いほどパワーが増え、近いほどパワーは減ります。これによって、ラインの飛び出しを防ぎます。
(入力した値が大きいほど出力の値も増える。こうした現象を「比例」といいます。比例については中学校で習います。)

ラインの中心かどうかは、光センサの値で判断します。
今まで、光センサはプログラムで「白」と「黒」の2種類でしか判別していませんでした。
しかし、実際には白から黒までの間には 30~40くらいの段階に分けることができます。
そこで、光センサの中心値との差を数値化して、パワーに当てはめればいいわけです。
◆ ロボットの「ゆれ」をなくす

3号機はロボットが進む時にガクガクとした「ゆれ」がありました。
4号機では、これをなくしてみたいと思います。
「ゆれ」の起きる原因はモータのパワー制御が適切ではない(パワーが多すぎるか少なすぎる)からです。
そこで、パワーの算出方法を見直します。
プログラムからスイッチブロックを取り去り、さらに両輪のモータのパワーを設定するように変えてみました。
両輪がこまめに動けるようになり、小回りがきくようになったはずです。
[Download]ライントレーサ4号機
(教育用NXTソフトウェア2.0で作成)
なお、センサには個体差があるので、自分の使っている光センサに合わせてブロックの値を調整してください。
そして、こちらが動作中のムービーです。
今までにあったガクガクとした揺れが、ついになくなりました。
大成功ですね。
[Movie]4号機の動作中のムービー(youtube)

補足ですが、ロボットのタイヤのB側だけが回った場合の動きを図にしてみました。
緑の線が光センサの動きです。理論的にこれ以上の急なカーブは曲がれません。

それからタイヤのC側だけが回った場合と、BとC両方が回った場合を書き加えました。
BとCのパワーの割合を微妙に変えるだけで、色の付いた方向(緑・黄色・紫)にはすべて進めるということになります。
◆ もっと速く走らせたい
4号機で、もう大満足なのですが、ちょっと欲張って、次の点をパワーアップさせてみました。
- ● 直進したときのスピードをもっと速くしたい。
- ● センサの設定値の変更をもっと簡単に。
- ● カーブでもっとキビキビと向きを変えたい。

改良したプログラムがこの5号機です。
プログラムが長くなってしまいましたので、分割して紹介します。
[Download]ライントレーサ5号機
(教育用NXTソフトウェア2.0で作成)

前半のプログラムです。ここで各変数を初期化しています。
- ● 変数「Center(センター)」は光センサの白と黒の中間値です。 センサには個体差があるので、自分の使っている光センサの値に合わせてください。
- ● 変数「Gain(ゲイン)」はモータの機敏さを表す変数です。この値を大きくすると、センサの変化に対して機敏に反応します。しかし値が大きすぎると、ゆれが増えてしまいます。さらに、この値が少なすぎると遠回りしてしまいます。
- ● 変数「Power(パワー)」はモータのパワーです。この値を大きくするとロボットの動きが速くなります。

こちらが後半のプログラムです。光センサの値から「センサの位置」を計算して、
さらに左右のモータのパワーを割り出しています。
「センサの位置」は、0だと中心、値がマイナスだと黒側に寄っている状態、値がプラスだと白側に寄っている状態となります。
「センサの位置」の値に変数Gainを掛けて、その結果を変数Powerから足します(または引きます)。
つまり、直線のラインでは、左右のモータが変数Powerのパワーで回ります。
カーブのラインを走るときは、内側のモータのパワーが減り、外側のモータのパワーが増える、、、というわけです。

動作中の様子です。
スピードアップしたため、若干ふらついてますが、かなりなめらかに進んでいます。 1号機ではコースを1周するのに1分ほどかかっていましたが、 5号機では約10秒にまで短縮できました。
[Movie]5号機の動作中のムービー(youtube)
変数Powerや変数Gainの値を変えて、動きがどう変わるのか確認してみると面白いと思います。
ライントレースロボットは難しい技術を一杯ふくんでいますが、難しいからこそ競技で人気があります。 そして、この技術にはまだまだ続きがあります。次回をお楽しみに。
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。