toppers / hakoniwa-px4sim

PX4-compatible drone simulation with physics-based modeling in C, visualizations via game engines, headless operation, and automated test scenarios. Supports external parameterization and MATLAB/Simulink integration.
37 stars 9 forks source link

PID制御の勉強ができる環境を作る #164

Open tmori opened 7 months ago

tmori commented 7 months ago

目的

箱庭ドローンシミュレータを制御の勉強として利用できるようにしたい。 そして、参考資料にあるように、制御の競技会を同時実施できるようにする!

参考: https://www.youtube.com/watch?v=y-C4AId2Za8&t=1840s

tmori commented 7 months ago

構成

スクリーンショット 2024-02-17 15 09 08

PID制御側は、MATLAB/Simulinkでモデリング&コード生成しても良いし、手コーディングして良い。 機体の動きは、Unityでリアルで見れるようにする。

tmori commented 7 months ago

課題など

tmori commented 7 months ago

PID制御プログラムのモジュール化方法について

案1でしょ。

作戦

  1. 案1のビルド環境を別のリポジトリで管理する。
  2. ビルド環境は dockerか何かで簡便な方法を採用する
  3. MATLABも視野に入れる
tmori commented 7 months ago

詳細設計

スクリーンショット 2024-02-17 15 52 52

tmori commented 7 months ago

実装ステップ

tmori commented 7 months ago

残作業

MATLAB連携に向けた検討はこちらに移管する。

https://github.com/toppers/hakoniwa-px4sim/issues/165

tmori commented 7 months ago

最後の作業

この環境を利用して、現行の物理モデルのホバリングを理論的に検討したPID制御モデルでコントロールできるようにして、箱庭ラボのブログで紹介する。

tmori commented 7 months ago

平鍋さんの2次伝達関数の理解

対象の運動方程式:

$$ \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}) $$

tmori commented 7 months ago

伝達関数から理論的にPIDの値を求めるやり方がないか調べる

これではないか?

https://tajimarobotics.com/pid-stability-pid-control/

kenjihiranabe commented 7 months ago

これをラプラス変換するとこうなって、

$$ -s^{2} E(s) = -U(s)/m + g E(s) + d s E(s) / m $$

gE(s)は、g/s かな。そして、純粋に線形にならないので、E/U が解けない。

tmori commented 7 months ago

なるほど。2次遅れの伝達関数にして、理論的な方向で攻めようかと思いましたが、難しそうですね。

kenjihiranabe commented 7 months ago

僕の方策は、T/m - g をT' としてT' をコントロール可能な変数と捉えて線形化しました。(スライドの計算メモのページ)

tmori commented 7 months ago

スクリーンショット 2024-02-20 8 55 29

なるほど!

tmori commented 7 months ago

やっと理解できました。P制御と繋げた微分方程式作って、2次の伝達関数にしているのか!

https://speakerdeck.com/hiranabe/math-physics-and-dynamics-of-drone-in-hakoniwa?slide=13

スクリーンショット 2024-02-20 9 35 27

tmori commented 7 months ago

まずは、P制御をベースにして、考えていきます。

tmori commented 7 months ago

プラント側

対象の運動方程式:

$\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)$

tmori commented 7 months ago

P制御側

$u(t) = K_p ( R - z(t) )$

これをラプラス変換すると、

$U(s) = K_p ( \frac{R}{s} - Z(s) )$

tmori commented 7 months ago

プラント側のU(s) にP制御の式をラプラス関数で代入

$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}}$

tmori commented 7 months ago

P制御とプラントモデルを含めた伝達関数の解釈

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}} $$

スクリーンショット 2024-02-20 11 54 48

tmori commented 7 months ago

2次遅れ要素の特徴

tmori commented 7 months ago

特徴とパラメータ候補

特徴 条件 Kp値
過制動 $K_p < \frac{d^{2}}{4m}$ TODO
臨界制動 $K_p = \frac{d^{2}}{4m}$ TODO
不足制動 $K_p > \frac{d^{2}}{4m}$ TODO

うーん、ダメだ。 $K_p$ 値が果てしなく小さくなる。。

tmori commented 7 months ago

再考: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)$ が負にならないような考慮が必要であることに気づいた。

tmori commented 7 months ago

再考:プラント側のU(s) にP制御の式をラプラス関数で代入

$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}}$

kenjihiranabe commented 7 months ago

この三次式まで、僕の結果と整合します。この後、逆ラプラス変換して時間領域の式が出せています。計算メモのページ。

kenjihiranabe commented 7 months ago

この3次式まで僕の手計算と整合しています。 この後逆ラプラスして時間領域で式をだして、グラフ書きました。

image
tmori commented 7 months ago

