inventorでライントレース(入門編)

inventorはLEGO社のロボットキットです。反射光(センサーから当てた光の反射量)の強さを読み取れるカラーセンサーがありますし、モーターもかなり細かく制御できる上、ロボット本体が軽く、何よりLEGOなので形を自由に作り放題ということで、色々なロボット作りに使えます。

ライントレースとは

今回は、inventorを使って、黒い線に沿って進むロボットを作ってみます。この線に沿って進むことをライントレースと言います。Youtubeなどで調べると、かなり高性能なライントレースをしている動画を見つけられると思います。

Youtubeにも解説動画をアップしています。

動きをご覧いただくとわかりやすいと思います。

ライントレースの利用価値

黒い線に沿って進む、という動作はロボット競技では基本テクニックになっていたり、他にも色々な仕事ができるロボットや、例えば人を誘導するようなロボットを作る時に、活用できたりします。つまり、「線に沿って動く」という動作をどう活用するかで、ロボットの性能や必要な機能、できることが大きく変わってきます。

ここで扱う内容

  • ロボットの形は最低限のもの
  • 制御はOn-Off制御と比例制御

車を作る

タイヤとキャスター

今回使う車型のロボットです。駆動用のタイヤが二つ。キャスターとして支える部分を二つ使っています。(キャスターは、ロボットの形状次第では一つでも可能です)

前から
後ろから

普通の車の様に4つのタイヤを前後につけてしまうと、タイヤがひっかかることで細かな回転が難しくなるため、ロボットの駆動にはこのような形状にすることが多いです。(ディファレンシャルギアで解決できるかと思いますが、作るのが大変なのと、ロボットが少し大きくなる割に、キャスターより良くなることはあまり無いので採用しません。)

Spikeだと、軽いキャスターが付いているのでそれを取り付けた方が良いと思います。

カラーセンサーの取り付け位置

カラーセンサーは駆動輪より前につけます。取り付ける位置に関しても意味がありますが、一旦無難な位置につけることにします。また、カラーセンサーの個数でできることが変わってきますが、今回は一つだけとします。

カラーセンサーは前後の位置の他、高さも大切です。反射光の差が一番大きくなるところにつけるようにします。黒は反射が少なく、白は反射が大きくなるので、コース上の白や黒い場所に光を当てながらカラーセンサーの高さを確認します。

また、会場や地面の素材などでも変わってくるので、ここに乗ってる数値は当てにしない方が良いです。

とりあえずでつけた形

明るいところの測定

明るいところを読み取る
反射光が85%

白などの明るい色は、光をたくさん反射しているので、反射光の値が大きくなります。値が小さすぎる場合は離しすぎて反射光を測定できなくなっているかもしれません。値が99%の場合は、近すぎることがあります。

暗いところの測定

暗いところを読み取る
反射光が8%

黒は光を吸収しやすい色なので、反射光の値は小さくなります。小さくならない場合は、近づけ過ぎかもしれません。

プログラミングの前に

ライントレースをする前に、inventorやspikeのプログラムについての注意点があります。

移動ブロックにはスピードで移動パワーで移動の2種類のブロックがあります。

わかりにくいところですが、スピードで指定すると、そのスピードを維持する様に内部で調整が入るようで、ライントレースの様な細かく移動速度が変わる制御には遅れが出るようで向いてない様です。

スピードとパワーの違い

反対に、スピード差を使って綺麗に曲がらせたい時にパワーを指定すると、地面の摩擦などでタイヤが思ったスピードにならないようで安定しないことがあります。つまり、ターンにはスピードを使った方が安定するようです。

高性能な反面、少しわかりにくくなっていますね。inventorやspike以外の開発環境では、ここまで考えなくても良いと思います。

(無調整のターンは信頼できないということに繋がりそうですが)

On-Off制御

On-Off制御は一番簡単なライントレースの制御方法です。右に進む時と左に進む時の条件を決めてジグザグに線の上を走る様な動きになります。

白と黒で動きを区別する

カラーセンサーが白と読み取っている時は右、黒と読み取っている時は左に曲がるようにすると、ジグザグに進んでいくようになります。

On-Off制御のプログラム

こちらの方がすっきりしています

どちらも同じ様なプログラムですが、「もし〜でなければ」で囲っておいた方が見た目が良いと思います。実際の動きは見た感じでわかるほどの差は出ません。

反射光で区別する

