倒立振子を線形二次レギュレーター(LQR)で”簡単に”立たせる話
前回でシミュレーターができたのでやっと制御できます。
自分で問題を作って自分で解く、虚無ですね。
振り子を立たせるだけでなく、台車位置もゼロに保つようにしてみたいと思います。入力は台車にはたらく力とします。つまり制御対象の状態変数が複数あるのに対して入力は1つの劣駆動システムになります。
運動方程式の線形化と状態方程式・観測方程式
求めた運動方程式を
棒の傾きが微小の時を仮定して線形化します。
状態変数を定義します。
上の線形化した式を用いて状態方程式を作ります。
また観測方程式は以下のようになります。シミュレーターなので全ての状態変数が観測できるものとします。
これでシステムが把握できたので制御を組んでいきます。
線形二次レギュレーター
LQRでは以下の評価関数を最小化するゲインを求めます。
は状態に関する重み行列、は入力に関する重み行列です。ざっくりとしたイメージでいうと状態変数の各成分が0から離れていて、その時間が長いほどの値が大きくなります。また入力が0から離れていて、その時間が長いほどの値が大きくなります。
また対角行列であるの各行が状態変数の各成分の重みになっているので、優先して収束させたい状態変数のと同じ行の対角成分を大きくすることで過渡特性をチューニングすることができます。またに比べての値を大きくすると多少収束に時間がかかってもいいので入力を減らせ、という省エネ命令になるわけです。
入力は以下のように状態変数にゲインをかけた値になります。
つまりこのをうまく決めてやるとがより小さくなる、つまり目標値から外れている時間が短くなり、またより少ない入力でそれを達成できるわけです。
最適ゲインの算出
それじゃあはどのように決めたらいいのか……というふうに話が進むわけですが「簡単に」と銘打っているように、ここでは自分では求めません。当たり前です。
具体的にはmatlabにおんぶに抱っこします。
m = 1; M = 4; l = 4; g = 9.8; A = [0 0 1 0; 0 0 0 1; 0 -3*m*g/(4*M+m) 0 0; 0 6*(M+m)*g/(4*M+m)/l 0 0] B = [0; 0; 4/(4*M+m); -6/(4*M+m)/l] Q = eye(4) R = 1 lqr(A,B,Q,R)
はい出ました。
簡単ですね。
4つの数に左から順にをかけた値の合計を求め、-1をかけた値を制御入力とします。前回作ったシミュレーターに制御入力を加えた結果が以下です。
これに対して先程のmatlabのシステムに同じ初期値を与えたときの応答が以下です。
上から一番目と二番目、のグラフはほぼ一致していて、どちらも15秒前後で静定していることがわかると思います。一方ではまだ誤差が残っています。もう少し動かすとゼロにはなりますが、制御モデルが線形化されているのに対してシミュレーターが非線形であるためと考えられます。
より高速にをゼロにするための1行1列目を1から5にしてみます。
気持ち収束が早くなった気がします。その代わり移動中の棒の傾きは大きくなってしまいました。
次にを単位行列に戻して、制御量を少なくするためを1から10にしてみます。
台車の加減速がゆっくりになっているのがわかると思います。制御量が少なくなってエコ&動かしているアクチュエータには優しくなりましたが、静定時間は伸びてしまいました。
以上のように最適制御は一つのQ,Rに対しては計算によってパラメーターが一意に決まりますが、理想とする動きに近づけるためにはチューニングが必要です。最適であることが保証されているからこそ、すべての性能がトレードオフになっています。
このような難しさもありますが、重み行列をとりあえず単位行列にしておけば動くし多入力、劣駆動システム対応の制御法としては一番簡単だと思います。
ここまでご覧いただきありがとうございました。
記事中に間違いなどありましたらお気軽にコメントで教えていただけると助かります。