今の箱庭ドローン・シミュレータについて説明する連載ブログ、第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)を発行すると、機体が右回転します。
これで、機体の動きを箱庭のシミュレーションで確認できました。
ここでお話しできなかったこととして、この機体の移動や回転では、実はドローン制御モデルで細かな制御を行なっています。
そして、その制御プログラムに対して、キーボードで指示を送っていました。
このプログラムも箱庭上で動作しています。こういうアーキテクチャです。
今日はここまでです。次回は、制御側がどのように実装されているかをお話ししたいと思います。
コメントを残す