Tello Programming 011 -Pythonで離陸と着陸を制御する-

Telloをラップトップから制御して,離陸と着陸をさせるコードのメモです.

ラップトップとTello間の情報の送受信に必要なポート情報については,Tello SDK 2.0 User Guideによると,送受信は以下のポートから行えると書いてあります.

  • ラップトップのIPアドレス:192.168.10.2(ラップトップとTelloWifiで接続すると自動的に割り振られる)
  • ラップトップからTelloへのUDPポート:8889
  • TelloIPアドレス:192.168.10.1
  • Telloからラップトップへの命令に対するUDPポート:8889
  • Telloからラップトップへの情報(状況)送信UDPポート:8890
  • TelloからラップトップへのビデオをストリームするUDPポート:1111
ラップトップとTelloの接続
 
Tello SDK 2.0 User Guide, p.2


また,Tello SDK 2.0 User GuideにはTelloの様々なコマンドが記載されていますが,今回は離陸した後に着陸するだけのプログラムなので,使用するのは,以下の二つです.

 

離陸後に10秒待機して着陸するコードにしてみます.

import logging
import socket
import sys
import time
 
 
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
logger = logging.getLogger(__name__)
 
class DroneManager(object): 
    def __init__(self, host_ip='192.168.10.2', host_port=8889
                 drone_ip='192.168.10.1', drone_port=8889):
        self.host_ip = host_ip
        self.host_port = host_port
        self.drone_ip = drone_ip
        self.drone_port = drone_port
        self.drone_address = (drone_ip, drone_port)
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.bind*1
        self.socket.sendto(b'command', self.drone_address)
        self.socket.sendto(b'streamon', self.drone_address)
    
    def __dell__(self):
        self.stop()
    
    def stop(self):
        self.socket.close()
    
    def send_command(self, command):
        logger.info({'action': 'send_command', 'command': command})
        self.socket.sendto(command.encode('utf-8'), self.drone_address)
    
    def takeoff(self):
        self.send_command('takeoff')
    
    def land(self):
        self.send_command('land')
 
if __name__ == '__main__'
    drone_manager = DroneManager()
    drone_manager.takeoff()
 
    time.sleep(10)
 

 

    drone_manager.land()
 

実行に当たっては,ラップトップとTelloをWifi接続します.

そして,ターミナルから以下のように(この例では上記のコードに drone-manager.pyという名前をつけています)実行するだけです.

$ python3 drone_manager.py


実行した際に,ターミナルでは以下のように命令の送信をしている(プログラムは動いている)にも関わらず,Telloが反応しないというトラブルが生じました....

$ python3 drone_manager.py
INFO:__main__:{'action': 'send_command', 'command': 'takeoff'}
INFO:__main__:{'action': 'send_command', 'command': 'land'}

IPアドレスの割り振りの問題かと思って,Telloとラップトップを接続した状態でのラップトップに割り振られているIPアドレスをSystem Preference(システム環境設定)から調べてみると以下のように,192.168.10.2 が割り振られています.
 
その後,Telloのバッテリーがなくなるまで試行錯誤を繰り返したのですが,状況は変わらず,別のバッテリーに差し替えて試してみたところ,無事にTelloは離陸してホバリングした後に着陸しました.

 

結果としては離着陸に成功したのですが,何故,最初の時点で反応しなかったのかは,謎のままです.

*1:self.host_ip, self.host_port