【Arduino自作ドローン】No.5 PID制御プログラムの作成

ドローン製作記のメインページ 【完全自作】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制御

この動画をみればよくわかると思います.

  1. Pゲインを増やすことで目標値には近くが,”ズレ”があり,発振(振動)する
  2. Iゲインを増やすことで,目標値との”ズレ”がなくなる
  3. Dゲインを増やすことで,発振(振動)がなくなる.




 


  • PID制御のプログラム

実際に作った,PID制御のプログラムは以下のものです.
ドローンに使用したプログラムから抜粋しました.

errDegY:目標値と計測値の差
preErrDegY:前回のerrDegYの値
degY:計測値
refDegY:目標値
sumErrY:偏差の積分値
dt:制御ループの時間
PgainRollPitch:Pゲイン
IgainRollPitch:Iゲイン
DgainRollPitch:Dゲイン




 

2件のコメント

返信を残す

メールアドレスが公開されることはありません。