ありがとうございます! $\omega_n$ と $\zeta$ の値が違うようですが、同じ感じですね。

ここから、 $\zeta$ の範囲から $K_p$ の代表値を決めて、実際にシミュレーションしてみようと思っています。

2次遅れ要素の特徴

特徴 条件 備考
過制動($\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}$

kenjihiranabe commented 7 months ago

ここからは、方針(オーバーシュートx%までとか、整定時間何秒にしたいとか、外乱に強くしたいとか)で決めていくのだと思う。

tmori commented 7 months ago

試してみた(その1)

目標値は -10m $K_p$ = (1/4.0)*1.0e-05 $\zeta$=0.1

Figure_1

tmori commented 7 months ago

試してみた(その2)

目標値は -10m $K_p$ = (1/4.0)*1.0e-04 $\zeta$=0.0316227766

Figure_2

tmori commented 7 months ago

試してみた(その3)

目標値は -10m $K_p$ = (1/4.0)*1.0e-00 $\zeta$=0.000316227766 Figure_3

tmori commented 7 months ago

所感

ここでD制御が必要なのか?

tmori commented 7 months ago

PD 制御

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) $

tmori commented 7 months ago

プラント側のU(s) にPD制御の式をラプラス関数で代入

$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}}$

tmori commented 7 months ago

PDパラメータ探索の方針

$\zeta$ が 0.707 が最適な値だと仮定して、 $K_p$ と $K_d$ のバリエーションを探索してみるとどうだろうか。

kenjihiranabe commented 7 months ago

現在、10m でホバリングしていない事に注意。グラフのvalue は、R-g/wn^2 (→10)の値であり。P制御だけでは定常位置偏差 g/wn^2 がずっと出てしまう。→I制御が必要、という流れ。

tmori commented 7 months ago

ζ=0.707 のPD制御結果(その1)

Kp = 0.25 Kd = 2.234730306

1秒くらいで目標値に収束しました! 収束した数値は10mになってますが、おそらくシミュレーション誤差と思われます。

drone_dynamics.csv

Figure_4png

tmori commented 7 months ago

ζ=0.707 のPD制御結果(その2)

Kp = 0.0000025 Kd = 0.00607

こちらはKpが小さいので収束に時間がかかっていますし、収束値は10mになっていません。

drone_dynamics.csv

Figure_5

tmori commented 7 months ago

現在、10m でホバリングしていない事に注意。グラフのvalue は、R-g/wn^2 (→10)の値であり。P制御だけでは定常位置偏差 g/wn^2 がずっと出てしまう。→I制御が必要、という流れ。

コメントありがとうございます! Kiのほうも同様に数式化できないかやってみます。

あと、オーバーシュート値とオーバーシュートに達する時間も解析的に求められると評価がしやすいですよね。

tmori commented 7 months ago

PID 制御

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} )$

tmori commented 7 months ago

プラント側のU(s) にPID制御の式をラプラス関数で代入

$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}}$

tmori commented 7 months ago

Kiが入ると、2次遅れにならないので、これまでの解き方では難しそう。

tmori commented 7 months ago

現時点の課題まとめと今後の方針

  1. PD制御の計算結果が怪しいかもしれない
  2. I制御を含めた解析は難しそう

I制御の解析は一旦ペンディングします。 PD制御の計算結果は再度レビューします。

その上で、PD制御のパラメータをいくつか決めて、I制御パラメータを微調整する探索をやって、Unityでビジュアライズするところをゴールにしようと思います。

kenjihiranabe commented 7 months ago

例の制御ドローンレース,でも,PD 制御までです. 例の講義の秀逸なところは,早く収束するように攻めると,外乱に弱くなる.Kp, Kd を決める目安としては,「位相余裕」と「ゲイン余裕」を見ている.

kenjihiranabe commented 7 months ago

森さんのやり方だと,一巡伝達関数でなく,閉ループのステップ応答を直接求めるようになっていて,制御の通常コースの,

  1. P(s) を与えて,C(S) を設計する課題. 2.そのために,「一巡伝達関数=C(s)P(s)」が分かると閉ループは「W=CP/(1+CP)」である.
  2. W の条件(外乱につよい,すばやく収束する,などなど)がC(S)設計への要求となる.
  3. C(S)設計のために,「WでなくCPの特性を見て,要求を満たすCを設計」(CPのボード線図での位相余裕とゲイン余裕,ナイキスト線図上の,(-1,0)点と軌跡の関係)

という手順が使えなくて,教材としては制御の教科書にうまく乗らないのがちょっと残念に思いました.何かうまくできるといいのだけど.

tmori commented 7 months ago

説明ありがとございます! まだまだ勉強不足なもので、フィードバック制御側の理解を進めたいと思います。