Udacityで Artificial Intelligence for Roboticsを受けている。
https://www.udacity.com/course/artificial-intelligence-for-robotics-cs373
この講座は、Googleカーの要素技術について学ぶ講座。 講師は、Udacityの創立者にしてGoogleカーの開発者、セバスチャン・スラン氏だ。
lesson5のテーマはPID制御。
この記事では、PID制御の概要を自分なりに整理し、目標とする軌道上をロボットが動くシミュレーション(Homework5.4)問題を書く。
PID制御とは
講義動画
PID制御とは、制御に使われる古典的な手法。P, I, D はそれぞれ、
- P ・・・Propotional(比例)
- I ・・・Integral(積分)
- D ・・・Differential(微分)
を意味している。
今、自動車の制御を考える。目的とする基準軌道(横座標)と、車との距離をCross Track Error(CTE) という。
このときの望ましい制御は、CTEに比例して車のハンドルを切ること。そうすることで、スムーズに基準軌道へと車を近づけることができる。
今回、実験に使ったコードは以下。講義のなかのコードから抜粋した。
P 制御
Pは Propotional(比例)を表す。CTEに比例してハンドルを切る。式で表すと、
$$
steering = - \tau_p ・CTE
$$
厳密には、0 - \tau_p ・CTE としている。この問題設定では、xy座標で考えると、y=0を基準軌道としている。なので、(目標値) - (出力値) において、(目標値)が0となり、マイナス項だけが残る。
これをP制御という。P制御は、CTEが小さくなる、基準軌道に近づくに従って、修正量も比例して小さくなるようになっている。
しかし、P制御には、問題がある。以下の図のように、P制御しようとすると、基準軌道を通り越す(オーバーシュートという)してしまう。基準軌道に近づいては離れを繰り返して、安定しない。
PD制御
そこで、時間tで微分したCTEを式に加える。CTE_DIFFは時刻t-1におけるCTEから時刻tのCTEを引いた値。
$$
steering = - \tau_p ・CTE - \tau_d ・CTE_DIFF
$$
これによって、基準軌道にそった結果が得られた。
これを、PD制御という。
微分項を加えることで、制御の 反応性 が増す。この基準軌道の例では、仮に急激なCTEの減少が起こった場合、下の方にsteerを切りすぎないようにCTE_DIFFの値が大きくなって、オーバーシュートすることを防ぐ。
PID制御
I制御は、理解が曖昧で自分の言葉で説明できるかわからないので、参考にしたサイトの言葉を引用します。
偏差が小さいときに操作量が小さくなり過ぎてしまい、制御量が目標値とずれたところで安定してしまうということです。P制御の制御量は目標値より下側で安定してしまいます。この制御量と目的地の差を「定常偏差」あるいは「オフセット」と呼びます。
これは、例えば、タイヤが少し傾いていて、ハンドルを一定に切っても基準軌道に近づいてくれないようなシチュエーションで発生する。講義では、以下のようなメソッドで10度タイヤをずらすようなことをやっていた。
robot.set_steering_drift(10.0/180.0*pi)
以下は、タイヤがずれた状態でのPD制御。
また引用。
ライントレーサの場合、P制御のパラメータ(Kp)が適正であれば、直線を走っているとき制御量は目標値付近で安定します。しかし、カーブがはじまるとオフセットが発生します。
カーブがはじまったとき、P制御によってその時点ごとの制御量に応じた操作量を決定し、カーブを曲がろうとします。目標値から離れれば離れるほど操作量が上がるP制御ですが、それは長所であると同時に短所にもなります。なぜなら、偏差が小さいと操作量も小さくなり、カーブの最中に偏差0の位置まで戻れず、カーブの外側に寄ってしまうからです。この状態が、目標値と違う場所で安定してしまう“オフセットが発生している状態”です。
オフセットが発生していてもカーブを抜けられればよいのですが、場合によってはコースアウトしてしまうことがあります。では、Kpを大きくし偏差が小さいときの操作量も大きくなるようにしてはどうでしょうか?
こうすることで、オフセットの発生は防げます。しかし、P制御では現在の値しか見ないため、いま直線にいるのか、カーブにいるのかが分かりません。そのため、P制御でせっかく力の抜き方を決めているのにもかかわらず、P制御のパラメータを大きくすると、カーブの間はいいのですが直線に戻っても操作量が大きくなってしまいます。その結果、せっかくオンオフ制御から改善したハンチングが再発する可能性があります。
そこで、「I制御」を用いてカーブにいる間だけ、操作量を上げるようにしましょう。
というわけで(笑)、I制御が必要となってきます。PD制御にIを加えた、最終的なPID制御式は、以下。
$$
steering = - \tau_p ・CTE - \tau_d ・CTE_DIFF - \tau_i ・* int_CTE
$$
$int_CTE$ は、時刻tまでのCTEの総和。これがハンチングに効いてくる。実験結果は以下。
Homework5.4
AI for Roboticsの Homework5.4は、レーストラックの軌道上をPID制御を使ってロボットカーを走らせるシミュレーションをすること。
自分は、課題のレーストラックを少し修正して、Afrelから売り出されている楕円コースの軌道をロボットが描くように修正してみた。
寸法は実物と同じなので、mindstorms ev3で実際にロボットカーをつくって走らせれば、軌道上をロボットが走行するはず!!実物を走らせるのは、次回!!