タスクを並行処理してロボットを制御する
3つ以上の値で走行を切り替える
前回の実験を通じて、モーターの制御方法には「P動作、I動作、D動作」があることがわかりました。今度は、2輪倒立振子の走行に適用してみましょう。
「ON/OFF制御」では、いつまでたっても目標値に近づくことができず、ふらふらして安定性が悪いですし、滑らかな走りにしようとするとカーブを曲がりきれなくなってしまうという問題がありました。これに対して、「PID(動作)」の考え方を取り入れると、ふらふらしにくくなると共に、走行速度を上げることもできそうです。
光センサーでコースの状態を計測する
まずは、どのような値を目標値にすれば良いかを考える必要があります。コースの状態を光センサーで計測してみましょう。次の図1は、光センサーを白から黒へ、黒から白へと動かして、光センサーが取得する値を計測した結果のグラフとその計測方法のイメージ図です。
測定値を安定させるため、地面からの距離を10mmにして計測しました。このグラフを見ると、白地に黒い線が引いてあるコースには、白の値と黒の値だけではなく、その間の値も存在することがわかります。ON/OFF制御では、これを強制的に白か黒に割り振っていたわけです。
図1:コース状態の計測結果 |
図2:コース状態の計測方法 |
ロボットにP動作を組み込んでみよう
ラインから大きくはずれたらモーター回転パラメータをその分だけ大きく戻し、ラインから小さくはずれたら、その分だけ小さく戻す様にしましょう。これはP動作を組み込んでいることを意味します。目標値はラインのエッジ部分の明るさの値です。
図3:光センサーの値とモーターパラメータの関係(P動作) |
プログラムは、こちらからダウンロードできます。
ダウンロードが完了したら、zipファイルを解凍して、フォルダ内にあるRunnerThinkIT_v2_Pフォルダを、前回作成したRunnerというフォルダの配下にコピーしてください。
※サンプルプログラムに設定されている、目標となる明るさは、ロボットが走る環境によって異なりますので、各自調整してください。
ロボットの動き
ON/OFF制御のプログラムからの変更点は、現在のコースの状態をLineMonitorUnitの役割として数値で取得できるようにしたところです。振る舞いにつけていたメソッド名は「オンラインか?」(ライン上か否か)という名前でしたが、このメソッドの役割が変わったことに合わせて「ラインの値を示す」という名前に変えた方が良さそうです。
次に、Tracerの「ライントレースする」という振る舞いの中身をP動作のアルゴリズムに変更しました。
これらの修正をしても、クラス図や、ステートマシン図には、それほど影響がありません。これらの図では駆動系を「使う」ところまでしか設計できておらず、駆動系がモーターをどのように使って制御するのかについては記述していなかったからです。逆に、この点を設計書に表現するということは、前回の実験において得られたことを設計書に反映する必要があることを意味しています。
2つの走り方の違いをもう一度見ておきましょう。P動作を取り入れるだけで走りはかなり変わりました。
ON/OFF 制御の走り方
P動作の走り方
P動作を2輪倒立振子ロボットのライントレース方法に活用してみました。本連載のサンプルプログラムは、前に進むスピードを遅めに設定してありますので、駆動系のパラメータを変更することでもう少しスピードを上げられると思います。P動作の定数も実験して調整してみてください。また、I動作やD動作を組み合わせてより滑らかな制御を目指してみてください。