株式会社アイズ・ソフトウェア

/~eyes-software-co-jp/A1A2
お問い合わせ |  情報セキュリティへの取組について情報セキュリティ方針個人情報保護方針) |  ブログ

BLOG 社員ブログ

ETロボコン

ETロボコン技術要素・自己位置推定

ETロボコン・デベロッパーズ部門プライマリークラスは基本的にはコースに引かれたラインをトレースして走る競技です。
ですので、自己位置については1次元的に走った距離がわかっていれば位置がわかります。
しかし、チームアイズでは少しでもタイムを縮めるために、急カーブや複合カーブではラインをはずして走るという戦略をとりました。
最初はバランスコントロールライブラリに渡す"ターン値"を決めて曲がるという事を試しましたがロボットの速度、バッテリー残量等の違いで常に同じ弧を描いて曲がるという事が出来ませんでした。
そして考えたのが仮想の円をライントレースするという方法です。内側が黒、外側が白の仮想の円を描き、そのエッジをPID制御でライントレースして走行させていると考えてください。
この仮想円は中心の座標と半径で決まります。あと、ロボットの座標がわかれば、ロボットが仮想円のエッジ(半径)からの距離が計算できます。この距離を明るさの差分に当てはめ、PID制御でライントレースします。

この案の実現の為、ロボットの自己位置推定処理を実装しました。



ETロボコンのロボットで自己位置推定の為に使用できるのは左右の車輪モーターから取得できる回転角度だけです。
この回転角度より 2πr×(回転角度÷360) で車輪の進んだ距離が算出できます。

ロボットが一定期間の間に図1のように走ったとします。
進んだ距離と曲がった角度を計算する為に、図2のように変形させます。
図2よりロボットを取り除き、計算に必要な記号等を追加したのが図3です。

進んだ距離と曲がった角度は下記の式で計算できます。
   R = Rモーター回転角度×車輪直径×π÷360
   L = Lモーター回転角度×車輪直径×π÷360
   d = (L+R)÷2
   θ= atan((R-L)÷W)

進んだ距離と曲がった角度より新しい座標を求めます。この座標と角度を始点として上記の計算を繰り返して自己位置推定をしています。

自己位置推定の結果をエクセルで座標にプロットしたのが図4です。コースは2010年版のコースです。

クリックでエクセルをダウンロード



図1から図2への変形でわかるとおり、この自己位置推定処理は誤差を含んだ計算となっています。長く走るほど誤差が累積していきます。その為、遠くまで正確にコースを走るにはコースの何らかの印を検出し、位置情報を補正する処理が必要となります。

本ブログの説明はチームアイズのロボットに実装している自己位置推定処理を説明したものです。
本ブログの記載を元にETロボコンのモデル又はプログラムを作成した結果については(株)アイズ・ソフトウェアは一切の責任を負いません。使用はご自身の責任で行ってください。

ETロボコン技術要素・PID制御

私たちが参加しているETロボコン・デベロッパーズ部門プライマリークラスは倒立振子制御で二輪走行するロボットを ラインに沿ってゴールまで走らせる競技です。
さて、ロボットはラインをどの様に見てラインの何処を走っているのでしょう。
ロボットには足元に光センサ(EV3ではカラーセンサ)がついており、これでラインを見ています。

この光センサは明るさしか見ることが出来ません。ロボットが白い部分にいる時は明るい事を示す値。
黒いラインの上にいる時は暗い事を示す値が取れます。白と黒との境にいる時はその中間の値になります。
ロボットはこの白と黒の境を(以降エッジと云います)走ることでライントレースを行います。

一番簡単な走り方はロボットがエッジの明るさより白い色の個所を走っている時にはライン側へハンドルを切り、逆にエッジの明るさより黒い色の個所を走っている時にはラインの外側へハンドルを切って走る方法です。
この様に光センサの明るさで、ハンドルを右左に切るのはON/OFF制御と云います。

でも、ロボットがエッジの上にいる時にはハンドルはまっすぐでいいですよね。
ON/OFF制御を改良して光センサの明るさでハンドルを切る量を調整すれば、エッジの上ではハンドルがまっすぐになります。これを比例制御と云います。

