2024年11月12日

004-2.ライントレース入門-第4回「直角のカーブを曲がる」

「ライントレースロボット」とは、床面にある線(ライン)を追いかける(トレースする)ロボットのことです。こうしたロボットには「入力」と「出力」という制御の基本が詰まっている(なおかつ奥が深い)ので、ロボット競技の世界では定番の要素となっています。
このコーナーでは、「教育用レゴ マインドストームNXT(以下、NXT)」を使ってライントレースロボットを作り、制御することの面白さをお伝えしたいと思います。(文/松原拓也)

◆ コースとロボットの作り方

今回は難易度を少し上げて、「直角に曲がったラインの上を走るロボット」を作ってみたいと思います。直角に曲がっているラインはロボット競技のコースでもよく登場しますので、競技に参加する予習として考えてみてもいいかもしれません。

コースの作り方を紹介します。
A4の紙を4枚用意して、次のpdfファイルを印刷します。印刷するのはシートAを2枚、シートBを2枚です。

[Download]印刷用シートA(pdfファイル)

[Download]印刷用シートB(pdfファイル)

セロハンテープを使って4枚の紙を張り合わせます。コースのつなぎ目の白い部分はサインペンや筆ペンで塗りつぶします。

コースが完成しました。

続いて、ロボットを作ります。
ロボットは第1回目と第2回目に登場した「三輪型ロボット」をそのまま使います。
2つのモータは出力ポートのBとCにつなぎます。光センサは入力ポート3につなぎます。

ロボットの裏側です。写真を参考に組み立ててください。

◆ そのまま走らせてみる

第1回目に紹介したライントレースロボットのプログラムを再現してみました。

[Download]ライントレースロボットのプログラム1(NXTソフトウェア1.0で作成)
機能としては1回目と同じですが、見やすくするために、ブロックの数を減らしています。

プログラムを動かして、その仕組みを紹介します。
まず最初に、ラインと床面の中間の位置に光センサを置き、プログラムを実行させます。センサから出ている光が黒と白で半分ずつ当たるようにしてください。

プログラムを実行すると、一番最初に光センサの値を「center」という変数に格納されます。この値はセンサの誤差によってひんぱんに変わります(詳しくは第2回の記事を参照してください)。

プログラムの続きです。
「3」という値は光センサの値に掛ける常数です(比例ゲインといいます)。この値を増やすとロボットの反応が早くなります。
「40」という値は直進時のモータのパワーです。この値を増やすと、ロボットの速度が上がります。

光センサの値はラインから離れるほど大きくなり、逆にラインに近づくと小さくなります。
この値から変数centerの値と引きます。すると、床面の白と黒の中心では値は「0」になります。値がプラスかマイナスかによって、左右のモータのパワーを割り振ることができるようになります。

まずは、教育用レゴマインドストームのセットに付属するシートを使って、ロボットを走らせてみました。
このシートはコースのラインが曲線になっていますので、ロボットを問題なく走らせることができました。

では、先ほど作った直角のラインのコースではどうなるでしょうか?
実際に走らせてみましょう、、、

、、、ロボットが直角のラインを通過したあと、、右に向いてラインをトレースしようとしましたが、間に合わず大きくコースから外れてしまいました。予想どおりですが、結果は失敗です。

[Movie]ロボットの動いている様子のムービー1(Youtube.com)

どうやら、ポートB側のモータを逆転させてロボットを「せん回」させないと、コースを曲がりきれないようです(現在のプログラムには逆転する機能がありません)。

◆ 直角に曲がるには?

それでは、ロボットに「せん回」させる機能を取り入れてみたいと思いますが、、、
しかし、ここで問題があります。いったい、どのタイミングでせん回させたらいいのでしょうか。いくつかの方法が考えられます。

・(案1)「タイマを使う」:一定の時間になったら、せん回させる。しかし、出発する位置が変わったら、正しく曲がれない。電池の残量などでも誤差がでるかも。
・(案2)「回転センサを使う」:モータの回転量を回転センサで検出して、一定量を超えたらせん回させる。ロボットがジグザグに走ったりすると、距離が変わってしまうかも。
・(案3)「光センサを使う」:光センサを使ってラインのカドを検出する。

、、、などです。
再現度が高いほうがいいので、ここでは3番目の「光センサを使う」方法にしてみたいと思います。。

カドの検出方法をもっと詳しく考えてみます。光センサの読み取り位置を図にしてみました。
通常、光センサはトレースするためにラインの黒い部分に当たっています。しかし、ラインのカドを通過すると、白い面だけにセンサが当たるようになります。そこで、一定より大きなのセンサの値になると、「カドに到着した」と判定させることができるはずです。

