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.
40 stars 12 forks source link

現状のPython APIで駆動するフライト制御をもっとキビキビ動くようにしたい #178

Open tmori opened 8 months ago

tmori commented 8 months ago

課題

水平移動が極めて遅い。目的地に到着するのに100秒程度かかってしまう。少なくとも10倍程度にしたい。

目指したいこと

水平移動時のプラントモデルの伝達関数をある程度同定した形で、過渡特性のパラメータをベースにして、理論的にパラメータを求めたい。

参考情報

tmori commented 8 months ago

計測結果

高さの推移

スクリーンショット 2024-03-17 12 46 51

テイクオフ:

takeoff指示から、1秒程度で目標の高さでホバリングしているので、ここは問題ない。

着地:

着地は、10秒くらいかかっている。若干遅い。 ただ、水平移動に比べたら、そんなに気にならないので、一旦、放置する。

tmori commented 8 months ago

計測結果

水平移動の推移

スクリーンショット 2024-03-17 12 50 03
tmori commented 8 months ago

プラントモデル

$$ \begin{array}{llll} \dot{u_e} = &-\frac{T}{m}(\cos{\phi}\sin{\theta}\cos{\psi} + \sin{\psi}\sin{\phi}) & &- \frac{d}{m}u_e \ \dot{v_e} = &-\frac{T}{m}(\cos{\phi}\sin{\theta}\sin{\phi} - \sin{\phi}\cos{\psi}) & &-\frac{d}{m}v_e \ \dot{w_e} = &-\frac{T}{m}(\sin{\phi}\cos{\theta}) &+g &-\frac{d}{m}w_e \end{array} $$

tmori commented 8 months ago

ひとまず、前進の水平移動のみを想定したいので、 $\dot{u_e}$ のみに着目。 $\phi$ = 0°、 $\theta$ = $\omega t$ ° 、 $\psi$ = 0° とおく。

tmori commented 8 months ago

代入して、速度を位置の表現にすると:

$\ddot{x} = -\frac{u(t)}{m}\sin{\omega t} - \frac{d}{m}\dot{x}$

ラプラス変換しやすいようにすると:

$\ddot{x} = -\frac{u(t)}{m} \sin{\omega t} u_s(t) - \frac{d}{m}\dot{x}$

tmori commented 8 months ago

ラプラス変換したもの

$s^{2}X(s) = -\frac{U(s)}{m} \frac{\omega}{s^{2}+\omega^{2}} - \frac{d}{m}sX(s)$

tmori commented 8 months ago

$U(s)$ は、推力だけど、現状、垂直方向のPID制御でしかコントロールできてない。 水平移動時にも推力をコントロールできるようにしなければならないのではないか。

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

tmori commented 8 months ago
kenjihiranabe commented 8 months ago

ここに、すごいいい記事みつけました。PX4の位置制御の方法です。 https://qiita.com/daisuke-iwakura/items/a9257b3f0f75659c3d09

kenjihiranabe commented 8 months ago

今の森さん側の作りを変えずに、ざっくり要点を言うと、

tmori commented 7 months ago

入力のインタフェースをラジコンにする方法もあり。

tmori commented 7 months ago

アーキテクチャ:

スクリーンショット 2024-04-21 11 08 06
tmori commented 7 months ago

スクリーンショット 2024-04-21 12 48 23

tmori commented 7 months ago
スクリーンショット 2024-04-21 11 51 06
tmori commented 7 months ago

スクリーンショット 2024-04-21 12 49 25

tmori commented 7 months ago

作業タスク出し:

tmori commented 7 months ago
スクリーンショット 2024-04-21 16 06 51

この辺りのクラス設計を見直したい。

tmori commented 7 months ago

リファクタリングの方向性、必要性を考える

まずは現行のクラスの役割を一言で言えるか

tmori commented 7 months ago

Mixerの仕様検討

基本式

tmori commented 7 months ago

行列での表現

image

image

スクリーンショット 2024-04-24 9 21 04

※上記で Kr は省く(Ω->D計算の時に後で割る)。

tmori commented 7 months ago

PWMの計算方法

(9/5/2024 平鍋修正)

[Ω^2] = A^-1 M^-1 U
から、Ωi^2 を求める。
Ωi^2の結果からΩiを求める。±√となるが、PWM値は0-1なので、プラスのみ使用する。
ここで、Ωi = Kr Di なので、
Di = Ωi/Kr とする

上記方針だと、Ωi^2 < 0 なる解が出ることがある(逆回転トラストを発生させて、急激に回転させようとする)。そこで、線形化した解を用いて、ホバー時回転数の -50% を下限とするなどをトライ。

[Ωi0 ΔΩi] = (1/2) A^-1 M^-1 ΔU
から、ΔΩi を求める。
Ωi = Kr Di の近似(一時遅れなしに直でステップ応答する近似)を使い、Di = Ωi/Kr とする
tmori commented 7 months ago

上位制御部の設計

3段階に分けて実装する。

  1. 高度制御、速度制御を実装して、ラジコン操作で期待した位置、速度で移動することを確認する
  2. 位置制御、方位制御を実装して、Python API で、期待した位置へ移動することを確認する
  3. ウェイポイントシーケンサを実装して、Python API で、期待した位置へ移動することを確認する スクリーンショット 2024-04-24 14 43 47
tmori commented 7 months ago

Mixerはまだ未完成ではありますが、今後はこちらで管理します。

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

kenjihiranabe commented 2 months ago

https://github.com/toppers/hakoniwa-px4sim/issues/178#issuecomment-2073704541

PWMの計算方法

Ω = A^-1 M^-1 U から、Ωi^2 を求める。 Ωi^2の結果からΩiを求める。±√となるが、PWM値は0-1なので、プラスのみ使用する。

ここで、Ωi = Kr Di なので、

Di = Ωi/Kr

となる

上記は、ラプラス変換での式、Di(s) = (Ktr/(1+s Tr)) * Ωi (式2.48)なので、線形化が必要。 再考中。