ドローン製作記のメインページ 【完全自作】Arduinoを使用した自作ドローンの製作記(完成)
前回は,どのように姿勢を推定するかを説明しました.
今回は,その得られた角度を使用したPID制御を説明したいと思います.
-
PID制御とは
PID制御という,おそらく世界の制御機械の9割以上で使われている制御法について説明します.
PIDとは,PとI,Dの3種類の要素を組み合わせたものです.この3つを簡単に説明したいと思います.簡単に説明するために矛盾があるかもしれません.
-
P制御(Proportional /比例)
目標値と現在値の差に比例した出力をします.
Pゲインを簡単に説明すると,どの程度の強さで制御するかのパラメータと考えれば良いです.
(例1)目標値:0[deg]
現在値:5[deg]
Pゲイン:50
この場合は,(5-0)×20=100,すなわち出力は100になります.
(例2)目標値:0[deg]
現在値:0[deg]
Pゲイン:50
この場合は,(0-0)×20=0,すなわち出力は0になります.
このP制御では,目標値に近くにつれて出力が弱くなっていきます.すなわち,目標値には近づきますが,目標値に到達することは100%ありません.この差を定常偏差と言います.これは,数学的に証明されていることで,詳しく知りたい方は最終値の定理で検索して見てください.どの程度まで到達するか計算することができます.
このP制御では,ゲインによっては出力が振動してしまいます.(発振という)
-
I制御(Integral/積分)
P制御の特徴である”目標値に到達しない”という現象をカバーしてくれるのが,このI制御です.
P制御で到達しなかった”差”を積分(積み重ねる)ことで,大きな操作量になります.これによって,目標値に到達させることができます.
-
D制御(Derivative/微分)
D制御の特徴として,変化に対抗するような動きを見せます.
例として,車で運転中に最短時間で60km/hまで速度を上げたいとします.しかし,60km/h以上を出すと違反なので,オーバーしないように加速しないといけません.
この場合,加速初期はアクセルを踏みますが,50km/hに到達したあたりでアクセルを緩め始めなければなりません.この緩めるという動作がD制御の役割です.
すなわち,P制御で生じた振動は,D制御で打ち消すことが可能です.
Wikipediaより,https://ja.wikipedia.org/wiki/PID制御
この動画をみればよくわかると思います.
- Pゲインを増やすことで目標値には近くが,”ズレ”があり,発振(振動)する
- Iゲインを増やすことで,目標値との”ズレ”がなくなる
- Dゲインを増やすことで,発振(振動)がなくなる.
-
PID制御のプログラム
実際に作った,PID制御のプログラムは以下のものです.
ドローンに使用したプログラムから抜粋しました.
errDegY:目標値と計測値の差
preErrDegY:前回のerrDegYの値
degY:計測値
refDegY:目標値
sumErrY:偏差の積分値
dt:制御ループの時間
PgainRollPitch:Pゲイン
IgainRollPitch:Iゲイン
DgainRollPitch:Dゲイン
2件のコメント