大疆機甲大師編程體驗:如何Coding一個會跟蹤的小機甲
- 2019 年 10 月 6 日
- 筆記
機器之心原創
作者:思源
如果給你一台機甲大師 S1,那麼你能會拿它來做什麼?是開著它巡視領地,還是編個程賦予它智慧?
早一段時間,機器之心拿到了一台機甲大師 S1,在暢快地控制與遊戲之餘,我們不禁想看看它的編程模組到底是什麼樣的。看看除了手動控制外,我們都能通過編程實現些什麼,機甲大師 S1 又能自動化做些什麼。帶著這些疑問,機器之心實際操作了一波,看看機甲大師 S1 的大腦到底能有多強。
「戰鬥」體驗
在剛拿到機甲大師 S1 的時候,當然是先體驗一番它的操作與戰鬥樂趣了。我們可以通過雲台上的攝影機以第一人稱的視角操作機器,當然也包括開火啦。因為我們是通過 WIFI 連接並控制機甲大師,所以控制距離依 WIFI 訊號而定,當然你也可以嘗試其它的連接方式。
即使是單人模式,機甲大師 S1 也能實現很多功能,例如錄製影片或拍照、識別物體或射擊水彈等等。如下是機器之心已經在辦公室中開玩了。

真實場景版第一人稱射擊遊戲。
在剛玩機甲大師 S1 時,可能會感到非常新奇、非常有意思。但了解它的操作和各種功能後,它的操作樂趣會逐漸消退,畢竟沒有其它機甲大師能一起對戰。
不過值得慶幸的是,機甲大師 S1 還有「實驗室」模式,我們可以根據編程模組實現各種炫酷的玩法。
機甲大師 S1 編程模組
機甲大師 S1 的編程主要分為 Python 和 Scratch 兩種,它們兩者之間是可以直接轉換的。總體而言,機甲大師提供了大量預定義的模組,我們要做的就是調用不同的模組,並構造完整的流程。
機甲大師 S1 的功能模組大致能分為幾大類,首先是控制機身行為的模組,包括燈光、移動和射擊等等;其次是各種識別模組,例如識別到人、標誌等等;最後是一些編程的標準模組,例如控制流或數據結構等等。
因為基本的能力與特性都是確定的,剩下的重點就是構建系統的邏輯。所以說,如果我們了解了各種模組或 API 的定義,那麼機甲大師 S1 的編程並不困難。
舉個栗子
下面列舉一個簡單的案例,我們需要機甲大師 S1 開始旋轉機身、雲台來找人。如果檢測到行人,那麼就令機身的所有燈光都變成紅色,並抬頭「看著」人。這樣簡單的一個邏輯可以快速通過 Scratch 完成,直接拖拽不同的模組就行了。其中不同類的模組顏色還不一樣,例如 while、if 等控制語句都是藍色;視覺識別模組都是淺黃色。
如下展示了用 Scratch 編寫上面邏輯的結果:

即使不太了解編程的讀者,看看上面的模組差不多也能知道機甲大師 S1 會做些什麼。基本上各種複雜的任務或流程都能通過 Scratch 搭建,各種功能也都能實現。對於一般的開發者而言,我認為直接使用 Scratch 編程更便捷一些,因為 Python 編程其實邏輯上也差不多,不過要熟悉各種 API。
如下是上面程式的 Python 程式碼,它的複雜之處在於 API 的選擇與配置,其它程式控制流或過程並不會太複雜。
def start(): vision_ctrl.enable_detection(rm_define.vision_detection_people) robot_ctrl.set_mode(rm_define.robot_mode_chassis_follow) while True: gimbal_ctrl.recenter() if vision_ctrl.check_condition(rm_define.cond_recognized_people): gimbal_ctrl.rotate_with_degree(rm_define.gimbal_up,44) led_ctrl.set_bottom_led(rm_define.armor_bottom_all, 255, 0, 0, rm_define.effect_flash) led_ctrl.set_top_led(rm_define.armor_top_all, 255, 0, 0, rm_define.effect_marquee) time.sleep(7) else: gimbal_ctrl.rotate_with_degree(rm_define.gimbal_up,24) led_ctrl.set_bottom_led(rm_define.armor_bottom_all, 69, 215, 255, rm_define.effect_always_on) led_ctrl.set_top_led(rm_define.armor_top_all, 69, 215, 255, rm_define.effect_always_on) gimbal_ctrl.rotate(rm_define.gimbal_right) gimbal_ctrl.set_rotate_speed(40) time.sleep(2)
雖然說是用 Python 編寫的程式和 Scratch 是等價的,但這麼多 API 還是需要花一定功夫來理解的。如上所示,我們並不需要導入各種模組,直接可以調用 vision_ctrl、led_ctrl 和 gimbal_ctrl 等介面,各 API 的參數也與 Scratch 中的差不多。
如果我們用 Python 寫機甲大師 S1 的程式,那麼我們這樣的初學者會遇到一些問題。首先機甲大師 S1 似乎暫時沒有提供完善的 Python API 文檔,只在每一個 Scratch 模組下介紹了對應的 API,但該 API 的行為與用法並沒有展示。其次,每一次查找 API 時,不能通過搜索直接定位,我們先要理解 Scratch 模組,才能找到對應的 API。

