前面介紹了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