【上流検証】最小構成のモデルベース開発事例 その56【ドライビングシミュレータ⑥】

【上流検証】最小構成のモデルベース開発事例 その56【ドライビングシミュレータ⑥】 事例

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

バックナンバーはこちら

コメント

タイトルとURLをコピーしました