編程指南中的 Python API 示例。
最後,至少在機器之心嘗試用 Python 編程時,沒感覺到它的訂製化優勢。所有高層 API 的介面都是封裝好的,我們只能利用現有的功能模組實現一些流程。比如說機甲大師 S1 的識別功能,它支援行人、特定標記、特定姿勢和其它機器人的檢測,它們都有非常完善的 API。但是如果需要識別新的目標,例如「貓」,那麼它是做不到的,我們也無法給它加上我們自己訓練的 ML 模型。
當然,機甲大師的底層開發肯定非常複雜,要給它加上新的特性一定很麻煩,但是機器之心還是希望機甲大師能提供一系列教程,讓機器學習開發者也能將自己的模型載入到上面。
總體而言,通過這個簡單的案例,我們發現對於一般的用戶,使用 Scratch 寫程式要比用 Python 寫高效得多。它非常適合作為青少年的編程啟蒙玩具,用 Scratch 編寫出炫酷的應用。
Scratch 編程模組
最後我們重點介紹一下機甲大師該怎樣使用 Scratch 進行編程。機甲大師 S1 的編程都在應用程式內完成,不同的語言都有自己的編輯窗口。如下所示為 Scratch 的編程介面,其中圖形化的編程模組有一百多個。為了便於查找模組,機甲大師按照不同的功能以不同顏色的模組進行分類,這樣搭建起來會比較簡單。
編程指南地址:https://www.dji.com/cn/robomaster-s1/programming-guide

我們簡單搭建了一個識別人的流程,機甲大師可以旋轉車身找人,找到了就向行人前進。如下所示為程式的調試窗口,執行後可以同時看到攝影機的畫面與車身的狀態,這樣就能快速嘗試剛剛編寫程式的效果。
在下面的動圖中,我們可以看到程式運行的動態過程。這裡因為場地有限,我們將向前平移距離設定為了 0 米,如果不為 0,那麼機甲大師在檢測到人的同時會抬起「炮筒」向人前進。如下所示當檢測到人時,機甲大師會抬頭。

其實更好的一種方式是先用 Scratch 搭建整個架構,然後再在 Python 開發環境下修改細節。比如說,拉拽的 Scratch 模組只有少數幾種條件語句,但是如果在 Python 環境下就能利用 elif 等更合理的語句。
同時,很多 API 的參數也是不太一樣的,在 Scratch 環境下,燈光只能配置幾種常見的顏色,但是在 Python 環境下,可以通過 RGB 的值來配置燈光顏色。如下是上述程式的 Python 程式碼,我們可以進一步調整細節。
def start(): vision_ctrl.enable_detection(rm_define.vision_detection_people) robot_ctrl.set_mode(rm_define.robot_mode_chassis_follow) armor_ctrl.set_hit_sensitivity(8) while True: if vision_ctrl.check_condition(rm_define.cond_recognized_people): gimbal_ctrl.rotate_with_degree(rm_define.gimbal_up,44) led_ctrl.set_bottom_led(rm_define.armor_bottom_all, 255, 0, 0, rm_define.effect_breath) led_ctrl.set_top_led(rm_define.armor_top_all, 255, 0, 0, rm_define.effect_marquee) if armor_ctrl.check_condition(rm_define.cond_armor_hit): chassis_ctrl.stop() else: chassis_ctrl.move_with_distance(0,0.3) else: gimbal_ctrl.pitch_ctrl(14) led_ctrl.set_bottom_led(rm_define.armor_bottom_all, 69, 215, 255, rm_define.effect_always_on) led_ctrl.set_top_led(rm_define.armor_top_all, 69, 215, 255, rm_define.effect_always_on) gimbal_ctrl.rotate(rm_define.gimbal_right) gimbal_ctrl.set_rotate_speed(80) time.sleep(0.3)
如上只是簡要介紹機甲大師 S1 該怎樣編程,我們通過簡單的操作就實現一個「智慧」的機器人。總體來說,使用已有的高層 API 做個智慧機器人就已經非常足夠了,我們不能期望能使用更加複雜的底層介面。帶小朋友做個炫酷的機甲大師,這也是非常有意思的挑戰啊。
本文為機器之心原創,轉載請聯繫本公眾號獲得授權。
✄————————————————
加入機器之心(全職記者 / 實習生):[email protected]
投稿或尋求報道:[email protected]
廣告 & 商務合作:[email protected]