iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

WiFiBoy Python 玩學機介紹系列 第 24

24. 控制TelloEdu 無人機

  • 分享至 

  • xImage
  •  

Tello Edu 無人機簡介

https://ithelp.ithome.com.tw/upload/images/20230925/20105707GSuDjxc8tX.png

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等),直接操作無人機。

不過進行程式控制之前,您應該要熟悉無人機的基本操作與規範,才不會觸犯國內的相關法規。因為無人機飛行時有一定的速度,失控會造成人員受傷甚至是死亡。如果誤闖機場,造成飛安事故,將會受到嚴重的罰則。進行這方面的實驗,請先閱讀民航法遙控無人機規範,重點摘要與連結如下:

  1. 最大起飛重量250 克以上遙控無人機應辦理註冊。而政府機關、學校或法人之任何無人機均須辦理註冊。
  2. 遙控無人機活動前應注意活動區域與遵守操作規定。
  3. 相關活動區域及操作規定資訊,請參考民航局網站與遙控無人機圖資行動應用程式。

Tello 無人機操作教學網站

https://ithelp.ithome.com.tw/upload/images/20230925/20105707lte2Xkn4BD.png

珩宇老師生活科技

無人機移動與四個馬達的相互關係

https://ithelp.ithome.com.tw/upload/images/20230925/20105707Ggf8oBxhpt.png

SDK 2.0 文件的重要摘要

https://ithelp.ithome.com.tw/upload/images/20230925/20105707pDzUqr3ngJ.png

  1. 手機或裝置使用無人機提供無線網路,連接至該SSID,無人機預設的IP 是 192.168.10.1,連接埠為8889。
  2. 您可以透過電腦手機傳命令給無人機。
  3. 無人機也會傳回其狀態資訊到手機或裝置上的 8890 port。
  4. 另外無人機也會將其影像串流傳到手機或裝置上的 11111 port。

官網提供的 Python3 範例程式

#
# 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 支援的版本。

玩學機內建積木介紹

https://ithelp.ithome.com.tw/upload/images/20230925/20105707vOutsH10dO.png

https://ithelp.ithome.com.tw/upload/images/20230925/2010570722L0VmSYHg.png

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)

上一篇
23. 簡易 Web Server
下一篇
25. 藍牙裝置掃描器
系列文
WiFiBoy Python 玩學機介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言