GithubHelp home page GithubHelp logo

Comments (45)

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024 1

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024 1

プラント側の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}}$

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024 1

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

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024 1

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

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024 1

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024 1

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

構成

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

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

課題など

  • PID制御プログラムをモジュールとして組み込めるプラットフォームの検討が必要
  • PID制御プログラムは、箱庭とは別の環境でビルドできる必要がある
  • なんなら、MATLABで作ってコード生成してもらったものを組み込めるようにしたい
  • 制作した制御プログラムはPX4に組み込むこともできるようにしたい
  • なんなら、それを実機でそのまま使えたら素敵だ。

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

  • 案1. ダイナミックローディングできるようにする
  • 案2. スタティックリンクする?

案1でしょ。

作戦

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

詳細設計

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

実装ステップ

  • drone と controllerを接続して実行できるようにする
  • Unityと連携できるようにする
  • ローダーを作る
  • 新しいリポジトリ現行リポジトリでcontrollerを作成できるようにする

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

残作業

  • コンフィグファイルの設定がないケースのエラーハンドリング
  • ローダブルモジュールがない場合のエラーハンドリング
  • PID制御課題のREADMEを作る
  • PID制御プログラム実行方法のREADMEを作る
  • MATLAB連携に向けた対応内容を検討する
  • その他あれば

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

#165

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

最後の作業

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

  • 平鍋さんの2次伝達関数の理解
  • 伝達関数から理論的にPIDの値を求めるやり方がないか調べる
  • プログラム実装して複数のパラメータで同時に検証してみる。
  • サンプルプログラムを自動作成するツールを作る。
  • 一般公開する
  • 箱庭ラボのブログで紹介する

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

平鍋さんの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}) $$

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

これではないか?

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

なるほど!

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

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

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

プラント側

対象の**方程式:

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

P制御側

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

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

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

2次遅れ要素の特徴

  • $\omega_n^{2} = \frac{K_p}{m}$
  • $\zeta = \frac{d}{2\sqrt{mK_p}}$
  • $d$は、定数(0より大きい値)
  • 過制動($\zeta > 1$)
  • 臨界制動($\zeta = 1$)
  • 不足制動($0 < \zeta < 1$)
  • 持続振動($\zeta = 0$) d=0のケースなので対象外とする。

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

特徴とパラメータ候補

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

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

再考:プラント側の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}}$

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

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

2次遅れ要素の特徴

  • $\omega_n^{2} = \frac{K_p}{m}$
  • $\zeta = \frac{d}{2\sqrt{mK_p}}$
  • $d$は、定数(0より大きい値)
  • 過制動($\zeta > 1$)
  • 臨界制動($\zeta = 1$)
  • 不足制動($0 < \zeta < 1$)
  • 持続振動($\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}$

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

試してみた(その1)

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

Figure_1

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

試してみた(その2)

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

Figure_2

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

試してみた(その3)

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

所感

  • $\zeta$ が0に近づくに連れて、持続振動になることが再現された。
  • $\zeta$ が1に近づくと、不足振動になり、振動数およびオーバーシュート量が減るが、収束時間は非常に長い。約3時間かかる。

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

プラント側の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}}$

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

PDパラメータ探索の方針

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

Kp = 0.25
Kd = 2.234730306

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

drone_dynamics.csv

Figure_4png

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

Kp = 0.0000025
Kd = 0.00607

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

drone_dynamics.csv

Figure_5

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

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

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

プラント側の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}}$

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

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

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

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

from hakoniwa-px4sim.

kenjihiranabe avatar kenjihiranabe commented on June 16, 2024

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

  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)点と軌跡の関係)

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

from hakoniwa-px4sim.

tmori avatar tmori commented on June 16, 2024

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

from hakoniwa-px4sim.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.