白と黒でも構いませんが、反射光で明るい時と暗い時に分けても対応できます。これより高度な制御は基本的に反射光で計算するので、反射光に慣れておく方が良いと思います。

反射光をしきい値にするプログラム

反射光の境目をを「しきい値」と呼びます。

しきい値は低くしすぎると、黒い線を見つけにくくなり、高くしすぎると黒では無いところで反応してしまう(タイヤ痕など)ことがあります。

明るいところと暗いところの中間くらいが無難で、黒い線を通り過ぎて脱線する時は少ししきい値を上げて、早く暗いと反応させてみるような調整ができます。

条件を逆にすると

今回使っているライントレースの制御では黒と白の境目を軸にして移動する制御になります。つまり、黒い線の中心を走っているわけではありません。サンプルは黒い線の左側を走るプログラムになっています。

(あえてカラーセンサーの位置を線の太さの半分だけずらして、車は線の中心を走らせることもできますが)

白と黒や明るさの条件を逆にしたり、曲がる方向を逆にすると、線に対しての動きが逆になります。その結果、線に対して左側をライントレースするか、右側をライントレースするかを変更できます。

サンプルのようなコースでも外側と内側でタイムが若干変わったりしますし、直線でもその後のターンのしやすさや、T字路に邪魔されたり避けたりでき、細かなところで差が出てきます。

On-Off制御のまとめ

白と黒、もしくは明るいか暗いかで条件を分け、右に行くか左に行くかを条件に合わせてつくることで、ジグザグに揺れながらライントレースができる方法です。

メリットは、とにかく作るのが簡単で、原理もわかりやすいことです。初めてライントレースに挑戦する時にはここからループや条件分岐について学ぶのが良いと思います。

デメリットは、ジグザグに進むので、移動距離が増えてしまうことと、止まった時の姿勢が安定しないことです。

比例制御

On-Off制御で使っていた反射光を元に、しきい値(線の境目)からどの程度離れているかを曲がる強さに比例させて制御する方法です。

しきい値から離れているほど曲がりが強くなり、しきい値に近い時に曲がりが緩やかになり、線に合わせやすくなります。

比例制御のプログラム

基本的には制御の強さをパワーに対して増減させることで実現できます。

要素を文章化するため変数を使っていますが、そのままの値を代入しても問題ありません。

比例制御の基本形

このままでも動きますが、カラーセンサーの反射光の数値の変わり具合が大きいため、パワーの差も大きくなってしまい、揺れがかなり大きくなってしまいます。つまり、車が少し動いただけで大きく揺れて戻ろうとしてまたずれるということを繰り返すことになり、比例制御の良さがなくなってしまいます。

係数で揺れの強さを調整する

比例制御では、(専門的には)「ゲイン」と呼ばれる調整のための係数をかけて最終的な制御値にします。

授業では比例係数や単に係数と呼んでいます。この係数を1より小さい数にすることで、計算結果を小さくでき、速度差を抑えることができます。

係数をかけて調整できるようにしたプログラム

係数を小さくするほど揺れは小さくなりますが、強いカーブには対応できなくなり、スタート時に線からずれている時の復帰力が弱くなります。

ライントレースの調整の考え方

調整は目的によって大きく変わりますが、基本的に最優先事項は脱線せずに目的地まで移動することになることが一般的です。その次にタイムの改善になります。

ライントレースは左右に揺れることで線の変化を見つけるため、変化が多い環境であるほど揺れを強くしておかないと脱線する可能性が高くなります。しかし、ずっと揺れが強いままではタイムも悪くなり、何かを持っているとそれを振り落としてしまうかもしれませんし、揺れが強過ぎて反対側にコースアウトすることもあります。

  • できる限り揺れないようにする
  • でも、コースアウトは絶対にしない

このバランスをとることが大切ですが、荷物を取る直前など、タイムを犠牲にしてでも揺れを抑えた方が良い場面もあります。

揺れを抑える方法

ライントレースの揺れは

  • パワーを落とす
  • 速度差を無くす

この2点で調整できます。

パワーは単純に早く動く方のパワーを落とせば実現できます。

On-Off制御の場合

基準のパワーに近い制御
遅くして揺れを抑える

このように数字を減らすだけでも全体の動きが遅くなることで揺れが小さくなります。ゆっくり動くことで丁寧に線が読み取れるようになるため、安定しますが、タイムは確実に遅くなります。

対して、次のプログラムのように速度差を小さくすることで、速さを維持したまま揺れを弱くできます。

