2022年1月26日水曜日

ドローンPID制御の意味

 この間、今現に作製しているドローンの使用に近づけて、物理的な現象をより再現する形で、PID制御をシミュレーションするという作業をやってきた。それで気づいたことをメモがわりにここに書いておく。

まず何よりも、P制御では、一応揺れが収束はしていくものの、機体の安定を実現するのは困難なレベルだった。とろこが、D制御をしっかり入れると、揺れは、あるいは初期の傾きは一挙に解消して水平を実現してしまう。それは驚くべきほどのレベルでそうなった。

その時のモーター回転に対する、P制御とD制御のレベルをグラフに書かせてみた。最終的には、ほとんど揺れなく水平状態になるのだが、あえてD制御のスケールを少し抑え気味にした時の結果をグラフで示しておこう。

これは、D制御を500というスケールで入れた場合だった。オレンジの線が回転数という単位で見たD制御の調整量の推移である。これに対して、青の線は、同じく回転数で見たP制御のスケールである。回転数で見たとは、そのレベルの回転数の調整がモータに指示されるという意味である。このD制御のレベルを2000まで増加すると、揺れなく、ワンショットで、水平状態を達成してしまう。(ひとつ前の記事を見ればその図を見ることができる)

この状況ですら、P制御だけに比べてみれば、より急速に水平かを実現しているものとなっている。なぜD制御を入れるとそうなるのか。それは、見てもわかるように、調整周期のズレである。P制御は実際の機体の傾きを比例的に反映するが、D制御は、実際の傾きに対して周期が微妙に遅れている。その遅れによって、揺れを打ち消しているのである。

今まで、D制御はパルス的な反応に対して、それをまず打ち消す動きとして現れるというような認識でいた。パルス的な動きが重要だと思っていたのである。しかし、そのようなものは、このシミュレーションの動きの中では現れないし、たとえ現れたとしても姿勢安定化の上で大きな役割を果たさないだろう。

実機の飛行状態のモーターの回転数がログされるようになったので、わかってきたことは、そのようなパルス的なD制御の信号に対して、モータは反応できないということである。だから、D制御は、実機では重要な機能を持たせられないなと思い、P制御だけでなんとかならないかと思うようになっていた。そして、姿勢から周期を推測して、P制御のずれた形での制御信号を与えればなんとかなるのではと思っていたのだが、D 制御はまさにそれをやっていたのである。

sinカーブを微分するとcosカーブになる。つまり、1/4周期、微分は遅れるのである。上の図の揺れの1周期は約1.2秒であり、その1/4は300msである。この遅れこそが素早い収束の動きを実現する決定的要素だと考えられる。

やっぱり信号から回転数へのラグの問題を考えないといけないか。


0 件のコメント:

コメントを投稿

立ち上がらないraspberrypiのネットワーク

 raspberrypiのネットワークが立ち上がらなくなってしまっていた。差し当たって必要ないのでほっておいたが、今日、いろいろ調べてみた。 結局、raspi-confgで、network Configure をdhcpcdから、networkmanagerに変更したら立ち上がる...