Open tmori opened 7 months ago
PID制御側は、MATLAB/Simulinkでモデリング&コード生成しても良いし、手コーディングして良い。 機体の動きは、Unityでリアルで見れるようにする。
案1でしょ。
MATLAB連携に向けた検討はこちらに移管する。
この環境を利用して、現行の物理モデルのホバリングを理論的に検討したPID制御モデルでコントロールできるようにして、箱庭ラボのブログで紹介する。
対象の運動方程式:
$$ \ddot{z} = -\frac{u(t)}{m} + g - d\frac{\dot{z}}{m} $$
ここで、目標値との誤差の方程式にすると以下となる。
$$ -\ddot{e} = -\frac{u(t)}{m} + g +d\frac{\dot{e}}{m} $$
$$ e(t) = R - z(t) $$
$R$ はホバリングする目標値(固定値)
これをラプラス変換するとこうなって、
$$ -s^{2} E(s) = -\frac{U(s)}{m} + \frac{g}{s} + d s \frac{E(s)}{m} $$
伝達関数にするとこうなって、2次遅れの伝達関数で表現できない。
$$ Gp(s) = \frac{E(s)}{U(s)} = \frac{1}{m} / (s^{2} + \frac{d}{m} s + \frac{g}{s}) $$
これをラプラス変換するとこうなって、
$$ -s^{2} E(s) = -U(s)/m + g E(s) + d s E(s) / m $$
gE(s)は、g/s かな。そして、純粋に線形にならないので、E/U が解けない。
なるほど。2次遅れの伝達関数にして、理論的な方向で攻めようかと思いましたが、難しそうですね。
僕の方策は、T/m - g をT' としてT' をコントロール可能な変数と捉えて線形化しました。(スライドの計算メモのページ)
なるほど!
やっと理解できました。P制御と繋げた微分方程式作って、2次の伝達関数にしているのか!
https://speakerdeck.com/hiranabe/math-physics-and-dynamics-of-drone-in-hakoniwa?slide=13
まずは、P制御をベースにして、考えていきます。
対象の運動方程式:
$\ddot{z} = -\frac{u(t)}{m} + g - \frac{d}{m} \dot{z}$
これをラプラス変換するとこうなる。
$s^{2}Z(s) = -\frac{U(s)}{m} + \frac{g}{s} - \frac{d}{m} s Z(s)$
$u(t) = K_p ( R - z(t) )$
これをラプラス変換すると、
$U(s) = K_p ( \frac{R}{s} - Z(s) )$
$s^{2}Z(s) = -\frac{K_p ( \frac{R}{s} - Z(s) ) }{m} + \frac{g}{s} - \frac{d}{m} s Z(s)$
左辺に微分項、右辺を積分項にしてみる。
$s^{2}Z(s) + \frac{d}{m} s Z(s) + \frac{K_p}{m} Z(s) = (g -\frac{K_p R}{m}) \frac{1}{s}$
ここからZ(s)を求めるとこうなる。
$Z(s) = \frac{(g -\frac{K_p R}{m})}{s(s^{2} + \frac{d}{m} s + \frac{K_p}{m})}$
なので、積分要素と2次の遅れ要素の直列接続とみなせる
$Z(s) = \frac{1}{s} \frac{(g -\frac{K_p R}{m})}{s^{2} + \frac{d}{m} s + \frac{K_p}{m}}$
変形すると、
$Z(s) = \frac{m}{K_p}(g -\frac{K_p R}{m}) \frac{1}{s} \frac{\frac{K_p}{m}}{s^{2} + \frac{d}{m} s + \frac{K_p}{m}}$
ここで、
$\omega_n^{2} = \frac{K_p}{m}$
$\zeta = \frac{d}{2\sqrt{mK_p}}$
とおくと、こうなる。
$Z(s) = \frac{(g -\omega_n^{2} R)}{\omega_n^{2}} \frac{1}{s} \frac{\omega_n^{2}}{s^{2} + 2 \zeta \omega_n s + \omega_n^{2}}$
1/s は単位ステップ関数 $u_s(t)$ のラプラス変換 $U(s)$ なので、単位ステップ信号に対する伝達関数として表現すると、こうなるので、2次遅れ要素の特性から Kp値の妥当な値を推測することが可能になるはず。
$$ D(s) = \frac{Z(s)}{U(s)} = \frac{(g -\omega_n^{2} R)}{\omega_n^{2}} \frac{\omega_n^{2}}{s^{2} + 2 \zeta \omega_n s + \omega_n^{2}} $$
$\omega_n^{2} = \frac{K_p}{m}$
$\zeta = \frac{d}{2\sqrt{mK_p}}$
$d$は、定数(0より大きい値)
[ ] 過制動($\zeta > 1$)
[ ] 臨界制動($\zeta = 1$)
[ ] 不足制動($0 < \zeta < 1$)
[x] 持続振動($\zeta = 0$) d=0のケースなので対象外とする。
特徴 | 条件 | Kp値 |
---|---|---|
過制動 | $K_p < \frac{d^{2}}{4m}$ | TODO |
臨界制動 | $K_p = \frac{d^{2}}{4m}$ | TODO |
不足制動 | $K_p > \frac{d^{2}}{4m}$ | TODO |
うーん、ダメだ。 $K_p$ 値が果てしなく小さくなる。。
重力を定常的に与えないと、相当不安定になるのではないか。 z軸はNED座標系。Rは正の値で指定する。
$u(t) = K_p ( z(t) + R ) + m g$
これをラプラス変換すると、
$U(s) = K_p ( Z(s) + \frac{R}{s} ) + \frac{m g}{s}$
うーん、 $u(t)$ が負にならないような考慮が必要であることに気づいた。
$s^{2}Z(s) = -\frac{ K_p ( Z(s) + \frac{R}{s}) + \frac{mg}{s} }{m} + \frac{g}{s} - \frac{d}{m} s Z(s)$
左辺に微分項、右辺を積分項にしてみる。
$s^{2}Z(s) + \frac{d}{m} s Z(s) + \frac{K_p}{m} Z(s) = ( -\frac{K_p R}{m}) \frac{1}{s}$
ここからZ(s)を求めるとこうなる。
$Z(s) = \frac{( -\frac{K_p R}{m})}{s(s^{2} + \frac{d}{m} s + \frac{K_p}{m})}$
なので、積分要素と2次の遅れ要素の直列接続とみなせる
$Z(s) = \frac{1}{s} \frac{( -\frac{K_p R}{m})}{s^{2} + \frac{d}{m} s + \frac{K_p}{m}}$
変形すると、
$Z(s) = \frac{m}{K_p}( -\frac{K_p R}{m}) \frac{1}{s} \frac{\frac{K_p}{m}}{s^{2} + \frac{d}{m} s + \frac{K_p}{m}}$
ここで、
$\omega_n^{2} = \frac{K_p}{m}$
$\zeta = \frac{d}{2\sqrt{mK_p}}$
とおくと、こうなる。
$Z(s) = - R \frac{1}{s} \frac{\omega_n^{2}}{s^{2} + 2 \zeta \omega_n s + \omega_n^{2}}$
この三次式まで、僕の結果と整合します。この後、逆ラプラス変換して時間領域の式が出せています。計算メモのページ。
この3次式まで僕の手計算と整合しています。 この後逆ラプラスして時間領域で式をだして、グラフ書きました。
ありがとうございます! $\omega_n$ と $\zeta$ の値が違うようですが、同じ感じですね。
ここから、 $\zeta$ の範囲から $K_p$ の代表値を決めて、実際にシミュレーションしてみようと思っています。
$\omega_n^{2} = \frac{K_p}{m}$
$\zeta = \frac{d}{2\sqrt{mK_p}}$
$d$は、定数(0より大きい値)
[ ] 過制動($\zeta > 1$)
[ ] 臨界制動($\zeta = 1$)
[ ] 不足制動($0 < \zeta < 1$)
[x] 持続振動($\zeta = 0$) d=0のケースなので対象外とする。
特徴 | 条件 | 備考 |
---|---|---|
過制動($\zeta > 1$) | $K_p < \frac{d^{2}}{4m}$ | 現実的にありえない? |
臨界制動($\zeta = 1$) | $K_p = \frac{d^{2}}{4m}$ | 現実的にありえない? |
不足制動($0 < \zeta < 1$) | $K_p > \frac{d^{2}}{4m}$ | $K_p$が大きくなると $\zeta$ は0に近づく |
d= $10^{-4}$ m= $10^{-1}$ $K_p=\frac{10^{-8}}{4*10^{-1}}=\frac{10^{-7}}{4}$
ここからは、方針(オーバーシュートx%までとか、整定時間何秒にしたいとか、外乱に強くしたいとか)で決めていくのだと思う。
目標値は -10m $K_p$ = (1/4.0)*1.0e-05 $\zeta$=0.1
目標値は -10m $K_p$ = (1/4.0)*1.0e-04 $\zeta$=0.0316227766
目標値は -10m $K_p$ = (1/4.0)*1.0e-00 $\zeta$=0.000316227766
ここでD制御が必要なのか?
z軸はNED座標系。Rは正の値で指定する。
$u(t) = K_p ( z(t) + R ) + m g + K_d ( \dot{z(t) + R} ) $
Rは定数なので、こうなる。
$u(t) = K_p ( z(t) + R ) + m g + K_d \dot{z(t)} $
これをラプラス変換すると、
$U(s) = K_p ( Z(s) + \frac{R}{s} ) + \frac{m g}{s} + K_d s Z(s) $
$s^{2}Z(s) = -\frac{ K_p ( Z(s) + \frac{R}{s}) + \frac{mg}{s} + K_d s Z(s) }{m} + \frac{g}{s} - \frac{d}{m} s Z(s)$
左辺に微分項、右辺を積分項にしてみる。
$s^{2}Z(s) + \frac{d}{m} s Z(s) + K_d s Z(s) + \frac{K_p}{m} Z(s) = ( -\frac{K_p R}{m}) \frac{1}{s}$
ここからZ(s)を求めるとこうなる。
$Z(s) = \frac{( -\frac{K_p R}{m})}{s(s^{2} + (\frac{d}{m} + K_d ) s + \frac{K_p}{m})}$
なので、積分要素と2次の遅れ要素の直列接続とみなせる
$Z(s) = \frac{1}{s} \frac{( -\frac{K_p R}{m})}{s^{2} + (\frac{d}{m} + K_d) s + \frac{K_p}{m}}$
変形すると、
$Z(s) = \frac{m}{K_p}( -\frac{K_p R}{m}) \frac{1}{s} \frac{\frac{K_p}{m}}{s^{2} + \frac{d}{m} s + \frac{K_p}{m}}$
ここで、
$\omega_n^{2} = \frac{K_p}{m}$
$\zeta = \frac{d + m K_d}{2\sqrt{mK_p}}$
とおくと、こうなる。
$Z(s) = - R \frac{1}{s} \frac{\omega_n^{2}}{s^{2} + 2 \zeta \omega_n s + \omega_n^{2}}$
$\zeta$ が 0.707 が最適な値だと仮定して、 $K_p$ と $K_d$ のバリエーションを探索してみるとどうだろうか。
現在、10m でホバリングしていない事に注意。グラフのvalue は、R-g/wn^2 (→10)の値であり。P制御だけでは定常位置偏差 g/wn^2 がずっと出てしまう。→I制御が必要、という流れ。
Kp = 0.25 Kd = 2.234730306
1秒くらいで目標値に収束しました! 収束した数値は10mになってますが、おそらくシミュレーション誤差と思われます。
Kp = 0.0000025 Kd = 0.00607
こちらはKpが小さいので収束に時間がかかっていますし、収束値は10mになっていません。
現在、10m でホバリングしていない事に注意。グラフのvalue は、R-g/wn^2 (→10)の値であり。P制御だけでは定常位置偏差 g/wn^2 がずっと出てしまう。→I制御が必要、という流れ。
コメントありがとうございます! Kiのほうも同様に数式化できないかやってみます。
あと、オーバーシュート値とオーバーシュートに達する時間も解析的に求められると評価がしやすいですよね。
z軸はNED座標系。Rは正の値で指定する。
$u(t) = K_p ( z(t) + R ) + m g + K_d ( \dot{z(t) + R} ) + K_i \int_0^t ( z(\tau) + R ) d\tau $
Rは定数なので、こうなる。
$u(t) = K_p ( z(t) + R ) + m g + K_d \dot{z(t)} + K_i R t + K_i \int_0^t z(\tau) d\tau $
これをラプラス変換すると、
$U(s) = K_p ( Z(s) + \frac{R}{s} ) + \frac{m g}{s} + K_d s Z(s) + K_i ( \frac{R}{s^{2}} + \frac{Z(s)}{s} )$
$s^{2}Z(s) = -\frac{ K_p ( Z(s) + \frac{R}{s}) + \frac{mg}{s} + K_d s Z(s) + K_i ( \frac{R}{s^{2}} + \frac{Z(s)}{s} )}{m} + \frac{g}{s} - \frac{d}{m} s Z(s)$
左辺に $Z(s)$ 項、右辺を $s$ 項にしてみる。
$s^{2}Z(s) + \frac{d}{m} s Z(s) + K_d s Z(s) + \frac{K_p}{m} Z(s) + K_i \frac{Z(s)}{s} = ( -\frac{K_p R}{m}) \frac{1}{s} - \frac{K_i R}{s^{2}}$
Kiが入ると、2次遅れにならないので、これまでの解き方では難しそう。
I制御の解析は一旦ペンディングします。 PD制御の計算結果は再度レビューします。
その上で、PD制御のパラメータをいくつか決めて、I制御パラメータを微調整する探索をやって、Unityでビジュアライズするところをゴールにしようと思います。
例の制御ドローンレース,でも,PD 制御までです. 例の講義の秀逸なところは,早く収束するように攻めると,外乱に弱くなる.Kp, Kd を決める目安としては,「位相余裕」と「ゲイン余裕」を見ている.
森さんのやり方だと,一巡伝達関数でなく,閉ループのステップ応答を直接求めるようになっていて,制御の通常コースの,
という手順が使えなくて,教材としては制御の教科書にうまく乗らないのがちょっと残念に思いました.何かうまくできるといいのだけど.
説明ありがとございます! まだまだ勉強不足なもので、フィードバック制御側の理解を進めたいと思います。
目的
箱庭ドローンシミュレータを制御の勉強として利用できるようにしたい。 そして、参考資料にあるように、制御の競技会を同時実施できるようにする!
参考: https://www.youtube.com/watch?v=y-C4AId2Za8&t=1840s