比例制御ではエッジに近づくとハンドルを切る量が小さくなりますが、エッジを超えるまでハンドルは白->黒、または黒->白の方向へ切っています。
車を運転する人は分かると思いますが、これではハンドルを切るのが遅くてラインに沿って走れません。

そこで、エッジから遠ざかったらハンドルを切り増しし、エッジに近づいたらハンドルを逆へ切るようにします。この「エッジに近づいたら」というのは光センサの少し前の明るさと現在の明るさを比べて判断します。これを微分制御といいます。

上記の比例制御と微分制御を組み合わせた制御では、エッジに近づけようとする比例制御とハンドルを逆へ切る微分制御がぶつかり合い、エッジから少し離れたところをトレースする場合があります。
それに対応してエッジに近づけている制御を行う積分制御という制御方式がありますが、チームアイズでは使用していない為、説明は省略します。

ここまでに説明した比例制御(以降P制御)、微分制御(以降D制御)、積分制御(以降I制御)をあわせて一般的にPID制御と呼びます。

チームアイズのロボットは上記のうちのP制御とD制御を使用してライントレース走行を実現しています。I制御についてはエッジから少し離れて走っても問題ないので、採用していません。


◆EV3への実装について
ETロボコンで使用するPID制御プログラムについては省略します。

◆PID制御の実装と調整
ETロボコンのロボットのハンドル制御はロボコン参加者が共通で使用するバランスコントロールライブラリの引数に“ターン値”として設定します。
ターン値は上で説明したPID制御によって求めます。その際、明るさの値をそのままPID制御に掛けて出たターン値でロボットを走らせてもうまく走りません。
明るさの値を適切なターン値を決める為の係数が必要なのです。また、その係数はP制御、D制御にそれぞれ必要です。
さて、EV3のカラーセンサは明るさを0~100の値として出力します。これがそのまま白と黒の値になるわけではありません。
そこで、ロボットが白の上にいるときの光センサの値とラインの上にいるときの光センサの値を事前に調べてみました。
その結果は、黒の時:2、白の時:24 となりました。このときに目標とするエッジの明るさは(黒の明るさ+白の明るさ)/2 = 13 です。
その次に、ロボットをライントレースで走らせて4ms毎に光センサから出力された値のログを取ってみました。その時の値が図1の青線のグラフです。なお、赤線のグラフはターン値です。

図1
このようなグラフを元にP制御の係数とD制御の係数を調整していきます。

私たちがPID制御の係数を調整する時は以下の3点を考慮しています。
1. ターン値が100を超えない事。
2. 走らせてカーブを曲がれる事。曲がりが足りない場合はP制御の係数を大きくする。
3. 走らせてふらふら左右に振れない事。振れる場合はD制御の係数を大きく、P制御の係数を小さくする。

◆EV3での問題点
図1の赤線のグラフは調整途中のターン値ですが、何か変だ、バグじゃないか?と思いませんか?
青矢印の所だけターン値が尖っています。これは何でしょう?
矢印の上、青線まで目線を上げるともうお判りですよね。光センサの明るさ値が変わっている所です。
最初のPID制御の説明を思い出してください、少し前との明るさの差でD制御をしている事を。
ロボットの下の明るさはラインとの距離によってどんどん変わっているはずなのに、明るさの値が5段階しかないので明るさ値の変わった時にしかD制御が行われていないのです。
これではD制御が少ししか掛からず、D制御の係数を調整しても左右のふらつきが消えませんね。
このターン値を求める制御のどこに問題があるのか、これへの対策はどのようにしたらいいのか?は読んでいる方が考えてみてください。


この記事を書いている時点では2016年のETロボコンは終わっていません。
チャンピオンシップ大会が終わった後にその気があったらチームアイズでどのように対策したか等書くかもしれません。期待せずにお待ちください。

本ブログの説明はPID制御とロボットのハンドルの切り方を大雑把に説明したのもです。
本ブログの記載を元にETロボコンのモデル又はプログラムを作成した結果については(株)アイズ・ソフトウェアは一切の責任を負いません。使用はご自身の責任で行ってください。