前面介紹了UDP的控制,接下來就要進入python的控制了。
這邊雖然說是python控制,但實際上,我們還是遵循著Tello的設定,透過UDP的方式將訊號傳遞給Tello,因此這邊會提供我找過網站上的操作方法說明,並提供自己覺得最穩定操作方式。
這邊先提供官方的python程式碼:(取自:https://www.dji.com/tw/robomaster-tt/downloads )
註:建議用python 2.7版本
# 用户可以通过本程序实现键盘输入SDK程序控制Tello无人机
# 调用相关的模块
import socket
import threading
import time
import sys
# Tello的IP和接口
tello_address = ('192.168.10.1', 8889)
# 本地电脑的IP和接口
local_address = ('', 9000)
# 创建一个接收用户指令的UDP连接
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(local_address)
# 定义send命令,发送send里面的指令给Telo无人机
def send(message):
try:
sock.sendto(message.encode(), tello_address)
print("Sending message: " + message)
except Exception as e:
print("Error sending: " + str(e))
# 定义receive命令,循环接收来自Tello的信息
def receive():
while True:
try:
response, ip_address = sock.recvfrom(128)
print("Received message: " + response.decode(encoding='utf-8'))
except Exception as e:
sock.close()
print("Error receiving: " + str(e))
break
# 开始一个监听线程,利用receive命令持续监控无人机发回的信号
receiveThread = threading.Thread(target=receive)
receiveThread.daemon = True
receiveThread.start()
# 告诉用户做什么
print('输入一个Tello SDK命令并按回车键,初始命令command,输入“quit”结束程序')
# 无限循环等待指令输入直到输入“quit”或ctrl-c
while True:
try:
# 读取用户从键盘输入的指令
if (sys.version_info > (3, 0)):
message = input('')
else:
message = raw_input('')
# 如果用户输入quit就结束循环并关闭socket
if 'quit' in message:
print("Program exited sucessfully")
sock.close()
break
# 把指令发送给Tello
send(message)
# ctrl-c退出并关闭socket
except KeyboardInterrupt as e:
sock.close()
break
上面程式運作後的結果是

這邊我們就可以輸入command,他會跳出OK;然後再輸入其他的指令來控制Tello做出回應和動作。但如果今天我們希望所有的動作都在這組程式裡面直接完成呢?
# 用户可以通过本程序实现键盘输入SDK程序控制Tello无人机
# 调用相关的模块
import socket
import threading
import time
import sys
host = ''
port = 9000
locaddr = (host,port)
# Tello的IP和接口
tello_address = ('192.168.10.1', 8889)
# 创建一个接收用户指令的UDP连接
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(locaddr)
# 定义send命令,发送send里面的指令给Telo无人机
def send(message, delay):
try:
sock.sendto(message.encode(), tello_address)
print("Sending message: " + message)
except Exception as e:
print("Error sending: " + str(e))
time.sleep(delay)
# 定义receive命令,循环接收来自Tello的信息
def receive():
while True:
try:
response, ip_address = sock.recvfrom(128)
print("Received message: " + response.decode(encoding='utf-8'))
except Exception as e:
sock.close()
print("Error receiving: " + str(e))
break
# 开始一个监听线程,利用receive命令持续监控无人机发回的信号
receiveThread = threading.Thread(target=receive)
receiveThread.daemon = True
receiveThread.start()
send("command", 3)
send("takeoff", 5)
send("land", 1)
time.sleep(5)
# Print message
print("飛行完成")
sock.close()
稍微修改上面的程式後,就可以直接透過python運作Tello。
# 用户可以通过本程序实现键盘输入SDK程序控制Tello无人机
# 调用相关的模块
import socket
import threading
import time
import sys
host = ''
port = 9000
locaddr = (host,port)
# Tello的IP和接口
tello_address = ('192.168.10.1', 8889)
# 创建一个接收用户指令的UDP连接
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(locaddr)
# 定义send命令,发送send里面的指令给Telo无人机
def send(message, delay):
try:
sock.sendto(message.encode(), tello_address)
print("Sending message: " + message)
except Exception as e:
print("Error sending: " + str(e))
time.sleep(delay)
# 定义receive命令,循环接收来自Tello的信息
def receive():
while True:
try:
response, ip_address = sock.recvfrom(128)
print("Received message: " + response.decode(encoding='utf-8'))
except Exception as e:
sock.close()
print("Error receiving: " + str(e))
break
# 开始一个监听线程,利用receive命令持续监控无人机发回的信号
receiveThread = threading.Thread(target=receive)
receiveThread.daemon = True
receiveThread.start()
box_leg_distance = 100
send("command", 3)
send("takeoff", 5)
send("forward " + str(box_leg_distance), 4)
send("land", 1)
time.sleep(5)
# Print message
print("飛行完成")
sock.close()
往前飛10公分後降落。
而雖然透過這種方式就能進行基本操作,但實際運作起來還是有些不順暢。
另外提供官方Github供大家參考 https://github.com/dji-sdk/Tello-Python
