ラップトップとTello間の情報の送受信に必要なポート情報については,Tello SDK 2.0 User Guideによると,送受信は以下のポートから行えると書いてあります.
- TelloのIPアドレス: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の様々なコマンドが記載されていますが,今回は離陸した後に着陸するだけのプログラムなので,使用するのは,以下の二つです.
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((self.host_ip, self.host_port))
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()
そして,ターミナルから以下のように(この例では上記のコードに 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'}
$
結果としては離着陸に成功したのですが,何故,最初の時点で反応しなかったのかは,謎のままです.
0 件のコメント :
コメントを投稿