箱庭で作ったドローン機体の制御方法について考えてみよう


今の箱庭ドローン・シミュレータについて説明する連載ブログ、第2回目は、制御側のお話です(前回のブログはこちら)。

箱庭で作ったドローン機体、やっぱり動かしてみたいですよね。

でも前回の式の意味を理解しないと、どう手を出せば良いかわからないので、前回の数式をベースにして、ドローンの動作原理の話を少しだけ挟もうと思います。

ローターのプロペラを回転するとどうなるか

ドローン機体を動かすためには、ローターのプロペラを回転させる必要があります。

ただ、どのローターをどれだけ回転させれば良いでしょうか。

思い通りにドローンを動かすためには、ローターの回転数と推力、トルクの関係式が必要となりそうです。

そして、そのための変換式が、こちらですね。

ω1〜4 が各ローターの回転数です。ローターの回転数の二乗が、推力u、トルク(τφ、τθ、τψ)になります。

例えば、ω1〜4 をすべて同じ回転数で重力を超える推力uが得られれば浮上します。

また、ω4がω2 よりも大きな回転数であれば、τφが正の値となります。

τφは、機体の姿勢を左側に回転するトルクなので、ドローンは左に傾き、結果として左方向に移動します。

同じように、ω3がω1よりも大きな回転数であれば、τθが正の値となります。

τθは、機体の姿勢を前方向に回転するトルクなので、ドローンは前に傾き、結果として前方向に移動します。

τψは、ドローンを z 軸方向の回転を与えるトルクです。

ローターの特性として、プロペラを回転すると回転の逆方向にトルクがかかります。

ローターのプロペラが全部同じ方向で回転してしまうと、ドローンがくるくる回ってしまいます(そのため、ドローンのローターは交互に回転方向が逆になっています)。

ω1とω3の方が、ω2とω4よりも回転数が大きければ、τψは正の値になり、z軸方向に回転します。

推力とトルクからローターの回転数を求めたい

以上より、ローターの回転数を適切に与えれば、ドローンを期待した動きを作れそうです。

ただ、ωの回転数だけでドローンの動きをイメージするのは難しいと思いませんか。

できれば、式9の左辺の値で考えたいですよね。「推力はこれだけで、トルクはこれだけで」と。

そのためには、式9の左辺値を与えて、各ローターの回転数を決めたくなると思います。

そのために、以下のように逆行列を作りました。

これで、ドローンに与えたい力(u、τφ、τθ、τψ)を決めると、各ローターの ω^2 が決まります。

これをC言語で書いたものがこちらです。

#define CONST_P    (0.25f)
#define CONST_LP   (0.5f)
#define CONST_K    (0.25f)

    out.w[0] =    ( ( CONST_P  / phys.param.p ) * signal.thrust )
                - ( ( CONST_LP / (phys.param.l * phys.param.p )  ) * signal.torque.y )
                + ( ( CONST_K  / (phys.param.k )  ) * signal.torque.z )
                ;
    out.w[1] =    ( ( CONST_P  / phys.param.p ) * signal.thrust )
                - ( ( CONST_LP / (phys.param.l * phys.param.p )  ) * signal.torque.x )
                - ( ( CONST_K  / (phys.param.k )  ) * signal.torque.z )
                ;
    out.w[2] =    ( ( CONST_P  / phys.param.p ) * signal.thrust )
                + ( ( CONST_LP / (phys.param.l * phys.param.p )  ) * signal.torque.y )
                + ( ( CONST_K  / (phys.param.k )  ) * signal.torque.z )
                ;
    out.w[3] =    ( ( CONST_P  / phys.param.p ) * signal.thrust )
                + ( ( CONST_LP / (phys.param.l * phys.param.p )  ) * signal.torque.x )
                - ( ( CONST_K  / (phys.param.k )  ) * signal.torque.z )

左辺値は、ω二乗の項ですので、この後、sqrt関数でルートをとっています。(負の値にならないように注意が必要です)

デモ

それでは、箱庭上で、推力とトルクを使って、ドローンを動かしている様子をお見せします。

シミュレーション開始すると、上昇の推力が与えられて、地上6mまで浮上してホバリングします。

次に、キーボードで、左に移動するコマンド(j)を発行すると、機体が左に傾いて、左に移動します。

逆に、キーボードで、右に移動するコマンド(l)を発行すると、機体が右に傾いて、右に移動します。

今度は、視点を少し変えて、前後方向です。

キーボードで、前に移動するコマンド(i)を発行すると、機体が前に傾いて、前に移動します。

キーボードで、後ろに移動するコマンド(m)を発行すると、機体が後ろに傾いて、後ろに移動します。

最後は、ヨー方向です。

キーボードで、左回転するコマンド(f)を発行すると、機体が左回転します。(ちょっとオーバーな動きですが・・)

キーボードで、右回転するコマンド(g)を発行すると、機体が右回転します。

これで、機体の動きを箱庭のシミュレーションで確認できました。

ここでお話しできなかったこととして、この機体の移動や回転では、実はドローン制御モデルで細かな制御を行なっています。

そして、その制御プログラムに対して、キーボードで指示を送っていました。

このプログラムも箱庭上で動作しています。こういうアーキテクチャです。

今日はここまでです。次回は、制御側がどのように実装されているかをお話ししたいと思います。


“箱庭で作ったドローン機体の制御方法について考えてみよう” への1件のコメント

  1. […] 前回のブログでは、箱庭ドローン・シミュレータの概要を紹介しました。今回は、その中でもh箱庭ファン必見?の内部設計に焦点を当ててみましょう。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP