バックナンバーはこちら
https://www.simulationroom999.com/blog/model-based-of-minimum-backnumber/
はじめに
オープンソースドライビングシミュレータであるCARLAの話。
今回はPID制御が弱かった理由と対策。
そして、かなり前の伏線を回収する時・・・(すっかり忘れてた。)
一般的なPID制御のゲイン調整の話。
しかし、制御周期が変わった時はどうなるのって話。
などなど。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
制御が弱い?
で、
前回はPIDの制御が弱いってところで話が終わったわけなんだけど。
そうだね。
どうしよっか?
それはこっちのセリフ!!
理由は何だと思う?
うーん。
制御が弱いからPIDのPゲインかIゲインが低いのかな?
まぁ普通はそう思うよね。
というかPID制御という観点に於いては正しい。
その言い方だと間違ってるって感じだな。
今回のPID制御の想定制御周期っていくつ?
\(10[ms]\)のはずだよ。
じゃー、今回のPID制御が呼ばれている周期は?
あれ?いくつになるんだろ?
前回、なんか追加したよね?
あ!sleep(0.2)ってのを追加した!
ということは\(200[ms]\)周期になってる?!
\(200[ms]\)周期ぴったりかはわからないけど、
少なくとも\(200[ms]\)以上の周期にはなってるはずだよ。
ということはそれに合わせてPゲインとIゲインを上げないとまずいってことか?!
不正解。
これを忘れたの?
あ。そういえば、時間も調整可能なパラメータにするって話があったね。
と、言うことは積分単位時間を\(200[ms]\)にすれば解決か?!
不正解。
惜しい。もう一歩。
後はなんだー!わからん!
ここで伏線回収だ!!
伏線回収(可変周期PID制御)
以前、可変周期PIDってのやったと思う。
あ、積分単位時間を状況に応じて可変にするやつだ!
そうそう。
おーーー!
こうなることが分かって伏線を張っていたのかーー!!
(こうなることが分かっていたらキミに近づいてないよ)
その通り。
どうしても周期が設定できないことはシミュレーションに於いては良くあること。
今回にように、リアルタイム性が担保できない際は、時間が変動することを許容するしかない。
幸い、可変周期PIDは数式レベルでは同一であることは確認が取れているので、
これを使ってしまおう。
ということは、PIDの入力に時間[ms]を追加だね。
そうだね。
前回時間との差分がその時の積分単位時間になるからね。
んー。今回の場合、どこから時間をもらえば・・・。
game_loop関数の
clock = pygame.time.Clock()
ってところで時間管理オブジェクトを取得して、
そのまま引数で、parse_eventsメソッドに渡ってるんで、それを使うのが楽そうだね。
よし!なんとなくわかった!
次回までにいろいろ調整しておく!
まとめ
まとめだよ。
- PID制御が弱い場合、PゲインかIゲインを調整するのが一般的。
- しかし、今回はそもそも想定周期が異なっていた。
- 時間の刻み(タイムスタンプ)が明確であれば、前回値との差で時間差が特定できる。
- この時間差を積分単位時間としてPIDの演算に組み込むことができる。
- (無事、伏線回収!)
バックナンバーはこちら
コメント