2024年12月16日

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

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

◆ ライントレースロボットとは

ライントレースロボットを作りましょう。次のように接続します。
・EV3カラーセンサーをポート1に接続。
・右モーターをポートAに接続。
・左モーターをポートDに接続。

ロボットのうしろにはボールキャスターを取り付けます。
ロボットの先端にEV3カラーセンサーを下向きに取り付けます。EV3カラーセンサーと床面との距離は1~2cmにします。
なお、ロボットの形状はこれがベストというわけではなく、まだまだ改良の余地があります。今回は完成度を後回しにして、構造のシンプルさを優先させました。

続いてコースを用意します。筆者の場合は、RISのVer.1.5に付属していたコースを使っています。かなり古いです。
今ならほぼ同一の形状をしている「楕円コース」がアフレルで売られています。価格が手ごろですので、そちらがおすすめです。

◆ ラップタイマを作る

今回は速くて正確なライントレースロボットを作りたいので、 ロボットが走る時間を確認したいと思います。コースを1周する時間を「ラップタイム」といいます。
ラップタイムを測るための装置「ラップタイマ」を作ってみました。ストップウォッチ片手に手動で測ることもできますが、何度も測定すると大変なので、自動化しておきましょう。 仕組みは単純です。インテリジェントブロックNXTまたはEV3のポート4に超音波センサーをつなぐだけです。 筆者の場合は余分に持っていたNXTを使いました。もしEV3を2つ以上持っている場合にはそちらを使ってください。

超音波センサーは進行方向に対して、横向きに設置します。 ここがスタート/ゴールとなります。超音波センサーの前方20cm手前までには何もない状態にしておきます。 前方にロボットが通過すると、センサーが反応します。
超音波センサーは横方向に反応する範囲がはっきりしていません。 そのため、通過時のタイミングにはズレが生じます。しかし、 今回の場合、1周目と2周目の通過時のタイミングが同じだけズレますので、1周あたりの時間を正確に求めることができるはずです。

ラップタイマーのプログラムです。 EV3ソフトウェアはNXTとEV3のどちらでもプログラムが作れるように工夫されています。 ただし、NXTの場合は使える機能が機能されています。 プログラムの仕組みは次のとおりです。
・超音波センサーが10cm以下になるまで待つ。
・タイマーで測定した時間を表示。
・タイマーをリセットする。
・20cm以上になるまで待つ。以上の処理を繰り返す。
センサー通過時に連続して反応してしまわないように「20cm以上」の待つ処理を念入りに行っています。

◆ トレースのしくみ

ここからが本題です。ライントレースのプログラムを考えます。
方法はいくつかありますが、今回は床面の色が「白」か「黒」かの2値だけを判断してトレースを行うことにします。 ラインをトレースするさいには「白」と「黒」の境界を走ります。図のように境界の右側か左側かのどちらか一方になります。今回は図の右側の方法を採用します。

EV3カラーセンサーの特性を確認します。 インテリジェントブロックの「View」を使って「反射光の強さ」を測定します。結果は次のとおりでした。
床面が白色の場合は「18」。
床面が黒色の場合は「1」。
ちなみにこの値はセンサーの取り付け位置によって変わります。今回の場合はセンサーと床面とのきょりがありすぎて、値が小さくなってしまっています。

今度はライトの光が白/黒で半々の状態にして測定します。 結果は「9」でした。白=18、黒=1なので、その平均値に近いです。

ロボットを設置した様子です。
ラインのやや右側にロボットを置きます。ロボットから見ると、やや左側にラインがある状態です。

◆ ライントレースのプログラム

考えられる限り最もシンプルなライントレースのプログラムです。スイッチブロックを使って、次のように処理を分岐します。
・床面が「黒」だった場合→右に曲がる(左モータをパワーを30で回す)。
・床面が「白」だった場合→左に曲がる(右モータをパワーを30で回す)。
以上の処理を繰り返します。床面の白/黒の判断には「反射光の強さ」を使います。スイッチブロックのしきい値には「白」と「黒」の中間の値を入れます。先ほどの測定では「9」でしたが、キリ良く「10」にしました。

プログラムを実行してみたところ、 1周あたりのタイムは「26.6秒」でした。
ロボットは左右交互に曲がり続けますので、結果としてジグザグ走行になります。このため、かなり遅いです。

ロボットが遅い原因は左右にムダに動きすぎるからです。 そこで、モータのオフ時の動作を「ブレーキ」ではなく「惰性」にしてみました。
「ブレーキ」はモータの停止時に回転軸が固定されます。一方、「惰性」ではモータの停止時に回転の勢いが残ります。

結果、1周あたりのタイムは「20.3秒」となりました。 6秒ほど短縮できました。
停止したモータが惰性で回転するようになったため、 ギクシャクした動きが減って、速くなりました。

さらにシンプルな方法として、「Lモーター」ブロックではなく、「ステアリング」ブロックを使ってみました。
ステアリングブロックを使うと、微妙な左右の回転量を制御することができます。これによって、左右片方のモータを完全に止めずに済むので、ジグザグ走行の揺れを抑えることができるかもしれません。

1周あたりのタイムは「19.8秒」でした。タイムがほとんど変わっていません。さらに少しギクシャクした動きに戻っています。
なぜかというと、「ステアリング」ブロックにはモーターの回転速度を一定に保つ機能があるからです。その回転速度より遅すぎる場合は速くなり、速すぎる場合には遅くなります。「Lモーター」ブロックのオン時にも速度の調節機能が働いています。
現在、モータのパワーを「30」に設定していますが、たとえば、パワーを「50」に増やすと、12秒くらいでコースを一周することができるようになります。しかし、ロボットの揺れが激しくなります。ステアリング値を「0」を近づけると揺れを減らすことができますが、今度はコースアウトしやすくなってしまいます。あちらを立てればこちらが立たずです。バランスを調整すればある程度は良くなりますが、このプログラムでは性能に限界があります。
次回は別の方法でライントレースを行って、ジグザグ走行から脱してみたいと思います。

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

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

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