2018年10月31日水曜日

コース記録

ロボトレース、コース記録や加減速走行について結構悩んでる人が多いようなので、よく採られているアプローチを簡単に紹介しようかと思います。

---------
まず、現在加減速走行をしているロボットの大半は走行計画=速度計画を立てている感じだと思います。つまり、コース上のどこでどれだけの速度を出すかを決めるための情報を1回目の走行で取ればいいというわけです。

探索走行でマシンが取れるデータは主に、エンコーダから出した距離や速度、ジャイロセンサから取得した角速度や角度などになると思います。(ちなみにジャイロを積んでいなくても、左右のモータにそれぞれエンコーダをつけていれば回転差から角度や角速度は取れます)

では、コースに対してそれらデータをどのように保持して、どのように使えば加速減速する走行ができるのか。
現在よく使われているデータの代表的な記録方法は以下の二つです。

①マーカーを取得したときの距離、角度を記録する
②一定距離ごとに角速度を記録する

それぞれの手法と速度決定について簡単に説明します。

--

①マーカーを取得したときの距離、角度を記録する

こっちは比較的お手軽な手法。
 ロボトレースでは曲率変化点にマーカーがあります。つまりカーブするところや直線になるところがマーカーで区切られており、マーカーとマーカーの間の区間で車体がどれだけ曲がったかという情報から、その区間で出す速度を決めることができます。

「どれだけ曲がったか」という情報は、曲率(R10とかR20とか)で決めている人が多い印象です。曲率は区間の距離L(cm)と角度θ(deg)を使って、外周=2π*Rの関係からR=(L*360)/(2π*θ)で簡単に求められます。

マーカーごと距離と角度を記録し、区間ごとの曲率を求め記録しておくことで、区間ごとに曲率に応じた速度を決められます。速度の決め方は、R10くらいなら1m/s、R20くらいなら1.3m/s、…という感じで曲率ごとに速度を手打ちで決める方法が一番お手軽です。面倒臭いなら曲率に応じてマシンに自動決定してもらうようにしても面白いかもしれません。

ここまでこれば、あとはマーカーを読むたびに目標速度を切り替えて走るだけで加減速走行が行えます。ただし、次の区画の速度が今の速度よりも遅い場合は、次のマーカーを読む前に減速を行う必要があります。これは、どれだけの加速度で減速するかを決めておけば、高校物理の等加速度運動の式から減速を開始する位置を計算できます。


この方法のメリットは
メモリ使用量が少ない
 マーカーごとに数個の情報を記録するだけなので、メモリが数kBしかないようなマイコンでも普通に使える
コースデータが確認しやすい
 マーカーごとにしか情報を記録しないので、データが少なく済む。何が起こったか確認しやすい
多少のタイヤ空転を許容できる
 区間内で少々滑っても、次のマーカーを無事拾えればそこで距離を補正できるため、マーカーが拾える範囲であれば多少の無理はさせても大丈夫なことが多い
直線ショートカットがやりやすい
 マーカーごと情報から、マーカー位置ごとの車体の位置がなんとなくわかるので、直線と直線の間にある小さなコーナーをショートカットするといったことがやりやすい

デメリットは
マーカーを読み間違ったら終了
 マーカーを頼りに走るため、マーカーを1度でも読み間違ったら基本的には吹っ飛ぶ。上位者でも結構読み間違って吹っ飛んでる。そのため、マーカーを確実に取れるマシン設計をする、または加減速走行時にマーカーを読み飛ばしても検知してある程度復帰できるようにするといった工夫が必要になる。
細かい区間が連続すると危険
 細かい区間が多いと正確にRが測れず大き目のRだと判断されてしまったり、小さい直線のような区間が連続したあとに急なコーナーがあると減速しきれずに曲がれないといったことが起こるため、対策が必要。
曲がる方向で差異が生じる
 右コーナーではマーカが外側、左コーナーではマーカが内側にあるため、マーカーセンサの位置次第では右と左で取れる情報が異なってしまう。大体は気にならない程度だが、場合によっては左右の曲率判定の時に若干バイアスをかけるといった工夫が必要になる。


比較的お手軽な方法ではありますが、使いこなせば十分に上位に食い込める手法です。
角度と距離だけではなく、最大角速度、平均角速度、加速度センサのデータ等をマーカー情報に付与しておけば、色々工夫の余地もあるかと思います。


