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

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

BLOG 社員ブログ

2016年09月

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ロボコンのモデル又はプログラムを作成した結果については(株)アイズ・ソフトウェアは一切の責任を負いません。使用はご自身の責任で行ってください。