昔々、元気に空を舞う小さなドローン Tello がいました。先日、色々試した結果、宙返りを頼んだところピクリとも動かず着陸してしまいました。「どうしたのじゃ、Tello よ?」
ユーザーマニュアルをちゃんと読みましたよ
宙返りをするには充電量が50%以上必要
Tello の公式アプリでは インテリジェント フライトモードというものがあるようで、バウンスモード , 8Dフリップ , Throw & Go , EZショット , Circle , Up & Awayがあるようです。
今回は「宙返り」をやりたいので、公式アプリ的には「8Dフリップ」が該当します。
SDKだと4方向だったけど、公式アプリだと8方向なの?
Throw & Goも SDKで実現しようとすると出来ないとかあるんですかねぇ?「空中に放たれたら離陸」ってことをしないといけないってことですね。そのまま投げ捨てるように地面にポイッってする形になりかねない・・・
それは置いといて・・・
この インテリジェント フライトモードというものが、バッテリーが50%以上じゃないと動かないようなのです。
一旦充電してバッテリー情報を取れるようにしてみる
バッテリー取得コマンド
バッテリー取得コマンドは battery?
です。レスポンスには 0-100
が返却されます。
実際のコード
sock.sendto('flip b'.encode, tello_address)
もう1度後方宙返りを実行する
充電はバッチリです。
実際のコード
import socket import time TELLO_IP = '192.168.10.1' TELLO_PORT = 8889 # PC 側の受信ポート(任意の空きポートを指定) LOCAL_PORT = 9000 def send_command(sock, command, tello_address): print(f'[SEND] command: {command}') sock.sendto(command.encode('utf-8'), tello_address) try: response, _ = sock.recvfrom(1024) # 最大1024バイトを受信 decoded_response = response.decode('utf-8') print(f'Response: {decoded_response}') except socket.timeout: print("No response (timeout)") def main(sock, tello_address): # コマンドを送れるようにする send_command('command', tello_address) # バッテリー取得 send_command('battery?', tello_address) # 離陸 send_command('takeoff', tello_address) time.sleep(1) # 後方宙返り send_command('flip b', tello_address) time.sleep(1) # 着陸 send_command('land', tello_address) if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('', LOCAL_PORT)) # PC 側のポートをバインド sock.settimeout(10) # タイムアウト設定 main(sock, (TELLO_IP, TELLO_PORT))
まとめ
無事、宙返りすることができました