PIDパラメータの調整
前提
できればこちらの記事を先に読んでください。ドローンのピッチ角を制御するためにPIDの調整を行う。
調整
kiを増やす
ki=2: (img), 立ち上がりは早いが安定するまでが少し遅く、最大値も大きくなった。さらに、ハンチング現象も強くなった。
立ち上がり1.6, 安定7.0, 最大角度1.00
ki=4: (img), オーバーシュートとハンチングがさらに強い。
データ...
RPM: 10 is out of bounds. Setting to max RPM.
オーバーシュートが強すぎて、最大回転数を超えてしまった。
めっちゃ増やすとどうなる。
ki=100, ハンチングが一生止まらない。オンオフ制御みたいになった。
RPM: 10 is out of bounds. Setting to max RPM.
RPM: 0 is out of bounds. Setting to 0.
回転数の最大値を設定しているのでドローンが墜落はしなかった。
考察
ki=100にしても最初に目標値に達するまで0.7秒。ピッチ動作は回転数に対する推力の差で調節しているので、推力が小さいのかもしれない。
const float thrustCoef = 0.491f;
thrustCoefを増やす
ki=100固定で、最大推力差のときの立ち上がり0.1秒を目指して、増やしまくる。
thrustCoef=20のときは0.14秒, 100のときは0.12秒で頭打ちが見えてきた。
推力比
推力比は総推力を機体総重量で割った値です。
推力比をrとすると、throttle=1/rのときにホバリングする。
現実のレーシングドローンを参考にして推力比5:1とした。調整がピーキーになるかもと思ってこれくらいに抑えたが、後にもっと推力を上げるかも。
https://www.mepsking.shop/blog/how-to-calculate-drone-motors-thrust.html
mass: 重量, 1
throttle_hover: ホバリング時スロットル, 0.2
maxRpm: 最大回転数, 10
thrustCoef: 定数, 今回の求めたいもの
4: プロペラの数
9.81: 重力加速度
mass * 9.81 = throttle_hover * maxRpm * thrustCoef * 4
計算すると、thrustCoef = 1.23
D動作の調整
最初の調整
各動作の効果, 15p
オフセットはないので、積分動作はいらない。振動的な応答を抑えるために微分動作を加える。
16pの「PID 各定数の調整手順」に沿って、調節する。
- 比例動作で振動が出ない程度に大きく
- 微分動作で振動が出ない程度に大きく
- さらに比例動作を振動が出ない程度に大きく
振動が出ないの基準はどうする?
2回振動で目標値に達する、と定義する。
kp=0.63, (image)
微分動作も入れたものでは、一度も振動なしを目指す(オーバーシュートは10%許容, つまり0.75+0.075=0.83未満)。ドローンの安定飛行を優先するため。
kd=15がいい感じ(image).
調整方法を発展させる
ここで、先ほどの手順を繰り返せばもっと性能を上げられるのではと考えた。
- 比例動作を大きく => 二回振動まで
- 微分動作を大きく => オーバーシュート10%許容
- 1に戻る
kp=2.5, kd=55(image), 約3秒で目標値に落ち着く。約6秒で落ち着く(kp, kd)=(0.63, 15)の二倍
最初のやり方を変える
kpとkdどちらも大きくするとパフォーマンスが上がっているので、比例動作を最初でもっと大きくするべきかもしれない、と考えた。
先ほどは振動が出ない程度を2回振動としたが、基準をゆるめてkpを大きくしてみる。基準は発振しない程度。
kp=100にするとオンオフになるが、もともとの境界値より、発振しないので基準を変える。
kp=10, 20秒以内に収束するという基準にした。
微分動作は振動が出ない、オーバーシュートなし目指す。
kd=200
最後に比例動作を強くする。
kp=25,kd=200 (img)
完璧!!
考察
- ドローンの重量の配置やプロペラの中心からの距離などの、ドローンの物理的特性によって変わる。
-
RPM: 0 is out of bounds. Setting to 0.がずっと出ていて、pitch以外の動きをしたいときに上手く動作しない可能性がある