【仕様書】最小構成のモデルベース開発事例 その5【制御モデル】

【仕様書】最小構成のモデルベース開発事例 その5【制御モデル】 事例

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

はじめに

前回、簡易HILS案の関係者間調整と物理値変換仕様を実施。
今回は実際の制御モデルに踏み込む。

登場人物

博識フクロウのフクさん

イラスト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制御を組み込むのが良いと思うんだよね。
ただ、

実はすでに組み込まれているPID制御の調整はしたことあるんだけど、自分で仕様書書くとなるとどうしたら良いのやら・・・。

フクさん
フクさん

じゃあ、

まず簡単に普通のPID制御から話すか。

太郎くん
太郎くん

普通の?

普通じゃないPID制御があるの?

フクさん
フクさん

最初の話すのが「位置型PID」と呼ばれえるもので、
PID制御を定義する式をそのまま使ったもの。
これの欠点を話して、

次に「速度型PID」と呼ばれるものを説明するつもりだ。

太郎くん
太郎くん

察すると、

「位置型PID」は何か問題があるから

「速度型PID」の方がいいよってことかな?

フクさん
フクさん

そういうこと。

フクさん
フクさん

まずPID制御を定義している式は以下になる。
$$u(t)= K_p e(t)+ K_i \int e(t) dt +K_d e(t) \frac{d}{dt}$$

太郎くん
太郎くん

各ゲインの\(K_p\)、\(K_i\)、\(K_d\)を調整すれば、

様々な制御対象に適用できるってのが利点なんだよね。

フクさん
フクさん

そうそう。
ブロック線図で書くと以下になる。

PID制御器ブロック線図、目標値、実値、制御値、u(t)、e(t)、Kp、Ki、Kd、∫、d/dt、微分、積分
太郎くん
太郎くん

で、これに問題があると。

フクさん
フクさん

うん。今回の場合は特に。

太郎くん
太郎くん

というと。

フクさん
フクさん

今回の仕様だと、

人間がアクセルを踏んである程度の速度が出ている状態から、

自動制御に移るんじゃない?

太郎くん
太郎くん

そうそう。

使用感は調整になると思うけど、

目標値より\(20[km/h]\)引いたあたりから自動制御になる感じ。

フクさん
フクさん

とすると、

やはりワインドアップという現象に悩まされることになる。

太郎くん
太郎くん

ワインドアップ?

何それ?

フクさん
フクさん

PID制御は目標値と現在の差を無くすような出力をするんだけど、

差が中々縮まらないようだと

積分項が差を埋める方向に値をため込むんだ。
例を出すと以下のような動きになる。

ワインドアップ図解。人間、自動制御、偏差を蓄積、蓄積された偏差が一気に反映、車速、AP開度、目標値
太郎くん
太郎くん

って、

ことは自動制御に移った瞬間に

一気にアクセルを踏むような動作で危ない!!

太郎くん
太郎くん

でも、だったら、

自動制御に移るまではPID制御は動作しないようにしておけば

積分項が値をため込むことは無いんじゃない?

フクさん
フクさん

それだと今度は、0値からの制御になるので、アクセル開度が一旦0近傍まで落ち込むという不安定さが出るね。
こんな感じかな。

ワインドアップ図解2、人間、自動制御、目標値、車速、AP開度、0近傍からの制御開始
太郎くん
太郎くん

あ、そうなるのか。
これが位置型PIDの欠点ってやつなのか。

太郎くん
太郎くん

でも、

速度型PIDだとここら辺は解消されるんだよね?

フクさん
フクさん

そうなるね。

速度型PID制御

太郎くん
太郎くん

で、

速度型PIDってのは何?

フクさん
フクさん

一言で言うと、
位置型PIDを微分して積分したもの
になる。

太郎くん
太郎くん

え?

フクさん
フクさん

式で書くとこうだ。

$$u(t) = \int (u(t) \frac{d}{dt})dt$$
$$= \int (K_p e(t) \frac{d}{dt}+ K_i e(t)+K_d e(t) \frac{d^2}{dt^2} )dt$$

フクさん
フクさん

そして、ブロック線図で書くとこうなる。

PID制御改造版ブロック線図、目標値、実値、e(t)、u(t)、Kp、Ki。Kd、d/dt、d^2/dt^2、∫
太郎くん
太郎くん

(なんか2階微分が居る・・・)

太郎くん
太郎くん

えーっと、
微分して積分すると元に戻っちゃうんじゃないの?

フクさん
フクさん

厳密には元には戻らない。
微分した時に、バイアスが消える
積分した際に積分定数がバイアス相当。
やりたいことは、過去のバイアスを消して、現在値を初期条件として再定義するところにある。

太郎くん
太郎くん

ごめん。良く分からない。

フクさん
フクさん

言い換えると、問題になっている積分項を外側に追い出して、
その積分項を自動制御するタイミングの現在値で上書きするイメージかな?

太郎くん
太郎くん

イマイチぴんときてないけど、

問題の積分項をコントロールしやすいところに配置し直して、都合の良い初期値を設定できるようにしたってことかな?

フクさん
フクさん

そうなるね。
具体的なイメージは離散化したブロック線図にすると分かるかもしれない。

太郎くん
太郎くん

離散化?

フクさん
フクさん

うん。
ソフトウェアで実現しようと思ったら、

今の形だとできないんで離散化が必要。

太郎くん
太郎くん

えーっと、

それも解説してくれるんだよね?

フクさん
フクさん

じゃ、

次回のネタはそれにするか。

まとめ

フクさん
フクさん

まとめだよ。

  • PID制御は位置型速度型がある。
    • 位置型はワインドアップの課題を抱えている。
    • 速度型はワインドアップの課題を解消しており、使い勝手が良い。
  • ソフトウェアで実現するには離散化が必要。

バックナンバーはこちら

コメント

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