2024年12月17日

013-1.EV3ライントレース入門-第2回「ジグザグさせない走行でトレースする」

この連載では「教育版レゴ マインドストームEV3基本セット」を使ったライントレースロボットの作り方を紹介していきたいと思います。ライントレースロボットはその名のとおり「線(ライン)を追跡(トレース)」するロボットのことです。(文/松原拓也)

◆ EV3カラーセンサーの特性を調べる

前回と同じくライントレースロボットと楕円コースを使用します。
ハードウェアはそのままですが、前回よりも性能の優れたライントレースを行ってみたいと思います。

まず、EV3カラーセンサー(反射光モード)についてもっと知っておく必要があります。EV3カラーセンサーの特性を調べてみましょう。
下準備として、ライントレースロボットをラインの手前5cmの場所に置きます。

センサーの特性を測定するプログラムです(linetrace1.ev3)。
プログラムは「10cm前進する処理」と「グラフを描く処理」に分かれています。この2つの処理は並列的に実行されます。 EV3カラーセンサーの測定は8秒間だけ行います。

実行結果です。インテリジェントブロックEV3の液晶画面にグラフが描かれました。
横方向の縮尺は1ピクセルあたり約0.04秒です。測定は0.01秒ごとに行っていて、4回測定したら1ピクセル進みます。縦方向の縮尺は反射光の強さ1につき1ピクセルです。

グラフを拡大して、よく見てみましょう。
グラフで最低値を示している点が出発地点から約5cm進んだところです。
このグラフを見ると、EV3カラーセンサーの特性が分かります。

グラフの線がカーブを描いています。床面の変化に対して、比例しているなら直線になるはずです。つまり、センサーの値が比例していないということが分かります。
図の例だと、測定結果は左側(理想)ではなく、右側(現実)です。

比例していない理由を説明する図がこちらです。
カラーセンサーから出るライトの範囲は円形です。それに対して、床面のラインは直線です。そのため、ライトの光が隠れる面積に違いが生じます。カラーセンサーはライトの中心に近いほど感度が良く、中心から遠ざかるほど感度がにぶくなります。
このセンサーが比例していないという点は覚えておきましょう。

◆ ライントレースの性能を「見える化」する

ライントレースのプログラムを作成する場合、うまくトレースできているかどうかを確認しないといけません。なんとなくの気持ちで「うまくトレースできた/できてない」と判断するわけにはいきません。ライントレースロボットの性能を「見える化」する必要があります。
まずは前回作成した「ジグザグ走行」のプログラムを使い、性能を「見える化」してみましょう。

これは「Lモーター」ブロックの「オン」と「オフ(惰性)」を使ったジグザグ走行のプログラムです(linetrace2.ev3)。これに先ほど作った「グラフの表示機能」を追加します。
そして、インテリジェントブロックの画面をちゃんと見ることができるように、一定時間が経過したらロボットが停止する機能を追加します。ここでは8秒後に止まるようにしました。

こちらは「ステアリング」ブロックを使ったジグザグ走行のプログラムです(linetrace3.ev3)。これにも同じ改造を加えます。

実行結果です。画面にノコギリの刃のようなグラフが描かれました。グラフを比較してみましょう。
Lモーターを使用したバージョンはジグザグ走行の振り幅が大きいですが、ジグザグする回数が少ないです。
一方、ステアリングを使用したバージョンは振り幅が小さいですが、ジグザグする回数が多いです。
このように、走りの違いを目で確認することができます。ちなみに両者の走行タイムはほぼ同じなので、一概にはどちらが良いかと言えません。

◆ ジグザグさせない走行

ジグザグ走行の欠点は走りに無駄があることです。 そこで、「ジグザグさせない走行」を考えてみましょう。
ジグザグにしないために、モーターのパワーを最適にコントロールします。 たとえば、カラーセンサー(反射光モード)の入力が目標の値より近い場合はモーターのパワー出力を弱くします。逆に、カラーセンサーの入力が目標の値より遠い場合はモーターのパワー出力を強くします。
入力に対して出力を「比例」させるわけです。これで、ラインを通り過ぎる現象をなくします。

この「比例」という処理は「数学」ブロックの「かけ算」を使えば実現できます。実際に作成したプログラムがこちらです(linetrace4.ev3)。
数学ブロックで拡張機能を使って「(b-a)*c」という計算を行っています。aがカラーセンサー(反射光モード)の入力値です。bは床面が白色と黒色の中間のセンサー値で、「中心値」と呼んでいます。cは比例させる倍率で、「ゲイン」と呼んでいます。
数学ブロックの計算結果は「ステアリング」ブロックのステアリング値につないでいます。 ステアリング値は左右のモーターのパワーを振り分けるための設定値です。

つまり、「(b-a)*c」という式は「(センサーの中心値 - センサーの入力値)×ゲイン」という意味です。
このような制御は「比例制御」と呼ばれています。ただし、今回の場合はカラーセンサーの入力が比例していません。比例していない入力を比例させていますので、不完全な比例制御と言えます。この問題はセンサーの入力を正規化すれば解決できますので、次回か次々回あたりに対策してみたいと思います。

もし、パワーを最適に割り出すことができれば、この図で示した範囲でラインをトレースさせることができます。
以上が「ジグザグさせない走行」の仕組みです。

プログラムの実行結果がこちらです。
ジグザグ走行しなくなりました。劇的な進歩です。実際、どのように走っているはYoutubeの動画で確認することができます。

「ステアリング」ブロックを使わず、「Lモーター」ブロックを使ったバージョンも作ってみました(linetrace5.ev3)。

実行結果がこちらです。ほとんど同じですが、線のブレが収まっているように思えます。全体的な走行のスピードが上がっていますが、これは計算方法が違うからです。

以上のように、ライントレースの性能を上げるという目標は見事に達成することができました。 ただし、問題点はまだまだあります。次回にはもっと性能を上げたいと思います。

[movie]EV3ライントレース入門動画(Youtube)

[DOWNLOAD]今回作成したプログラム(教育版EV3ソフトウェア用)

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