
昔々、元気に空を舞う小さなドローン Tello がいました。先日、色々試した結果、宙返りを頼んだところピクリとも動かず着陸してしまいました。「どうしたのじゃ、Tello よ?」
ユーザーマニュアルをちゃんと読みましたよ
宙返りをするには充電量が50%以上必要
Tello の公式アプリでは インテリジェント フライトモード というものがあるようで、バウンスモード , 8Dフリップ , Throw & Go , EZショット , Circle , Up & Away があるようです。
今回は「宙返り」をやりたいので、公式アプリ的には「8Dフリップ」が該当します。
SDK だと4方向だったけど、公式アプリだと8方向なの?
Throw & Go も SDK で実現しようとすると出来ないとかあるんですかねぇ?「空中に放たれたら離陸」ってことをしないといけないってことですね。そのまま投げ捨てるように地面にポイッってする形になりかねない・・・
それは置いといて・・・
この インテリジェント フライトモード というものが、バッテリーが50%以上 じゃないと動かないようなのです。
一旦充電してバッテリー情報を取れるようにしてみる
バッテリー取得コマンド
バッテリー取得コマンドは battery? です。レスポンスには 0-100 が返却されます。
実際のコード
sock.sendto('battery?'.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))
まとめ
無事、宙返りすることができました