[ Tello ] Tello python 控制

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

發表留言