2018年12月29日 星期六

Tello 普通版編程


聖誕假期間,看到 Facebook 內的 DJI 廣告,發現一台入門級航拍機只需要 HK$619,實在很吸引。在航拍機未興起前已經想組裝一台,但一直沒有行動。之前都見過有價錢在 HK$400-$500 間的航拍機,不過質素及外型都不太好。現在 DJI 這台完全能滿足這兩點要求,只花幾百就買得到,於是買了一台回來。


Tello 的操作簡單,用手機 App 便能控制。規格中指飛行距離可達 100 米,而我嘗試過用 iPhone XR 或 iPad Pro 都只能去到 30 米左右,向上飛只能達三層樓高左右。旗艦店職員說是因為手機內的 WiFi 間片細,訊號接收力弱所導致;要是用遙控器則會好多了。我希望用電腦加帶天線的外置 WiFi USB 來控制 Tello,於是研究了一下,發現了 TelloPy 這個 Python 模組。編寫了一個簡單的測試程式,讓 Tello 起飛、拍照、降落。
##----------------------------------------------------------------------------------------
##  Tello DEMO Program
##----------------------------------------------------------------------------------------
##  Platform: Python 3.6 + TelloPy
##  Written by Pacess HO
##  Copyright Pacess Studio, 2018.  All rights reserved
##----------------------------------------------------------------------------------------

from time import sleep
import tellopy

##  Global variable
_counter = 0

##----------------------------------------------------------------------------------------
def handler(event, sender, data, **args):
   global _counter
   drone = sender
   
   if event is drone.EVENT_FLIGHT_DATA:
      print(data)
   
   if event is drone.EVENT_FILE_RECEIVED:
      _counter = _counter+1
      path = "tello_%s.jpg" % str(_counter)
      with open(path, "wb") as file:
         file.write(data)

##----------------------------------------------------------------------------------------
def flyNow():
   drone = tellopy.Tello()
   try:
      drone.subscribe(drone.EVENT_FLIGHT_DATA, handler)
      drone.subscribe(drone.EVENT_FILE_RECEIVED, handler)

      drone.connect()
      drone.wait_for_connection(60.0)
      
      drone.takeoff()
      sleep(3)
      
      drone.take_picture()
      sleep(3)
      
      drone.land()
      sleep(3)
   
   except Exception as ex:
      print(ex)
   
   finally:
      drone.quit()

##----------------------------------------------------------------------------------------
if __name__ == '__main__':
   flyNow()

沒有留言: