「ビュート」ステップアップ講座2 ライン位置の計算

スムーズなライントレースのためには、ロボットがラインからどれだけずれているかを細かく得ることが必要です。本講座では2個以上のセンサーを横一列に並べて設置し、これらを使ってラインの位置を計算する方法について説明します。

後々便利なように、ラインの位置と各々のセンサーの位置はいずれも、センサー群の中心を原点として右を正とする1次元の座標で表します。ラインの位置といいましたが、これはいわば「センサー群のなす直線と、ラインの交点」の位置であって、ラインが右に向かって伸びているのか、左に向かって伸びているのかは無視します。

複数のセンサー値からライン位置を計算するための一つの簡易的方法として、正規化したセンサー値に比例した質量の仮想的な「おもり」が各センサーの位置に乗っていると考え、そのときの重心を考えます。例えば2個のセンサーが-1.0cm、1.0cmの位置にあり、それぞれ0.6、0.3という値が出ているとします。仮想的なおもりを載せた時の重心の位置は

((-1.0)*0.6+1.0*0.3)/(0.6+0.3)

-0.33cmの位置です。この重心をラインの位置と見なします。実際には必ずしも一致しませんが、ある程度滑らかに変化すればよしとします。理由は次回以降説明します。

一般化して書くと次のようになります。高校物理の力学で出てくる重心の式です。なお分母が零になる場合も考えられますが、これはすべてのセンサーがラインから外れている状態で、別処理が必要なので本講座では扱いません。

(\sum^N_{k=1}p_ks_k)/(\sum^N_{k=1}s_k)

N
センサーの個数
p_k
k番目センサーの位置
s_k
k番目センサーの正規化後の値

サンプルプログラム

センサー2個用と4個用を用意しました。2個の場合はAN1とAN2に、4個の場合はAN1から4に赤外線センサーを接続して使用します。赤外線センサーは一列に番号順に並べてロボットに取り付けます。間隔は隣り合う2個が同時にラインを検知できる程度まで狭くします。センサーの検知範囲は地面からの高さによって変化するので、結果を見ながら調節してください。

アンカー(リンクの文字列)を右クリック→ファイルに保存して使用してください。

使い方

まず前回同様、センサー調整を行います。センサー全部を黒い線の上に載せてスペースキーを押し、続いてセンサー全部を白い床の上に移動させてスペースキーを押します。この後何かキーを押すと、4個または2個の正規化センサー値と、上記の式により求めたライン位置が表示されます。

 0.13  0.92 : 0.76
0.15  0.97 : 0.73
0.23  0.92 : 0.60

なお、上の説明ではセンサーおよびラインの位置にセンチメートルという単位を使いましたが、実際のセンサーの物理的な位置は本講座のライントレースでは使いません。そのためセンサーの幅を正確に測定してプログラムに反映させる必要はありません。サンプルプログラムでは左右の端にあるセンサーの位置を-1.0および1.0としています。

値を見ながらロボットを回転させてライン位置が零になるようにしてみてください。ロボットを見ると、センサーの真ん中がラインの上に載っているはずです。次回はこの動作をロボットに自動で行わせます。

山口辰久

Valid HTML 4.01! Valid CSS!