【上流検証】最小構成のモデルベース開発事例 その14【MILS後編】

【上流検証】最小構成のモデルベース開発事例 その14【MILS後編】 事例

バックナンバーはこちら
https://www.simulationroom999.com/blog/model-based-of-minimum-backnumber/

はじめに

引き続きにシミュレーションの話。
前回はExcelをつかったメンドクサイ側の手法だったが、
今回はちゃんとSimulinkを使う。

登場人物

博識フクロウのフクさん

イラスト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

モデル作成

太郎くん
太郎くん

うー。
前回はひどい目にあった。

フクさん
フクさん

でも、

ツールの有難みがわかったでしょ?

太郎くん
太郎くん

うん。それはもう。

フクさん
フクさん

じゃー、

Simulinkモデルなんかはチョロいってことだね。

太郎くん
太郎くん

んー、

自身満々ってことは無いけど、

楽が出来るって意味では抵抗感はかなり和らいだかな。

フクさん
フクさん

では早速、SimlinkモデルでPID制御と疑似車両のMILS(Model In the Loop System)を組んでみて。

太郎くん
太郎くん

うん。

これは前回よりも早くできるよ!

きっと。

~10分後~

太郎くん
太郎くん

どうだ!

PID制御器とプラントを繋いだSimulinkモデル
フクさん
フクさん

良いね。
一応、指令値を作るためにSignal Builderも入れたんだね。

各係数は?

太郎くん
太郎くん

PIDの各係数とか、車両側のパラメータってどうしようか?

フクさん
フクさん

PIDの各係数はとりあえず、1.0未満の値を入れておけば良いよ。
指定するならば、以下かな。
\(K_p=0.8\)
\(K_i=0.6\)
\(K_d=0.0\)
車両側の質量はとりあえず、\(1[t]\)強ってことで
\(m=1150[kg]\)

太郎くん
太郎くん

あれ?そんなんでいいの?
PIDに関しては限界感度法とかいろいろあった気がするんだけど・・・。

フクさん
フクさん

今回は制御対象の性質を凡そ掴んでいるからね。
例えば、
アクセル開度\(100%\)の時の凡その車速を\(100[km/h]\)と仮定すると、
PID制御器の手前で目標車速と実車速を\(\displaystyle\frac{1}{100}\)にする。
アクセル開度\(100[\%]\)の時の出力を\(200[kW]\)とするならば、
PID制御器直後に\(200000\)のゲインを入れる。
これにより、
PID制御器の中は「\(-1.0~+1.0\)の範囲で動作すれば良い」
という感じのお膳立てができる。

太郎くん
太郎くん

PID制御器の中はいじらないの?

フクさん
フクさん

そうだね。
本来は制御対象をブラックボックスと捉え、各係数を徐々に調整していけるのがPID制御の良いところなんだけど、
判明しているパラメータは可能な限り制御器から排除するとチューニング難度が大きく下がるんだ。
結果、究極系として「1.0未満の値ならば何でもよい」という状態に持ってこれる。

太郎くん
太郎くん

おー。
これもモデルベース開発ならではなのかな?

フクさん
フクさん

モデルベース開発以前でもやっていたことだとは思うけど、
シミュレーションの敷居が下がった今だからこそ、
更に突き詰められるようになったのも事実だね。

太郎くん
太郎くん

なるほどー。

テストパターン

フクさん
フクさん

次はテストパターンを考える。
Signal Builderが設置されているんで、こいつにテスト信号を入れてしまおう。

Simulinkモデルのテスト用波形をSignal Builderで作成
太郎くん
太郎くん

人間がある程度踏み込んで、途中から自動制御するイメージだね。

フクさん
フクさん

そうそう。
これですべてのテストがOKとはならないが、トライアル&エラーによる大筋OKの判定には使えるだろう。

太郎くん
太郎くん

なるほど。
可能な限り問題が引き当てやすそうなテストパターンで複数回試行した方が効率が良いってことだね。

フクさん
フクさん

そういうこと。

テスト結果

フクさん
フクさん

で、テスト結果はこんなん。

APコントローラのシミュレーション結果、目標車速、実車速、乗っ取りモード、ユーザ操作AP開度、実AP開度
太郎くん
太郎くん

おー。

なんか期待通りの動きをしているいる!

フクさん
フクさん

そんなに複雑なことをやっているわけじゃないからねー。

位置型PIDだとどうなる?

太郎くん
太郎くん

そういえば、今回は速度型PIDを採用しているわけだけど、位置型PIDに対してこのテストパターンを入れるとどうなるのかな?

フクさん
フクさん

うん。

やってみると良いよ。
PIDの出力側の積分要素のサチュレーションを無くせば、位置型PIDと同等になるんで、それに対してテストパターンを流す。

APコントローラのシミュレーション結果(ワインドアップ無し)、目標車速、実車速、乗っ取りモード、ユーザAP開度、実AP開度、積分器暴発
太郎くん
太郎くん

わ!
これはちょっとまずいね。
積分器が暴発してる!

フクさん
フクさん

ついでに自動制御直前にPIDの各変数を初期化するパターンをはこれ。

Simulinkモデルでテストした結果の波形(PIDパラメータ強制初期化パターン)、目標車速、実車速、乗っ取りモード、ユーザ操作AP開度、実AP開度、制御乗っ取りの瞬間に変動大
太郎くん
太郎くん

うーん、

車速だけ見ると問題無いように見えるけど、

AP開度が結構急激に変動しているから条件によっては問題が発生しそうだ。

太郎くん
太郎くん

じゃー、
やっぱり位置型PIDではなく速度型PIDを採用して正解だったってことだね!

フクさん
フクさん

そーだね。

太郎くん
太郎くん

アルゴリズムとしては問題無さそうなんでいろいろ自信が付いてきた!

まとめ

フクさん
フクさん

まとめだよ

  • 制御器と制御対象をつないでMILSにすることができる。
  • SignalBuilderを使ってテストパターンを作れる。
  • わざと問題のあるモデルと比較すると、今回の対策の効能が見えるのでやってみると良い。

バックナンバーはこちら

コメント

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