在這篇文章中,我們將之前 micro:bit Joystick 的 Tello 空拍機範例由官方 API 改成使用破解版的 API,並比較兩者的不同。

雖然 Tello 空拍機在一開始時就提供了官方的 API,但是官方 API 功能有限,而且反應很不靈活,所以後來有人提供了破解版的 API。破解版的 API 不但提供更多的控制功能,而且相當靈敏。此外,破解版 API 還另外附了一個利用鍵盤來控制 Tello 的範例程式,因此可以直接使用電腦來控制 Tello 空拍機。

我選擇保留之前 micro:bit 控制程式的架構,也就是 micro:bit 利用序列埠的方式與電腦進行溝通,而且加上 micro:bit 專用的 Joystick 作為控制的輸入方式。

為了配合使用破解版的 API,需要進行下列的調整:

  1. 破解版 API 支援 Python 2.x 的版本,需要進行小幅修改才能正確運行在 Python 3.x 的環境下。修改後的 tello.py 可以在這裡下載
  2. 破解版 API 已經提供利用鍵盤形式的控制程式,為了減少所需撰寫的程式,我們利用 pynput 這個套件將從序列埠接收到的命令轉換成相對應的鍵盤按鍵動作。
  3. 官方 API 屬於一個指令一個動作的控制方式,也就是一個向前的指令只會令 Tello 前進一段距離後就停止,必須持續送出前進的指令才能一直往前飛行。而其他方向的移動也是一樣的情況。如果為了加快移動而太頻繁地送出控制指令,官方 API 又很容易產生錯誤,所以才會造成操控時很不靈活的現象。破解版 API 則屬於一次性的指令,也就是送出前進指令後,如果沒有下達停止或其他方向的控制指令,Tello 就會一直往前移動。包含前進、後退、左右飄、上升、下降、左右轉都是這樣的控制方式。
  4. 也因為上述原因,我們的控制程式必須知道何時要送出停止移動的指令。因為控制的輸入端為連結 micro:bit 的 Joystick,所以預計由 micro:bit 來送出停止移動的控制指令。最簡單的方式,就是當按鈕被按下時送出移動的指令,而按鈕放開時則送出停止的指令。內建的 A、B 紐可以直接支援這兩種事件的判斷,而其他腳位則必須自行註冊接受電位上升或下降的事件才能判斷按鈕的按下與放開情況。不過實際測試後發現腳位電位變化事件的通知並不是很精確,常常會有遺漏的現象,因此放棄此一作法,而改用不斷檢查腳位電位數值的方式。這種作法雖然可行,但是因為程式需要不斷檢查所有腳位的電位狀態,所以會占用系統不少的資源,而且腳位狀態變化的偵測也較為緩慢。
  5. 其實破解版 API 並不是直接提供前進或後退的控制指令,而是利用同一個控制指令的不同參數來決定各個方向的移動與速度。舉例來說,前進與後退使用同一個參數,而參數數值大小決定 Tello 是前進或後退,以及實際的移動速度。因此,程式除了可以用搖桿的偏移方向來控制 Tello 的移動方式,更可以將搖桿的偏移量用來直接控制移動速度。
  6. 破解版範例控制程式雖然沒有提供翻滾的功能,但是因為實際底層控制物件卻是支援翻滾的指令,因此我加上可利用數字 3 進行向前翻滾的控制,對應到 Joystick 上的 B 鈕。
  7. 可在此下載 python 轉介程式 controller.py 與 micro:bit 控制程式 microbit-tello-joystick-cracked-api.hex
  8. 兩支程式都不算短,所以這篇文章並不逐一解釋,有興趣的朋友請再留言討論。

使用破解版的 API 來控制 Tello 空拍機相當靈敏,而如果沒有適時送出停止的指令,Tello 就會一路衝下去,因此很容易衝撞到周邊的物品。而使用序列埠溝通的 micro:bit 控制程式,指令的傳輸上會有一點點的延遲,因此最好在空曠一點的地方飛行,以免太常墜機。

Facebook 留言
Print Friendly, PDF & Email
Summary
Article Name
使用 Micro:bit Joystick 與破解版 API 控制 Tello 空拍機
Description
在這篇文章中,我們將之前 micro:bit Joystick 的 Tello 空拍機範例由官方 API 改成使用破解版的 API,並比較兩者的不同。
Author
Publisher Name
Everlearn Studio
Publisher Logo