Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 7811

Tello が宙返りしてくれない理由はバッテリー消費量 - ジャコ Lab

$
0
0

ドローン

昔々、元気に空を舞う小さなドローン Tello がいました。先日、色々試した結果、宙返りを頼んだところピクリとも動かず着陸してしまいました。「どうしたのじゃ、Tello よ?」

ユーザーマニュアルをちゃんと読みましたよ

宙返りをするには充電量が50%以上必要

Tello ユーザーマニュアル v1.0

Tello の公式アプリでは インテリジェント フライトモードというものがあるようで、バウンスモード , 8Dフリップ , Throw & Go , EZショット , Circle , Up & Awayがあるようです。

今回は「宙返り」をやりたいので、公式アプリ的には「8Dフリップ」が該当します。

SDKだと4方向だったけど、公式アプリだと8方向なの?

Throw & GoSDKで実現しようとすると出来ないとかあるんですかねぇ?「空中に放たれたら離陸」ってことをしないといけないってことですね。そのまま投げ捨てるように地面にポイッってする形になりかねない・・・

それは置いといて・・・
この インテリジェント フライトモードというものが、バッテリーが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))

まとめ

無事、宙返りすることができました

Viewing all articles
Browse latest Browse all 7811

Trending Articles