2024年12月5日
010-1.ロボット競技に役立つEV3センサー入門-第5回「ライントレースロボットを工夫する」
この連載では「教育版レゴマインドストームEV3」を使い、各種センサーをロボット競技に役立てるためのノウハウを紹介していきます。本当に役立てるためには実際に手足を動かすしかありませんので、これを参考に実践してみましょう。なお、使用するプログラミング環境は「教育版EV3ソフトウェア」です。(文/松原拓也)
今回使用するのはEV3用の「カラーセンサー」です。
カラーセンサーには「色」「反射光の強さ」「周辺の光の強さ」という3種類のモードがあります。 今回は前回に引き続き「反射光」モードについて紹介します。反射光とはLEDを赤色に発光させて、対象物に当てて反射してきた光を測定するというモードのことです。
今回はカラーセンサーを2個使ってライントレースロボットを作ります。基本セットにはカラーセンサーは1個だけなので買い足さないといけないかもしれません。ライントレースはセンサーを1個使うよりも2個使ったほうが有利です。
・センサー2個の場合、途中で周辺の明るさが変わっても誤動作しません。センサー1個の場合だと誤動作します。
・センサー2個の場合、ラインが交差している場合、直進します。センサー1個の場合だと直進できません。
・センサー2個の場合、ラインが途切れた場合、直進します。センサー1個の場合だと直進できません。
こちらが出来上がったロボットです。Lモーターも2個使います。
入力ポート1:カラーセンサー右
入力ポート2:カラーセンサー左
出力ポートA:Lモーター右
出力ポートD:Lモーター左
参考までにロボットの裏側です。 後側にはボールキャスターを使ってます。
◆ その場旋回の方法
ちょっと寄り道になりますが、 ロボットに「その場旋回(超信地旋回)」をさせる方法について紹介します。
その場旋回を行うには「タイヤの直径」と「トレッド(左右のタイヤの間隔)」を測定しておきます。定規やノギスを使って測ります。
トレッドを直径とした円はその場旋回した時のタイヤの通り道と同じです。この原理を応用すると、その場旋回に必要なモーターの回転角度を計算で求めることができます。
・トレッドを直径とした円の円周=トレッド×円周率
・タイヤの円周=タイヤの直径×円周率
・360度のその場旋回でのモーターの回転数=(トレッド×円周率)÷(タイヤの直径×円周率)=トレッド÷タイヤの直径
その場旋回のプログラムです。
1段目のプログラムで90度旋回します。
2段目のプログラムは回転センサーの値から旋回した角度を求めます。すでに90度旋回しているので、答えが「90度」なのは分かっているのですが、後でこの技術を使うための実験です。
なお、トレッドはタイヤのぎりぎり内側の間隔にしています。理由は分かりませんが、こうしないとオーバーランして余分に旋回してしまいます。タイヤの外側がスリップしているのではないかと思います。
プログラムを実行しました。
ロボットが時計方向に90度旋回をしました。
液晶ディスプレイに「89.6」度と表示されました。正常にロボットの角度を測定・計算できています。思い通りです。
◆ 差分でセンサーの値を求める
前回の実験結果のとおり、ライトの明かりを50対50で当てます。ここが最も測定値の変化量が大きいので、最適の位置となります。 カラーセンサーのライトの光は1つあたり直径3cmくらい欲しいです。 そのためカラーセンサーを床に近づけすぎないように取り付けます。遠ざけると測定範囲は広がりますが、感度が落ちてしまうというデメリットがあります。
センサーをそれぞれラインの上に乗せて、「PortView」を使って測定してみました。
両方とも黒色が2で、白色が20です。 左右のセンサーの感度のバラつきが無いか心配だったのですが、感度はまったく同じです。これで一安心です。
、、、と思ったら、ここで別の問題が出てきました。
ロボットをラインの中心の置くと、左右で測定値が2~3違います。先ほどの実験ではセンサーは左右の性能がまったく同じだったのに、なぜこうなるのでしょうか。 理由は不明ですが、結果は嘘をつかないので、どうにか対策したいと思います。
よく見ると、左右でライトで照らしている範囲の直径が違っています。原因はこれかもしれません。
◆ センサーの補正機能
問題点を対策して、さらにセンサーの値を表示するプログラムを作ってみました(trace1.ev3)。
対策として「センサーの補正機能」を追加しました。 最初に左右のセンサーの差を記憶して「center」という変数に代入します。これが中心値となります。これ以降にセンサーを測定するとcenterの値を差し引いて、測定結果を補正します。
センサーの値は「(左側のセンサー値)-(右側のセンサー値)」で求めます。センサーの値を差で見るようにします。こうすると周辺の明かりの強さに影響されずにラインを検出できます。
プログラムの実行結果です。
ラインの中心にロボットを置いて、プログラムを実行します。
手作業でラインの上にセンサーを置いてみました。 改良した副作用として、センサーのピーク時の値が左右で不ぞろいになってしまいました。本当はさらに補正の処理が必要ですが、プログラムが複雑になるので、このままにします。
◆ センサーが比例しているか確認
ここからが本題です。
ライントレースロボットでは比例制御を行ってラインを追跡します。ここで、センサーの値がきちんと位置に対して比例していないと、かなりウソっぽい比例制御になってしまいます。
そこで、ロボットの位置に対してセンサーの測定値が比例しているかどうかを確認してみたいとおもいます。検証のためのプログラムを作ります(trace2.ev3)。この連載ではロボット作りの問題解決として常に「見える化」をオススメしています。
先ほどのプログラムでは手作業でロボットを動かしていましたが、ここではその場旋回をさせて動かします。ロボットの位置は回転センサーの値から計算します。 こうしてグラフに描くという仕組みです。
ロボットをラインの上に乗せた状態でプログラムを実行します。
まず、ロボットが反時計方向に45度旋回します。そして、測定を開始します。測定中は時計方向に90度旋回します。
その場旋回しているので、ロボットはラインの上に乗ったままです。
これでグラフが作成されました。X軸は「ロボットの向き」です。単位は角度。範囲は-45度~+45度です。画面の中心を0度に合わせています。
Y軸は「カラーセンサーの値」です。左右のセンサーの差分を求めています。 1ピクセルが1%に相当します。画面の中心を0%としています。値がマイナスの場合はロボットがラインより右に位置します。値がプラスの場合はロボットがラインより左に位置します。
値が比例しているかを検証してみます。
見たところ、ロボットの向きが-13度~+13度くらいならばセンサーの値は比例しているようです。ここまでは値を信頼できる範囲となります。
それ以外の角度ではセンサーの値は信頼できません。 つまり、左右のセンサーのどちらか一方がラインから出てしまうと正しくトレースできないということになります。見える化によって新たな事実が分かりました。
◆ 比例制御のライントレース
最後にライントレースのプログラムを作ってみました(trace3.ev3)。
センサーの値をそのまま左右のモーターのパワーに割り振っています。センサーの値が0から離れるほどパワーの変化量も大きくなります。これが比例制御です。
ラインの中心にロボットを置いて実行します。 30秒間走ったら自動的に止まります。 ロボットがガクガクせず、なめらかにラインを追跡している点に注目です。比例制御の特徴です。
極限までプログラムをシンプルにしましたので、コースアウトしやすいかもしれません。 コースアウトを防ぐにはセンサーの値を掛け算で大きくして、パワーの変化量を増やしましょう。 パワー全体を底上げすると、ロボットの移動速度も上がります。
[movie]ライントレースのプログラムの実行結果(Youtube)
[DOWNLOAD]今回作成したプログラム(教育版EV3ソフトウェア用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。