• 公開日:2018年11月09日
  • | 更新日:2022年10月14日

新入社員が制作実習でドローンの自作に挑戦した話。(4)

姿勢制御

前回までで「モーターの回転」「機体の傾き検出」の2つができるようにしました。次はこの2つを連動させ、姿勢制御を実現することが目標です。

機体の傾きをPWM信号に反映させる

まず機体を傾けたら、PWM信号のDUTY比が変わるようにしました。その結果、たまにDUTY比がMAXになってしまう現象が生じてしまいました。

そこで、MSP430のメインクロックを1MHzから8MHzに変更し、パルス周期である10msごとに割り込みによって出力を変更させ、さらにDUTY比に下限値と、上限値を設けました。これによって出力変化の応答性が上がり、DUTY比がMAXになってしまう現象を解消することができました。

PID制御を組み込む

もっと正確な制御を行うために、PID制御というものを組み込むことにしました。PID制御とは、目標値(xref)と現在値(x)を比較(Proportional)して、全体出力の制御量(y)を制御するものです。また、積分(Integral)と、微分(Differential)を、利用することで、更に細かい調整が可能になります。式で表したものが以下になります。

PID制御の式
PID制御の式

車の運転で例を上げると、停止した状態から時速40km/hに加速したい場合、40km/hになるまでアクセルを踏み込みます。この目標との差に対して行うのが「比例制御(P制御)」です。しかし踏み込んだままでは40km/hを越えてしまいます(オーバーシュート)。なのでアクセルを緩めることで、40km/hをオーバーしないようにします。この緩めるという操作が「微分制御(D制御)」です。最後に、時速40km/hをキープするために、微妙なアクセルの調整を行います。この調整を行うのが「積分制御(I制御)」です。

今回の目標値は角度となっており、制御量はPWM信号のパルス幅、すなわち、モーターの回転数になります。この制御量を調整するために先述の式のKp、Ki、Kdそれぞれを微調整していきます。

ゲイン値を調整する

以下の写真のように機体を紐で宙吊りにし、Kp→Ki→Kdの順で調整をしました。

ゲイン値調整の様子
ゲイン値調整の様子

Kpを少しずつ上げていくと、機体は安定するようになるのですが、上げすぎると激しく振動を始めます。

そこで、振動しない程度にKpを上げ、Kdを応答が早くなるように、かつ、機体が不安定にならないように調整していきます。しかし、Kdを増やしすぎると、外乱を与えた時にやはり振動し始めてしまいます。

KpとKdをうまく調整したところ、外乱を与えても振動しなくなりました。

なんだかいけそうな雰囲気が漂ってきました!

果たしてホバリングできるのか?

早速宙吊り状態から解放して、地面からの浮上に挑戦です。その結果がこちら!

残念ながらホバリングはうまくいきません。。。浮上はするものの、一定の方向に機体が流れてしまいます。そこで、姿勢制御をもっと改良してみることにしました。

さらなる改良、そして成果発表へ

角度の制御だけでなく、角速度の制御も入れることにしました。一旦角度のPID制御から「目標となる角速度」を決定し、その角速度のPID制御から回転数を制御するという、二段構造のPID制御を設けました。以下に、イメージ図を記載します。

PID制御(変更後)
PID制御(変更後)

前回も説明しましたが、角速度とは角度が変化しているときの速度になるので、角度が変化していない限り角速度は発生しません。もし角速度のPID制御のみになると、常に変化しないようにする、つまり現在の角度を維持しようとします。外部からの影響で角度を変化させると、水平に戻そうとするのでなく、その角度を維持しようとします。そこに角度のPID制御(今回はPI制御のみ)を加えると、傾いた分にたいして、水平に戻そうとします。こうすることで、より精度の高い制御を目指します。

このとき、ゲイン値は角度の制御と、角速度の制御で別々に決定しました。先程の手順と同じようにゲイン値を決定しますが、この時角速度のゲイン値を先に決定してから、角度のゲイン値を決定しました。

この時点で発表までの残り時間は一日です。はたして、ドローンは安定してホバリングできるのでしょうか?次回(最終回)をお楽しみに!

新入社員が制作実習でドローンの自作に挑戦した話シリーズ