---

②一定距離ごとに角速度を記録する

マーカー利用よりも単純なではあるものの、メモリを大量に消費する手法。走らせる難易度は若干高い。

エンコーダで距離を計測しつつ、一定距離(例えば1cm)進んだらその時点での角速度を記録する。記録した角速度に対し、1点1点速度を決定する。たったそれだけ。

速度決定は、記録走行時の速度と加速度から旋回半径Rを求め、Rの大きさ対して速度を決定するか、等速円運動の加速度の式から加速度を拘束することで速度を決定するといった方法がとれます。

あとは加減速走行のときに1cmごとに速度を読み出していくだけで加速減速が行えます。ただし、このままの状態だとコーナー付近で急激に速度が変化するためおそらくマシンでは加速や減速しきれないといったことが起こります。そのため、マシンが加速減速できる範囲の速度変化をするように速度を書き換える必要があります。これはマシンの加速度を設定して、マシンが加速して記録されている速度を出せるのかを順に追って見ていき、無理ならばそこの速度を加速できる範囲に落とすといったことを行えばOKです。

やることはこれだけです。


これのメリットは
アルゴリズムが単純
 一定距離ごとに記録し、記録したところ毎に速度計算し、走行時に速度を再生する。それだけ。コードもかなり短く書ける。
マーカーに頼らず加速減速できる
 マーカーを読んでから加速~という感じではなくコーナー途中で加速し始めるのでなめらかに加速。無駄が少ない。
マーカーを比較的柔軟に使える
 全マーカーを読む必要がないので、必要なマーカーだけ利用するといったことが可能。

デメリットは
膨大な量のメモリを消費する
 角速度記録だけでも最低で数十kBから場合によっては数百キロバイトレベルのメモリが必要。別の情報も記録しようとするととてつもない量のメモリが必要になる。不揮発メモリに保存するのも一苦労。
情報が膨大になる
 コース情報一つ見るためにもかなり長い時間かけてPCにデータを転送しなくてはならなくなる。最低でもグラフ化しないとデータまともに読めない。また、マシンに乗せたディスプレイでコースデータを確認することが難しくなる。コース情報が多いため、それを使ってマシン内で何か処理を行おうとするとかなり重い。 
局所的な調整がしにくい
 マーカー読みのときはR○○の時に曲がれないから速度落とすといったことが可能だが、この手法だと細かい距離ごとに速度が決まっているため、そういったことがやりづらい。上手くやらないとネックとなる部分に合わせて全体の速度が決めなければならないので速度が上げにくくなってしまったりする。
段差等で跳ねると計画速度が一気に落ちる
 段差等で一瞬大きな角速度が出てしまうと直線途中で減速をしたりする等が発生する。フィルタ等でこれを上手く除去しなければいけない。
慎重にコースデータを取る必要がある
 マーカーベースの手法は、マーカーを取った時点で姿勢が正しければいいので結構ラフに走っても大丈夫ですが、この手法では綺麗に制御してできるだけコースをなめらかに走って記録しなければ加減速走行時に速度計画が上手くいかずロスが発生します。


データ量が多く処理が重くなったり、高価なマイコンが必要であったり、調整が慣れていないと結構面倒くさかったりと、そこそこやりにくい要素はありますが、単純で無駄の少ない速い走行がしやすいためなかなか強力な方法です。最近はメモリが大きいマイコンが多いためそのうちこっちが主流になりそうだなぁ~といった感じがします。

-----
大体こんな感じです。

あくまでここに書いたのは良く使われている方法というだけで、すべてではありません。現に、今トップのほうを走っているトレーサーはどれもこれらの手法をベースにオリジナルのアレンジを加えた手法をとっているマシンがほとんどです。

また、完全に違う手法もまだまだたくさんあると思います。
・完全にマーカーを見ないで走る
・マシンが走った座標を記録して、座標ベースで加減速走行をする
・そもそも走行経路まで計画している
なんていうマシンもちょこちょこ出てきています。

ロボトレースはマイクロマウスと違いまだまだ王道のような手法が確立されていないため、是非色々試して速い、面白い走行方法を探してみてください。
その手助けとなれば幸いです。


文字だらけで見難くなってしまったので、そのうち気力があったら図とか追加しときます。
あとblogger結構段下げとか見つからないし使いにくいなって思った。