2024年11月18日

004-4.アルゴリズム入門-第4回「信頼性の高いライントレースロボット」

「アルゴリズム」とは英語で書くと「Algorithm」、プログラムにおける「考え方」を表した言葉です。
この連載では、ロボットのプログラミングの中で、アルゴリズムを活用する方法を紹介していきたいと思います。(文/松原拓也)

◆ 高機能なライントレースロボットを作る

写真のライントレースロボットを作ってみました。光センサ2個とモータ2個、そしてインテリジェントブロックを使っています。
今回作るライントレースロボットには、次の目標をかかげてみたいと思います。
・「調整なしで走ること」:光センサのしきい値の設定が不要で、いきなり床面に置いてもちゃんとラインを走れるものにする。
・「できるだけコースアウトさせない」:ラインが途切れてても前進するようにする。ロボットが数cm外れていても、ラインに復帰できるようにする。
・「あまりジグザグに走らない」:なめらか、かつスピーディに走らせます。

、、、目標は以上です。この目標を満たすようにプログラムを考えていきます。

裏側の写真です。今回のロボットは小まわりの良さが求められるので、インテリジェントブロックを前に取り付けています。重心をタイヤの下にもってくるためです。
光センサの先端は床面に対して1cmくらいの高さになるようにします。

裏側の写真、その2です。手前に写ってる車輪はキャスターです。

センサ類は次のように接続しました。
・入力ポート1=光センサ(右)
・入力ポート4=光センサ(左)
・出力ポートA=モータ(右)
・出力ポートC=モータ(左)
モータはプラス方向に回転させると、前進します。

◆ ラインの位置の読み取り

ラインの位置を読み取るだけのテストプログラムから作ってみました。
[Download]ライン位置表示プログラム(NXTソフトウェア2.0で作成)

光センサを写真のようにラインの間に置きます。 2つの光センサは両方とも白色を読み取っています。

センサの取り付けは、いくつかの方法があります。上の図のように、白と黒のギリギリの位置に取り付けたほうが、反応がいいのですが、これだと読みとれる幅が狭くなってしまいます。
今回はできるだけ幅を広く読み取りたいので、下の図のように取り付けています。

ラインの位置は「(左センサの値)-(右センサの値)」という数式で求めています。たとえば、図の一番上のような場合には値は「0」となるはずです。
図の中央のような場合、値は「マイナス」。図の一番下のような場合、値は「プラス」となります。

プログラムを実行してみました。
画面に「(左センサの値)-(右センサの値)=センサの位置」が表示されます。
しかし、センサを中心に置いても0になってくれません。これはどういうことでしょう?。

どうしてかというと、光センサに個体差があるためです。
左右の光センサが同じ明るさをとらえたとしても、値が同じになるわけではありません。そこで、ソフトウェアの力で調節してあげる必要があるわけです。
(対策方法を次のページで紹介します)

◆ センサの個体差を記憶する

先ほどのプログラムを改造して、中心のセンサ位置の時の値がきちんと「0」になるようにしてみました。
青ワクの部分が追加したブロックです。プログラムを実行した時に誤差を記憶して、その差だけを表示するようにしました。最初にセンサの特性を記憶するので、「調整不要」という目標が果たされています。
[Download]ライン位置表示プログラム改良版(NXTソフトウェア2.0で作成)

誤差を打ち消している部分です。単なる引き算です。先ほどの例だと「-5」が変数の「中心値」に入り、それが引かれることで値は「0」になるはずです。

プログラムを実行してみました。ロボットをラインの中心に置いた状態で、きちんと「0」が表示されました。左右にセンサの位置を動かすと、-28~+28くらいの範囲で値が変動しました。

◆ ジグザグに走らないでラインを追う

前ページのプログラムを改造して、ロボットがラインをトレースできるようにしました。青ワクの部分が改造したところです。
[Download]ライントレースプログラム(NXTソフトウェア2.0で作成)

前半部分の改造点です。「パワー」という変数を追加しました。この変数にはモータの標準的なパワーの値として、「60」を入れておきます。

後半部分の改造点です。先ほどあった「表示ブロック」を取り去って、ラインの位置の数値をモータブロックをつなぎました。ポートAとCのモータは、それぞれプラス/マイナスしたパワーを設定しています。片方のモータがプラスになると、逆のモータはマイナスに転じます。この処理は非常に高速に繰り返すので、ロボットがジグザグに進んでいるようには、あまり見えません。

動きを図で表してみました。ピンク色の矢印が「パワー」、青色の矢印がセンサの位置になります。

プログラムを実行しました。

見事、ラインの上を走ることができました。特に問題は無いように見えますが、移動のスピードがちょっと遅いのと、カーブを少し遠回りしてしまうのが気になるので対策してみましょう。

たとえば、パワーが60で、センサの算出した値が+28だとすると、、、
右モータはパワーは60-28=32、
左モータのパワーは60+28=88、
、、、となります。

次項では、このパワーの変化の幅を大きくしたいと思います。

◆ 100%のパワーで走らせる

先ほどのプログラムを改造してみました。
青ワクの部分が追加したブロックです。
[Download]ライントレースプログラム完成版(NXTソフトウェア2.0で作成)

前半部分には「ゲイン」という変数を追加しました。これで、モータのパワーの変化量が大きくなりました。

ゲインをかけている部分を拡大してみました。計算ブロックと変数ブロックです。仕掛けは単純で、「かけ算」を行っているので、パワーの変化量が増えたわけです。

ロボットの動きを図で表してみました。次の動きが考えられます。
もし、ゲインの値が少ないと、ラインのカーブを曲がり切れません。逆にゲインの値が大きすぎると、直性のラインでジグザグに進んでしまいます。最適なゲインはパワーの大きさやロボット構造によって、左右されてしまいますので、実際に動きをテストして、こまめに設定する必要があります。

それでは、動かしてみましょう。今回、このロボットで調節した場合では、パワー=100、ゲイン=3としました。(ゆっくり走らせる場合にはパワー=75、ゲイン=1.5)。

見事、ラインをトレースしています。前回遅かったスピードは改善されています。ラインが直線時でのパワーが100になるように設定していますので、ソフトウェアでできる最高速度ということになります。

センサを2つ使っているので、ラインが途切れていてもちゃんと走ります。センサの読み取り範囲が広いので、さらに少しくらい脱線していても復帰します。
最初の目標を果たし、申し分ないロボットができました。これ以上早くする場合には、タイヤを大きくするか、ギヤ比を変えるか、ハードウェア的な改造が必要だと思います。

【Movie】プログラム3~4の実行結果のムービー(Youtube)

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