バックナンバーはこちら
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\)を調整すれば、
様々な制御対象に適用できるってのが利点なんだよね。

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


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

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

というと。

今回の仕様だと、
人間がアクセルを踏んである程度の速度が出ている状態から、
自動制御に移るんじゃない?

そうそう。
使用感は調整になると思うけど、
目標値より\(20[km/h]\)引いたあたりから自動制御になる感じ。

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

ワインドアップ?
何それ?

PID制御は目標値と現在の差を無くすような出力をするんだけど、
差が中々縮まらないようだと
積分項が差を埋める方向に値をため込むんだ。
例を出すと以下のような動きになる。


って、
ことは自動制御に移った瞬間に
一気にアクセルを踏むような動作で危ない!!

でも、だったら、
自動制御に移るまではPID制御は動作しないようにしておけば
積分項が値をため込むことは無いんじゃない?

それだと今度は、0値からの制御になるので、アクセル開度が一旦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$$

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


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

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

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

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

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

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

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

離散化?

うん。
ソフトウェアで実現しようと思ったら、
今の形だとできないんで離散化が必要。

えーっと、
それも解説してくれるんだよね?

じゃ、
次回のネタはそれにするか。
まとめ

まとめだよ。
- PID制御は位置型と速度型がある。
- 位置型はワインドアップの課題を抱えている。
- 速度型はワインドアップの課題を解消しており、使い勝手が良い。
- ソフトウェアで実現するには離散化が必要。
バックナンバーはこちら
コメント