C#でTelloを操作する。TelloLibを使って。前進後退左右旋回など


はじめに

前回TelloLibというライブラリを使ってプログラムからTelloを操作する、ということをやりました。

しかし、離陸と着陸だけでした。
まったく物足りませんよね。

ということで今回は前進や後退、右旋回、左旋回などをやってみたいと思います。

離着陸以外のTelloの操作

離着陸はそれぞれメソッドが用意されていました。
それでは前進後退、旋回などの操作を行うにはどうするかというと、以下のsetAxisというメソッドがあり、それを使うことでそれらの動作を行うことができます。

Tello.controllerState.setAixs(float lx,float ly,float rx,float ry);

引数のそれぞれの役割は以下のとおりです。
各引数は-1.0~1.0の値をとります。
例えば、lxに-0.5を設定すると左方向に回転します。0.5を設定すれば右方向に回転します。
すべての引数に0を設定すると、その場に静止します。

  • lx:右回転(+)、左回転(-)。
  • ly:上昇(+)、下降(-)。
  • rx:右スライド(+)、左スライド(-)。
  • ry:前進(+)、後退(-)。

各引数の値を調整することで「ゆっくり左旋回」や「前進しながら上昇」といった動作を行うことができます。

さて、setAxisメソッドでTelloの動きを設定しましたが、それだけでは動き始めません。
設定した内容をTelloに送る必要があります。
それがsendControllerUpdateメソッドです。
このメソッドを呼び出すと、先ほど設定した内容でTelloが動き出します。

Tello.sendControllerUpdate();

では実際にやってみましょう、と言いたいところですが、ちょっと待ってください。

仮に以下のように記述して前進させたとしましょう。

Tello.controllerState.setAixs(0, 0, 0, 0.5);
Tello.sendControllerUpdate();

すると、ひたすら前進し続けて、室内であればやがて壁に激突するでしょう。
「40度右回転」とか「1m前進」といった指定はできないのです。

そこで、その動作を「何(ミリ)秒続けるか」といった考えで動作をコントロールします。
つまり、Telloにコマンドを送った後に任意の時間、待機してから静止させればよいということになります。
例えば以下のような感じです。

//前進開始
Tello.controllerState.setAixs(0, 0, 0, 0.5);
Tello.sendControllerUpdate();

await Task.Delay(1000);//1秒待つ

//静止
Tello.controllerState.setAixs(0, 0, 0, 0);
Tello.sendControllerUpdate();

このように秒数で進む距離をコントロールできます。
どのくらいの値で何秒間動かすと何mすすむのかは、試行錯誤が必要になると思いますが。
それによって引数の値と秒数、距離の関係式を求めることができれば「面舵いっぱいよーそろー!」みたいなこともできるかと思います。

Mainメソッドでawait使う場合は言語バージョンをC#7.1以上にしてくださいね。

ついでに右旋回はこんな感じです。

//前進開始
Tello.controllerState.setAixs(0.5, 0, 0, 0.2);//遅めに右旋回
Tello.sendControllerUpdate();

await Task.Delay(1000);//1秒待つ

//静止
Tello.controllerState.setAixs(0, 0, 0, 0);
Tello.sendControllerUpdate();

おわりに

前回と今回合わせてTelloを自由自在に操作することができるようになりました。
おわかりのとおり、コード的にはまったく難しいところがありません。
このライブラリの素晴らしいことったらありません。
感謝です。

今回は入力コマンドに応じて動作させましたが、例えば矢印キーで操作することももちろんできますし、モバイルアプリケーションから利用することもできます(サンプルコードにもありますしね)。

もちろんAlexa(Google Homeでも)で操作することもできるはずです。
以前にngrokを使ってローカルで実行しているAzure Functionsにインターネット側からアクセスする方法を書きましたが、この方法を使ってAlexaのエンドポイントとしてローカル上のAzure Functionosを指定してやれば、きっとできるはずです(試してない)。

追記

あと、Telloのアクションのメソッドとして離着陸以外にフリップがあるのを忘れていました。

Tello.doFlip();

これで後ろに宙返りします。
バッテリー残量が規定値以上という制約がありますが。