バックナンバーはこちら
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の演算に組み込むことができる。
- (無事、伏線回収!)
バックナンバーはこちら
コメント