見出し画像

Telloの高度制限をC#で解除する方法

トイドローンTelloの高度制限を解除(というか変更)してみました。

アプリも作ったんですけどね

どっちも無料です。ネットの公開情報を元に作ったんでお金取るのもね。

以下はC#でやる方法です。プログラムからやれば30m以上に設定することも出来ます。

結果は自己責任となります。コードを読んで意味がわからない方は試さないでください。

検証したTelloのファームウェアは2018/05/03時点で最新の01.03.33.01と一つ前の01.03.18.01です。これら以外のバージョンについては分かりません。

English Version

Steps to change Tello's altitude limit.

1.Download TelloPC project.
https://github.com/Kragrathea/TelloPC

2.Open "Tello.sln" by Visual Studio.

3.Add function to Tello/Program.cs.


//-----------------
public static byte[] createSetAltitudePacket(int altitude)
{
   //template
   var packet = new byte[] { 0xcc, 0x00, 0x00, 0x00, 0x68, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
   //                        start size        crc   type  command     seq         data        crc       13byte
   int len = packet.Length;
   packet[ 1] = (byte)(len << 3);//ex:0x0d->0x68
   packet[ 9] = (byte)(altitude & 0xff);
   packet[10] = (byte)((altitude >> 8) & 0xff);
   calcUCRC(packet, 4);
   calcCrc(packet, packet.Length);
   return packet;
}
//-----------------

4.Add code to under the "if (joyState.Buttons[0])" block.

if (joyState.Buttons[1])//B{
   var altSetPacket = createSetAltitudePacket(18);//Set altitude limit to 18m.
   client.Send(altSetPacket);
}

5.Build and run.

6.Set by pressing the B button on the game pad.

参考にしたサイトとか

C#でパソコンに繋いだゲームパッドで動かすサンプル。

コマンドパケットのフォーマットなど。

Pythonによるコントロールプログラム

以上を踏まえて、TelloPCをちょっと改造する

まずはTelloPCをダウンロードして解凍。

パソコンをTelloのWi-Fiに繋ぎ、TelloPCのプロジェクトをVisualStudioで実行するとパソコンに繋いだゲームパッドでTelloを動かせるようになります。

ざっとTelloPCの内容を確認してみましょう。UDPのソケット通信でコマンドパケットを送ってコントロールしています。

上記のプログラムに関数を1個追加します。intで渡されたメートルによって高度制限を変更するパケットを生成する関数です。

public static byte[] createSetAltitudePacket(int altitude)
{
    //template
    var packet = new byte[] { 0xcc, 0x00, 0x00, 0x00, 0x68, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    //                        start size        crc   type  command     seq         data        crc       13byte

    int len = packet.Length;
    packet[ 1] = (byte)(len << 3);//サイズは3ビット左 0x0d->0x68
    packet[ 9] = (byte)(altitude & 0xff);
    packet[10] = (byte)((altitude >> 8) & 0xff);

    calcUCRC(packet, 4);
    calcCrc(packet, packet.Length);

    return packet;
}

※実行はあくまでも自己責任です。このコードで2018/05/03時点では高度制限を変更できますが、将来は分かりませんし結果は保証しません。

それと、Send joystick updatesループの適当な場所にこんなコードを埋めます。

if (joyState.Buttons[1])//B{
    var altSetPacket = createSetAltitudePacket(18);//18mに設定
    client.Send(altSetPacket);
}

雑な実装ですが、Bボタンを押すと高度制限が18mになります。createSetAltitudePacketで作ったパケットをSendするとTelloに新しい高度制限の値がセットされます。

TelloPCはデータを受信してるのかよく分からないので、結果はアプリで確認しました。

変更できたか確認

上記コードで変更後、アプリで確認しましたが変更できていました。

機体が小さいので、高度30mを越えると目視が難しくなります。機体ロストのリスクがあるのでほどほどにしておきましょう。

逆に、高度制限を1mとか2mにすると室内で飛ばすときに天井や電灯の紐にぶつからなくていいですね。

注意

このコードや制限解除アプリの使用は自己責任です。

また、無償で入れるTello保険は改造Tello

だと適用外になる可能性があります。その辺もご注意ください。

Javaでやる方法も書きました

TelloPCを参考にしてJavaで高度制限を書き換える方法とか、そのための通信プロトコルについて書きました。

Javaで書けるとスマホのアプリになります。

わぁい、サポート、あかりサポートだい好きー。