Tell Edu 是一台使用 DJI 大疆創新開發的一款教學用四軸飛行器。飛行器重量(含槳葉與電池)約為80克。內建紅外線與氣壓高度計、LED 指示燈、視訊鏡頭等裝置,使用無線網路 WiFi 進行通訊與控制。最大飛行距離為 100 公尺,最大飛行速度為每秒8公尺,最大飛行時間為 13 分鐘,最大飛行高度為30公尺。內建的相機為 500 萬像素,可照相(JPG格式)與錄影(MP4格式)。
除了一般用手機平板上的 Tello App 控制外,目前官網還支援 Scratch 程式語言、Swift來操作Tello 無人機。不過根據 [Tello SDK 2.0](https://dl-cdn.ryzerobotics.com/downloads/Tello/Tello SDK 2.0 User Guide.pdf) 所描述,您是可以用 UDP 通訊協定來控制這台無人機。也就是說,只要您了解如何使用 SDK 內陳述的方法,將指令送到無人機,就可以達到用其他程式語言(C、Java、Python等),直接操作無人機。
不過進行程式控制之前,您應該要熟悉無人機的基本操作與規範,才不會觸犯國內的相關法規。因為無人機飛行時有一定的速度,失控會造成人員受傷甚至是死亡。如果誤闖機場,造成飛安事故,將會受到嚴重的罰則。進行這方面的實驗,請先閱讀民航法遙控無人機規範,重點摘要與連結如下:
#
# Tello Python3 Control Demo
#
# http://www.ryzerobotics.com/
#
# 1/1/2018
import threading
import socket
import sys
import time
host = ''
port = 9000
locaddr = (host,port)
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tello_address = ('192.168.10.1', 8889)
sock.bind(locaddr)
def recv():
count = 0
while True:
try:
data, server = sock.recvfrom(1518)
print(data.decode(encoding="utf-8"))
except Exception:
print ('\nExit . . .\n')
break
print ('\r\n\r\nTello Python3 Demo.\r\n')
print ('Tello: command takeoff land flip forward back left right \r\n up down cw ccw speed speed?\r\n')
print ('end -- quit demo.\r\n')
#recvThread create
recvThread = threading.Thread(target=recv)
recvThread.start()
while True:
try:
msg = input("");
if not msg:
break
if 'end' in msg:
print ('...')
sock.close()
break
# Send data
msg = msg.encode(encoding="utf-8")
sent = sock.sendto(msg, tello_address)
except KeyboardInterrupt:
print ('\n . . .\n')
sock.close()
break
因此我們就能參考此範例,改寫成 MicroPyhon 支援的版本。
Tello進階的控制指令請參考「https://wifiboy.club/topic/58/tello-%E5%8D%B3%E6%99%82%E9%A3%9B%E8%A1%8C%E6%8E%A7%E5%88%B6%E5%99%A8%E5%AF%A6%E4%BD%9C/13?fbclid=IwAR3Au2TqfvOKDyH0YxW6V_2JAQ_LVbx-KoCB91_0t0bAI37h1Vbs3_fQiMA」
詳細的教學影片請參考「https://www.youtube.com/watch?v=Vgy1s7PkNy4」。
wb.cls((0xe0ff))
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('TELLO-D8C038', "")
while not sta_if.isconnected(): pass
print(sta_if.ifconfig())
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'command', ('192.168.10.1',8889))
data,addr=s.recvfrom(1024)
print(data,addr)
s.sendto(b'battery?', ('192.168.10.1',8889))
data,addr=s.recvfrom(1024)
print(data,addr)
s.sendto(b'takeoff', ('192.168.10.1',8889))
data,addr=s.recvfrom(1024)
s.sendto(b'forward 30', ('192.168.10.1',8889))
data,addr=s.recvfrom(1024)
s.sendto(b'land', ('192.168.10.1',8889))
data,addr=s.recvfrom(1024)