本リポジトリでは、箱庭ドローンの数式を線形モデル化して、解析的にドローン制御のPIDパラメータを調査する方法をまとめています。
具体的には、こんなことができます。
- 解析的なPIDパラメータ調査手法としては、ボード線図や位相線図の作成からステップ応答解析などを Pythonライブラリで簡単に行えます。
- 解析的に求めたパラメータを箱庭ドローンシミュレータで動作確認できます。この際、遅延時間やオーバーシュート量などを定量的に評価できます。
箱庭ドローンの物理モデルはこちら。
現時点(2024/11/19)では、まだ開発中のステータスであり、こちらでその構想を説明しております。
- 物理モデル
- 制御モデル
- 線形モデル解析
- 線形モデルのシミュレーション評価(TODO)
- 制御設計仕様定義(TODO)
- 解析評価(TODO)
- ラプラス領域
- 時間領域
- 周波数領域
- PID制御シミュレーション評価(TODO)
- ツールの説明
箱庭ドローンおよび制御モデルの線形モデル化については、こちらを参照してください。
線形モデル解析では、Pythonライブラリを利用します。
そのため、最初に、以下のコマンドでPythonライブラリをインストールしてください。
pip install -r requirements.txt線形モデル解析は以下の2ステップで行います。
- 解析的に求めた線形モデルの伝達関数を Json ファイルで定義する
- 定義したJsonファイルの伝達関数を用いて、古典制御ベースの道具を用いて解析を行う
以下のコマンドを実行することで、線形モデル解析を行うことができます。
python src/libs/pid_param_view.py models/expanded_models/expanded_control_alt_spd.json --uptime 100 --input_increment 0.01 --step --bode成功すると、下図のように、ステップ応答とボード線図および極配置図が表示されます。
左下にあるPIDパラメータ調整を行うことで、ステップ応答やボード線図、極配置図が変化します。
本ツールの使い方の詳細は、helpを参照してください。
python src/libs/pid_param_view.py -h
usage: pid_param_view.py [-h] [--uptime UPTIME] [--max_input_value MAX_INPUT_VALUE] [--input_increment INPUT_INCREMENT] [--step] [--bode] [--ny] [--p P] [--i I] [--d D] file_path
PID パラメータ調整とステップ応答
positional arguments:
file_path Transfer function JSONファイルのパス
options:
-h, --help show this help message and exit
--uptime UPTIME グラフ描画間隔。単位はmsecです
--max_input_value MAX_INPUT_VALUE
入力可能な最大値
--input_increment INPUT_INCREMENT
数値入力のステップサイズ
--step ステップ応答を表示するかどうか
--bode ボード線図と位相線図を表示するかどうか
--ny ナイキスト線図を表示するかどうか
--p P Pゲインのパラメータ名
--i I Iゲインのパラメータ名
--d D Dゲインのパラメータ名- MacOS(AppleSilicon/Intel)
- Ubuntu 22.0.4
- Windows/WSL2
本リポジトリーをクローンします。
git clone https://github.com/toppers/hakoniwa-drone-education.gitワークスペースを作ります。
cd hakoniwa-drone-education && mkdir workspaceワークスペースに移動します。
cd workspaceインストーラを起動します。
bash ../installer/install.bash
インストールが成功すると、以下のようになります。
% ls
hakoniwa-px4sim hakoniwa-webserver root setup.bash static.webgl.zip箱庭ドローンシミュレータのバイナリやコンフィグファイル類は、すべて root に入っています。
setup.bash は、環境変数定義ファイルです。ツール利用する際に source してください。
シミュレーション評価設定ファイルを作成します。
例:src/drone_evaluation/input/spd_z-step-input.json
{
"simulation": {
"simulation_time_step": 0.001,
"type": "controller",
"controller_type": "spd_z",
"signals": {
"step1": {
"type": "step",
"parameters": {
"comment": "target speed z : 1 m/sec",
"offsets": [ 1 ]
}
},
"step2": {
"type": "step",
"parameters": {
"comment": "target speed z : 0 m/sec",
"offsets": [ 0 ]
}
},
"step3": {
"type": "step",
"parameters": {
"comment": "target speed z : 1 m/sec",
"offsets": [ 1 ]
}
}
},
"signal_input_timings": [
{
"name": "step1",
"duration_sec": 99.0
},
{
"name": "step2",
"duration_sec": 100.0
},
{
"name": "step3",
"duration_sec": 100.0
}
]
},
"evaluation": {
"step_evaluation": {
"config_params": {
"AXIS": "Vz",
"INVERT_AXIS": true,
"EVALUATION_START_TIME": 200.0,
"CONVERT_TO_DEGREE": false
},
"target_params": {
"TARGET_TR": 2.0,
"TARGET_TD": 1.01,
"TARGET_OS": 0.04,
"TARGET_TS": 5.49,
"TARGET_VALUE": 1.0
}
},
"input_data": {
"log_file": "in.csv",
"cache_len": 1024
},
"output_data": {
"log_file": "drone_log0/drone_dynamics.csv"
}
}
}詳細は、シミュレーションと評価設定フォーマット を参照してください。
cd workspacesource setup.bashZ軸方向の速度制御の評価を実行する場合は、以下のコマンドを実行してください。
bash ../src/drone_evaluation/evaluate.bash ../src/drone_evaluation/input/spd_z-step-input.json成功すると以下のようにログファイルが出力されます。
% ls drone_log0
drone_dynamics.csv log_baro.csv log_gps.csv log_mag.csv log_rotor_1.csv log_rotor_3.csv
log_acc.csv log_battery.csv log_gyro.csv log_rotor_0.csv log_rotor_2.csv log_thrust.csvTODO: 結果の解析方法はペンディング中。
PIDパラメータは、以下に配置されていますので、適宜変更してください。
src/drone_control/config/param-api-mixer.txt
箱庭ドローンのシミュレーションと評価に使用されるJSON設定ファイルの構造について説明します。 このJSON設定ファイルを用いることで、シミュレーション条件や入力信号、評価基準を簡単に設定・変更することができます。以下に各項目の詳細を説明します。
simulation: シミュレーション環境および入力信号の設定を含むセクションです。evaluation: 評価基準および関連データファイルを指定するセクションです。
- 型:
float - 説明: シミュレーションの更新間隔(秒単位)。値を小さくするほど精度が向上しますが、計算負荷が増加します。推奨:0.001。
- 型:
string - 説明: シミュレーションの種類を指定します。制御モデルの評価の場合は
"controller"を指定します。プラントモデルの評価開始の場合は"plant"を指定します。
- 型:
string - 説明:
typeがcontrollerの場合は、使用するコントローラー(src/drone_control/workspace)の種類を指定します。 "spd_z": AltSpeedController"pos_z": PositionController"pos": PositionController"spd": SpeedController"angle": AngleController
- 型:
object - 説明: シミュレーションで使用する入力信号を定義します。それぞれの信号には名前、種類、パラメータが含まれます。
type: 信号の種類"step": ステップ信号。急激な変化を与え、ステップ応答を確認するために使用します。"sine": サイン波信号。周期的な入力を与え、システムの周波数応答を確認するために使用します。
parameters: 信号の種類に応じたパラメータ。step:offsets: ステップ信号のオフセット値(配列形式)。
sine:amp: サイン波の振幅(配列形式)。freq: サイン波の周波数(Hz、配列形式)。offsets: サイン波のオフセット値(配列形式)。
- 型:
array - 説明: 各信号を適用するタイミングと継続時間を指定します。
- 項目:
name:signalsで定義された信号の名前。duration_sec: 信号が適用される継続時間(秒単位)。
ステップ応答とサイン波応答の評価基準を定義できます。
- 型:
object - 説明: ステップ応答の評価基準を定義します。
評価設定パラメータ:
AXIS: 評価対象の軸(例:"Vz"はZ軸方向の速度)。INVERT_AXIS: 軸の向きを反転するかどうか(trueまたはfalse)。EVALUATION_START_TIME: 評価を開始する時間(秒単位)。CONVERT_TO_DEGREE: 値を度に変換するかどうか(trueまたはfalse)。
評価の目標値:
TARGET_TR: 立ち上がり時間(秒単位)。TARGET_TD: 遅延時間(秒単位)。TARGET_OS: オーバーシュート率。TARGET_TS: 定常時間(秒単位)。TARGET_VALUE: システムが到達すべき目標値。
- 型:
object - 説明:
signalsで定義した信号時系列データをファイル出力するための情報。
- 型:
string - 説明: シミュレーションで入力した信号時系列データを保存するファイル名。
- 型:
integer - 説明: シミュレーション実行速度調整用のパラメータでありこのサイズ単位でファイル保存する。
- 型:
object - 説明: シミュレーション結果として評価対象とするファイル名を指定します。
- 型:
string - 説明: シミュレーション結果として評価対象とするファイルのパス。
以下の形式で、サイン波信号(sine)用の評価設定を追加します。
- 型:
object - 説明: サイン波応答の評価基準を定義します。
freq:- 型:
float - 説明: 評価対象のサイン波の周波数(Hz)。
- 型:
output_inverse:- 型:
boolean - 説明: 出力の符号を反転するかどうか。
trueで反転、falseでそのまま評価します。
- 型:
start_time:- 型:
float - 説明: 評価を開始するシミュレーション時間(秒単位)。
- 型:
- 型:
object - 説明: サイン波入力信号に関連する評価データの設定。
log_file:- 型:
string - 説明: 入力信号の時系列データを保存するファイル名。
- 型:
axis:- 型:
string - 説明: 評価対象の入力信号軸(例:
"target_vz")。
- 型:
max_val:- 型:
float - 説明: 入力信号の最大値を指定します。
- 型:
cache_len:- 型:
integer - 説明: 入力データのキャッシュサイズ。このサイズ単位でデータを保存します。
- 型:
- 型:
object - 説明: サイン波応答データの評価設定。
log_file:- 型:
string - 説明: 出力信号の時系列データを保存するファイル名。
- 型:
axis:- 型:
string - 説明: 評価対象の出力信号軸(例:
"Vz")。
- 型:




