2018.01.22Arduinoでドローン(クアッドコプター)の姿勢制御プログラムを自作してます。以前にArduinoからモータの回転方法を紹介したのですが、今回は機体姿勢をモーター回転数から制御する部分(PID制御)のアルゴリズムを紹介したいと思います。(これまで製作日記はこちらのページに纏めていってます)▼テスト飛行の様子▼ラジコンがほとんど未経験で・・。今回は、「PID制御」の部分。機体の角度(傾き)からモータ回転数を決定する部分です。モーター回転数と姿勢の関係まずはモーター回転数と姿勢の概要です。説明の前提として×字型の4個モーターのドローンです。▼上昇下降▼4個のモーター全ての回転数を上げれば上昇。ある2個のモーターの回転数を上げて、右にある2個のモーターの回転数をさげれば、右へ傾き、右へ移動します。ろのモーターの回転数を上げて。前のモーターの回転数を下げれば前進します。▼旋回▼ペラ(モータ回転)の反作用で機体が旋回します。上の絵のように右回転のモーター回転を上げると反時計まわりに回転します。いうことで考え方は割と単純です。姿勢を制御する場合は、モーター回転数を機体の傾きに合わせて変えてやればいいわけです。単純に4個のモーター全てを同回転数で廻してあげれば?とも思いますが、モーター、プロペラの固体差や、外乱(ノイズや風・・など)、機体バランスなどなどいろいろな要因があるため、そんなに簡単ではありません。浮かすことは可能でしょうが、コントロールどころではないと思います。そこで機体の傾き(姿勢)に合わせて、それぞれのモーター回転数をリアルタイムに制御する必要があります。(±はセンサー取得値により変わると思います。ここでは一例です)イメージですが、基本的にはこんな考え方で行いました。(いくつかオープンソースのフライトコントローラーを参考にしてます。)各軸廻りの角度をミックスしてモーター回転数に反映するイメージです。このままですとPID制御で言う所のP制御(比例項:目標に対する差分)のみでの制御となります。比例項のみで制御すると機体が暴力的な暴れ方をしてしまい大変危険な目に合うか、どこかにすっ飛んでいってしまうため注意が必要です。そこで安定した飛行を実現するためにPID制御を行います。(私が参考にしたオープンソースのフライトコントローラーは全てPID制御でやってました。▼PID制御のイメージ▼イメージです・・・。roll、pitchの制御です。「角速度のPID制御」の外側に「角度のPI制御」ループを設けてます。角度制御で「目標となる角速度」を決めて角速度をPID制御してます。このような制御で行えば、送信機で無操作時には水平を保つような制御が行われます。ラジコン操作の技術がそこそこあれば角速度制御だけでも飛行させることは十分可能かと思いますが・・。微分項は「微分先行型」で行ってます。急な外乱でも大きな操作量が発生しないはず?・・。普通の微分項と比較していないので効果はよくわかりません・・。積分項はたまり過ぎると反応が悪くなりそうなのでソフトで飽和しないように制限かけてます。roll、pitchは上記アルゴリズムですが、yaw回転の制御に関しては「角速度のPI制御」のみで行ってます。それでも十分安定してました。いった感じで算出した「制御量」で各モーター回転数を制御して安定した飛行を行います。記事冒頭の動画はこの考え方でプログラム組んで飛ばしてます。姿勢制御のみなので、風などで当舵あてたり、上昇下降も細かな操作技術が必要となってしまいますが・・。自律飛行を目指して、これからセンサー増やすなど、、アルゴリズムについてもまだまだ改良していくつもりです。ほんとは具体的ソースも例に絡めて紹介したかったのですが・・・。ソースの説明は難しいし、、私の文章表現力が拙くて・・・、簡単に説明できそうにありません。この手の内容はそもそもあまり需要がないかな・・。17:09はじめましてimoさん僕は高校でドローンを使って研究をやっている者です。充電を無人で行えるようにする研究です。現在は姿勢制御の段階ですが、Genuinoだとクロックが追いつかずなかなか苦労しています。imoさんの研究はとても参考になり、価値のあるものだとおもいます。どのようなプログラムでimoさんが飛ばしているのかかなり気になります。