とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【Arduinoドローン自作】NO.7 PID制御のゲイン調整編

前回、PID制御のプログラムを実装しました。

shizenkarasuzon.hatenablog.com

しかし、実装したら最初から飛んでくれるというものではありません。

「ゲイン調整」と呼ばれる作業が必要になります。

ゲイン調整とは

PID制御は、前の記事でも説明しましたが、P制御、I制御、D制御の3つの制御が組み合わさってできた制御アルゴリズムです。
f:id:pythonjacascript:20181123210636j:plain

そのため、それぞれの制御の影響力を調整する必要があります。

調整方法は、上の図のKp、Kd、Kiの値を変更することです。Kp、Kd、KiはそれぞれP制御、D制御、I制御のゲインを表しており、それぞれの制御の出力値は、これらのゲインの値をかけられてから制御量として加算されます(下の式を参照)
f:id:pythonjacascript:20181123193040j:plain

このため、Kp、Kd、Kiの値を小さくすると制御量も小さくなり、反対にゲインを大きくすると、それぞれの制御に敏感に反応するようになる、ということです。


2.実験方法

下の写真のような冶具を作ってゲイン調整を行いました。
f:id:pythonjacascript:20181123211617j:plain

このようにドローンを糸で釣ることによって、このドローンは一軸方向にのみ回転できるようになります。
この状態で、前回の記事で作成したPID制御のプログラムを走らせてどの程度期待が安定するかを確かめました。そして、それぞれのパラメーターの値を様々に変えて、パラメーターの値と安定性の関係を調べました。

また、その時の姿勢角の値とモーターの出力値をグラフ化するプログラムを作成した。

PID制御のゲイン調整(パラメーターのKp、Kd、Kiを調整すること)をはPゲイン(Kp)、Dゲイン(Kd)、Iゲイン(Ki)の順に行った。D制御はP制御で発生する振動を抑えるものであり、I制御は実験であまり効果が確認できなかったからである。

ゲイン調整① P制御

初めにPゲインの調整を行いました。導入前(何も制御していないとき)はプロペラを回し始めた直後から、機体が回転してしまっていました。
しかし、P制御を導入すると、左下の図のように振動する動きが見られました。P制御のみであると、この振動は収まらずほぼ一定の振幅で振動しました。
f:id:pythonjacascript:20181123214220j:plain
(グラフの横軸は時間(秒)、縦軸は青線のグラフが、角度(度)を表し、赤線のグラフが、制御量(PWM信号のμ秒の変化量)を表しています。)

下グラフでは、緑の矢印の長さが振動の振幅を表しています。P制御は機体の傾きを修正しようとする効果があるが、その効果が大きすぎると反対に目標値を通り過ぎてしまい、振動するのだと推測できます。

Pゲインは小さすぎると振動が起きず、ゲインを大きくするにつれて振動の振幅が大きくなりました。

ゲイン調整② D制御

次にDゲインの調整を行いました。P制御のみであると振動が収まらなかったが、Dゲインを導入後、振動が収束(安定)するようになりました。実験中、強制的に機体を傾けたところ(グラフ中の黄色の下向き矢印)、そのような突発的で大きな変化にも対応し、振動を徐々に減らす働きが見られました。
f:id:pythonjacascript:20181123214237j:plain

Dゲインは、小さすぎるとP制御で発生する振動を抑えるのに時間がかかっています(上の図の一番目)。Dゲイン大きくすることに伴い、振動の収束にかかる時間が減り、D=0.1のときに最も速く収束しました(上の図の中央)。
反対に、大きすぎるとD制御本来の特徴である振動を収束させるという働きは全く見られずに、Pゲインよりも速い周期で振動しました(上の図の三番目)。

ゲイン調整③ I制御

最後にIゲインの調整を行った。一般的にI制御の及ぼす影響はPID制御の中でも最も低いと言われている。そのため実験の様子から判断することは困難であったが、グラフから特徴を捉えることができた。

f:id:pythonjacascript:20181123214249j:plain
それは振動が小さいとき、振動の偏差が小さいということです。しかし、IゲインはDゲイン同様、大きすぎると機体が回転するようになりました。また、D制御と同時に実装することで、機体が回転しない値の範囲が広くなっていることも分かりました。

考察

これらの特徴から、P制御は振幅の変化が小さく、その中でも特に振幅が小さいものが理想であり、このような状態は振動を起こすPゲインの中で最も小さい値で起こると予想しました。その結果、実験中の様子とグラフよりPゲインは0.8が最適であると判断しました。
Dゲインは振動の収束までの時間が短いもの、つまり、Fig.50のように機体が回転する直前の最も大きい値のDゲインが最適であると判断した。また、その値は0.18でした。
I制御もD制御同様、機体が回転しない程度に値の大きいIゲインが、最も振幅を小さくし、機体が安定すると考えられる。調整を行い値を求めたところ、それは0.3でした。


限界感度法

上の実験から、このようにしてパラメーターの最適値を求めました。

  1. Kp、Kd、Kiをすべて0に設定しておく
  2. Kpを0から少しずつ上げて、機体が一定振幅で振動を持続するようになったところで Kp の増加を止める。
  3. 次にDゲインを0から少しずつ増加させていき、振動が収まる点をKdの最適値とする。
  4. このとき、機体を押しても目標位置に素早く戻り、その角度で安定することを確認する。
  5. Iゲインを少しずつ上げて、機体が目標に近づく時に起こる数回の振動の偏差が最も小さい時をKiの最適値とする

このようなPIDのパラメータの設定方法を、「限界感度法」といいます。

最終的にPゲインを0.8、Iゲインを0.3、Dゲインを0.18に設定してPID制御をドローンに実装しました。


※これらのパラメータは、ドローンの大きさや処理速度などによって異なる値になります。