先ほど作ったプログラムを改造してみました。青ワクで囲んだ部分が改造部分です。
[Download]ライントレースロボットのプログラム2(NXTソフトウェア1.0で作成)

拡大してみました。
「val」という変数ブロックを追加して、ここに光センサの位置を入れます。そして、この値を「比較ブロック」で比べます。 値が7よりも大きい場合、ラインのカドに位置すると判定しています。この値を下げると反応がするどくなり、逆にこの値を上げると反応がにぶくなります。

比較ブロックの中身です。
上半分がラインのカドを検出した時の処理で、下半分が普通にラインをトレースしている時の処理です。
まずは実験として、カドを検出した時にはせん回をさせず、ブレーキをかけるだけにしてみました。

プログラムを実行させてみました。
ロボットがラインをトレースしながら走り、ラインのカドにさしかかったところで、見事に止まりました。成功です。

[Movie]ロボットの動いている様子のムービー2(Youtube.com)

よく見ると、光センサの先がラインのカドから1cmくらい飛び出しています。これはモータにブレーキをかけてから、実際にロボットが止まるまでにかかった距離です。もしモータのパワーを上げた場合、この距離はもっと長くなります。

◆ ロボットのせん回(1)

いよいよ、ロボットをせん回させてみます。
先ほど作ったプログラムにブロックを追加しました。青ワクで囲んだ部分が追加したブロックです。

[Download]ライントレースロボットのプログラム3(NXTソフトウェア1.0で作成)

青ワクの部分を拡大してみました。
「待機ブロック」1個と「移動ブロック」2個を使い、前進とせん回を行っています。

その場で時計方向にせん回するには、ポートC側のモータを正転させて、ポートB側のモータを逆転させます。ちなみに、その場でせん回させることを「超信地(ちょうしんち)せん回」といいます。

プログラムを実行させてみました。
ロボットが走り出し、ラインのカドで90度せん回ができました。、、、が、しかし、光センサがうまくラインの上にのっていないので、これではトレースを続けることができません。
この原因はロボットに勢いがついてしまい、位置に誤差が出てしまうためです。ブロックの設定値を調整して直すこともできますが、コースの条件が変わると何度も調整をやり直さないといけなくなってしまいます。
あと、せん回した時にロボットの動きがぎこちないようです。これはロボットの構造上の問題なので、形を組み直せば対策できます(次項で方法を紹介します)。

◆ ロボットのせん回(2)

先ほどの位置が合わない問題の対策として、プログラムを直してみました。

[Download]ライントレースロボットのプログラム4(NXTソフトウェア1.0で作成)

前回のプログラムのうち、青いワクで描いた部分を修正しています。

青ワクの部分を拡大してみました。
前回は回転センサを元にモータを回転させていましたが、今回は光センサの値を元に回転させるようにしました。光センサの判定には「比較ブロック」を使っています。

せん回時のロボットの動きを図にしてみました。赤い円が光センサの位置です。光センサが外れることで、せん回をスタートして、光センサがラインに戻るとせん回を終了します。
こうすることで、ロボットの位置の誤差を吸収することができます。

ついでに「ぎこちない動き」の対策として、ロボットの形を直してみました。
インテリジェントブロックの位置を前に動かしています。/p>

裏側から見た様子です。
インテリジェントブロックが前に出たぶん、センサを短くしています。

修正前のロボットです。
青い部分が大まかな重心の位置、赤い部分がタイヤの接地面です。この両者が離れていると、タイヤに力が入りません。

そしてこれが修正後のロボットです。
重心の位置がタイヤに近づいたので、以前よりもグリップ力が増し、せん回がしやすくなりました。

さっそく、プログラムを実行させてみました。
ロボットがカドを検出すると、せん回します。

せん回が終った様子です。これで見事、直角のカーブが曲がれるようになりました。失敗もなく、安定して走っています。

ロボットが動いてる最中のムービーです。重心位置を変える修正前と修正後の2種類を用意してみました。見比べてみてください。

[Movie]ロボットの動いている様子のムービー3(Youtube.com)
[Movie]ロボットの動いている様子のムービー4(Youtube.com)

なお、今回紹介した方法はラインのカドで曲がる方向をあらかじめ設定しておく必要があります。そのため、逆まわりに走らせることができないので、機能として物足りないかもしれません。
では、どちらにも曲がれる万能なロボットを作るには、どうしたらいいでしょうか? よかったら考えてみてください。

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。