正確に曲がるためプログラム
前ページに書いたようなさまざまな問題の中で、回転の精度を上げる方法をFLL2006のスペースエレベータのミッションを例にして紹介しよう。
始めにスペースエレベータのミッションの走行図を図2(1)に示す。まずスタート位置からスタートする。目的物であるエレベータに対して、ロボットが正面から相対してクリアするように設計されており、その結果回転位置Aで正確に曲がることが重要になる。回転位置からさらに約10cm進んで、目的物と相対する。ここで相対したときの左右の許容誤差は約±1cmである。車幅6cmを使っての回転であるから、回転時点での許容誤差は距離で言うと以下のようになる。
±1cm×(6cm/10cm)=±0.6cm
回転半径6cmであるから角度で言うと以下のようになる。
360°÷(6cm×2×3.14÷(±0.6cm))=5.7°
実際に回転する角度は左に約60°なので、誤差は1割程度しか許されない。
図2(2)にこの位置Aで曲がるためのプログラムを示す。このプログラムは実際に中三のメンバーの作ったものである。
(画像をクリックすると別ウィンドウに拡大図を表示します)
行き過ぎた部分を補正を行う
図2(2)の動作は大きく3つにわかれる。まず(a)〜(f)は最初に大きく回転を行う動作である。この回転は前ページに書いたように片方のモータ(ここでは右側のモーター(a))を大きく、逆側のモーター(ここでは左側のモーターC)を逆方向に弱く回して軸として機能するようにし、車幅分を回転半径として利用する方法である。それに対し、補正をするのが(g)〜(l)と(m)〜(r)の部分であり、まず(g)〜(l)において回転させる方のモーターに対する補正、(m)〜(r)が軸となる方のモーターの補正を行っているものである。
まず(a)ではモーターAについている回転センサ1とモーターCについている回転センサ3の初期化を行っている。次に(b)では赤いコンテナと呼ばれる変数を0に設定している。
そして(c)においてモーターAを正方向にレベル5で駆動し、モーターCを逆方向にレベル1.5で駆動し、回転を始める。回転は(d)で表現されるループの条件が満たされるまで続けられ、ここでは回転センサ1と3の双方の合計が12になるまで続けられる。理想的にはモーターA側の回転センサが12進み、モーターC側の回転センサ3は動かないことが目標である。
一旦ループの条件が満たされたなら、(e)でモーターを止め、(f)で300ms待って完全にモーターが停止するまで待つ。実際には(e)と(f)の間でも余分に進んでしまう。しかもこの量が電池電圧によって変化する。
(g)からはモーターA側の補正プログラムであり、本来の動くべき回転センサの量12を赤いコンテナの変数入れる。次に(h)においてこの理想の量である12と実際に動いた回転センサ1の量を減算して差を求める。(i)においてこれが正か負かを判定し、正ならばまだ回転が足りなかったということで(j)を実行し、負ならば行き過ぎたということで(k)へ行き、その差分だけ補正する。そして(l)ではその補正のモーターの止まるのを300ms待つ。
(m)からはモーターC側の補正プログラムである。C側を軸として回転するから、理想的には回転センサの動く量は0であるべきとなる。従ってこの理想の量0を青いコンテナの変数に代入する。次に(n)においてこの理想の量である0と実際に動いた回転センサ3の量を減算して差を求める。
そしてモーターAと同様に(o)において正か負かを判定し、それぞれに応じて逆方向に補正すべく(p)あるいは(q)にて逆方向にモーターを動かす。最後に(r)でモーターの止まるのを300ms待つ。
このようにして、動かす側、軸とする側双方の補正をすることにより、目的とする精度で曲がることができるようになった。なお、このプログラムは汎用的に使えるが、細かいパラメータはロボットの重さや重心によって当然細かなチューニングが必要になってくる。 次のページ