このやり方は速度が早く揺れが小さいことから、急なカーブに対応できなかったり、線を跨いで反対側に抜けてしまうことがあります。

速度差を減らして揺れを抑える

On-Off制御の調整は、よほどタイヤでの移動(特に旋回)に慣れていないと、難しい内容になります。その割に、精度の高い制御では無いので、使い所が難しい感じになります。

比例制御の場合

On-Off制御に比べて、パワーはそのまま調整できます。また速度差(曲がる強さ)は係数を小さくすることで調整できます。

パワーを上げて係数を小さく(直線に強い)
パワーを下げて係数を大きく(急なカーブに強い)

パワーを上げて係数を小さくすることで直線に強い制御、パワーを下げて係数を大きくすることでタイムは落ちますが急なカーブに強い制御になります。プログラムの意味が理解できていると、制御のイメージはしやすいと思います。

途中で切り替える

単調なコースであれば一回数値を決めれば対応できますが、直線が続いたり、カーブが連続したりするコースでは途中でライントレースを切り替えると効果的に制御できます。

簡単な方法は秒数で管理、少し高度にするならモーターの回転数で制御などが可能です。

タイマーを使うことで、秒数で管理できます。時間で管理する場合、速さが変わると移動距離が変わってしまうので、調整をし直すたびにタイマーの条件も変わってしまうことです。

時間で切り替えるライントレース

モーターの回転も同じようなプログラムで作ることができますが、相対位置は角度になるので、360をかけていることと、測定するモーターを逆にすると、角度が減っていくので条件を満たさなくなります。

モーターの回転数で切り替えるライントレース

特に目印がない場合に使える方法としては上記の2点ほどになりますが、目印があるときはそれを活用する方がより確実です。

まとめ

線に沿って進むライントレースの制御としてOn-Off制御と比例制御について説明しました。

On-Off制御

白か黒、もしくは明るいか暗いかを判断して、右か左に行く方向を決めてジグザグに進む制御です。簡単に作れますが、調整が難しく、コースの変化には弱いという欠点があります。

比例制御

目標のしきい値とのズレの大きさを曲がる強さに比例させる制御です。そのままでは曲がる力が強くなるので、1より小さい数を係数として制御値にかけて調整します。状況に応じて制御の強さが変わるのでOn-Off制御と比べて変化に強く、直線では徐々に線に近づき綺麗に進める制御です。

どっちを使う?

使いこなせるのであれば、比例制御で制御した方が綺麗に走るところまで調整できますが、カーブが強すぎる場合は、On-Off制御の方が簡単にクリアできることもあります。大事なのは、ちゃんとメリットとデメリットを理解した上で使い分けられることだと思います。

高度な制御について

比例制御は、微分制御と積分制御を合わせたPID制御につながっていきます。当然原理は難しくなりますが、複雑なコースでもより正確により早く動かすことができるようになるため、ロボット競技の上位のチームはこの辺を使ってくることもあるそうです。

それぞれの意味が分かっていれば、それほどプログラムは難しく無いので、どこかでまた説明できればと考えていますし、PID制御の考え方に関しては、長くなりますが、倒立振子を使って解説している動画を作っています。

AIカメラを使って人工知能を使ってライントレースをするという方法もあるようですが、これに関しては、今のところは取り扱わないと思います。

(エキスパートコースで挑戦したい子が出れば準備します。)

以上になります。

ライントレースは、ロボット制御では基本的なテクニックとして使えるようになっておく項目に挙げられると思いますが、原理を正しく理解して制御の仕方を考えるという練習は難しいです。なんとなく作っても勝手にうまく進んでくれることが原因の一つだと思っていますが、年齢的にも数字の変化を追うのが難しいというのもあると思います。

それでも使っているうちになんとなく分かって使えるようになってくるというのも、年齢特有の良いところではあると思います。プログラミング全般に言えることですが、初めて触った時に完全に理解できていなくても構いません。まずは動かしてみてどんなことができるのか考えて、何かを見て作っても良いので慣れていくことで身につくこともあります。

まずは色々と数値を変えて動かしてみることが習得のコツだと思います。

体験授業を実施中です

枚方ロボットプログラミング学習塾では無料で体験授業を実施しております。

興味を持たれた方はお気軽にお申し込みください。事前の問い合わせも可能です。

メール(info@hrktrpg.com)への問合せもお待ちしております。