從RoboMaster AI挑戰賽到移動機器人系統的入坑指南

來自專欄機器人技術入門172 人贊了文章

在今年1月底,我們開源了RoboRTS框架,一方面是為了讓RoboMaster AI挑戰賽的參賽隊伍們可以有一套易用的針對於RoboMaster機器人平臺的上層框架,另一方面也是希望為更多科研工作者在移動機器人演算法研究上提供一個通用性的硬體和軟體的解決方案。自框架開源以來,我們基於感知,規劃,控制和決策四大方面,一直在不斷地優化和細化整套框架。

RoboRTS開源框架

在2018年ICRA RoboMaster AI挑戰賽中,我們團隊將其應用在了RoboMaster AI挑戰賽的官方機器人上,與所有參賽隊自主研發的機器人,在鋪設不同功能機關道具的5m x 8m場地內,進行全自動的2v2對戰。在2018年RoboMaster大學生夏令營中,營員們也基於這套系統框架進行了全自動彈藥箱搜尋、夾取,以及自主對戰等任務的開發。但是在與很多參賽隊員和夏令營營員交流的過程中,我們發現許多同學面對這樣一個綜合性比較強的系統十分迷茫,並不知道應該從哪裡入手去高效率地學習和調試整個系統。因此在今年RoboMaster AI挑戰賽後,我們決定重新設計一套基於RoboMaster步兵機器人的模塊化機器人硬體平臺,同時在接下來維護和迭代RoboRTS框架的過程中,優化協議調用和調試介面,完善說明文檔,並針對性地推出一系列的基礎教程,方便對於RoboRTS框架以及RoboMaster移動機器人平臺相關工程和理論知識的學習。

下圖是當前整個框架平臺的基本構架簡圖

整個框架主要由兩個大部分組成,嵌入式STM32微控制器平臺端搭載了RTOS,承擔了實時需求高的對機器人的控制,對感測器數據的預處理和轉發,以及與比賽相關數據轉發的任務,而上層機載電腦則負責算力需求更高的環境感知,運動規劃和決策調度的功能。二者通過串口,基於一套特定協議來進行通信和交互,這一部分也被我們封裝成sdk的形式。因此整套框架的核心就在於感知,規劃,決策和控制理論演算法研究,以及各個硬體模塊之間,不同進程之間,不同線程之間的通信,數據收發和處理的系統性工程問題。

在未來閱讀我們的教程與文檔,並通過RoboRTS框架對RoboMaster機器人平臺進行開發之前,還需要提前學習一些先修知識。這篇文章主要提供給大家一些需要學習的知識點,尤其是必備的一些工程上的方法,以及對應的網路資料,給大家作為參考。

下圖是RoboRTS框架所涉及的知識簡圖,左側主要是理論知識相關,右側為工程上需要了解的工具。

開發環境 Ubuntu

大部分的機器人軟體系統都是基於Linux開發的,RoboRTS框架也不例外。我們主要的開發環境是Ubuntu 16.04,因此對於初學者來說,有必要去了解一些基礎的linux下的生存技能。在這裡安利一下CMU的一個很基礎的小課程GPI,覆蓋了包括shell基礎、vim、bash、git等等linux下的必備生存技能,非常貼心。而對於更進階的技能,就需要在實踐中不斷學習了,需要你活學活用man、google、stackoverflow等等。

編程語言 C++ / Python

RoboRTS框架基本是由C++編寫的,假如你希望在此框架上進行自己應用的開發,或者進一步優化我們的框架,就需要比較熟練使用C++語言。對於C++的入門,建議從《C++ Primer》一書入手,多加實踐練習,不斷回顧。對C++進階的學習可以參考Milo Yip的書單。由於RoboRTS框架是基於ROS開發的,因此你也可以使用Python通過rospy開發外部應用。

編譯工具鏈 CMake

將代碼變成可執行文件的過程,可以叫做「編譯」。當你的工程涉及多個部分的代碼時,就要考慮其相互間的依賴關係、編譯的先後順序,而決定這些的過程,可以稱為「構建」。大多數的初學者都會嘗試過編寫Makefile搭配make來實現。而當工程逐漸變得龐大,就需要構建系統能更加抽象的表達整個構建的過程。這也是我們使用CMake構建系統的理由之一。對於CMake的學習,推薦學習現代CMake的用法 An Introduction to Modern CMake,裡麪包含了為什麼使用CMake、CMake的基礎用法、以及Modern CMake的實踐,由淺入深,相信認真學習後會有所收穫。

機器人操作系統 ROS

關於如何學習ROS(機器人操作系統)已經是一個老生常談的話題了,為什麼要使用ROS呢?ROS是世界上最大的機器人軟體開發平臺,得益於其開源性和社區性,我們可以很容易找到基於ROS的高水平開源演算法來快速實現在自己的硬體平臺上,那麼ROS到底提供了我們怎樣的方便?從本質上看,ROS其實是一套「通信架構」+「代碼管理框架」+「實用工具包」的組合體。在通信上,其節點間的序列化和反序列化的消息通信機制一定程度上解決了進程之間通信的問題;而代碼管理上,也提供了方便的節點、包和工作區管理功能,讓我們很容易層級化進程、模塊和倉庫的關係;同時,ROS提供的可視化工具讓使用者更高效的調試。

首先,就是要去學會使用其通訊機制。這部分的學習其實一本書就足夠了,A Gentle Introduction To ROS(中文版)。這本書可以保證你對ROS有一個最基本的認識,其內容也覆蓋了上面知識導圖中的通信機制(topic、service)、編譯工具鏈(catkin)、參數機制(rosparam)等等。此外,在RoboRTS中有大量使用actionlib機制(適用於需要週期性反饋的節點間通信),這也是ROS中委託反饋過程任務中經常使用的機制,例如導航過程。關於actionlib的使用,此書還沒有覆蓋到,需要通過ROS Wiki 進行進階的學習。

在一個機器人系統中,你會面對諸多坐標變換問題,例如感測器與機器人底盤間、底盤和雲臺間,機器人與地圖間、機器人與機器人間的坐標關係。這時你就會用到ROS中不可忽視的坐標變換工具(tf)。它使用樹型的數據結構,根據時間戳緩存並維護多個參考系之間的坐標變換關係,方便你在不同參考系之間進行轉換。對於tf的學習建議從tutorial開始,若想對其深入的理解就必須要進一步結合實際的開發。

在你調試機器人的時候,一般會在自己的PC上進行開發,再部署到機器人的機載電腦上進行調試,這時ROS的網路通信的優勢就體現出來了,你可以根據Wiki上簡單的幾步教程就完成相關的網路配置,而ROS還擁有非常豐富實用的可視化工具(如rviz,rqt_plot,rqt_graph)等等,讓你在面對複雜的機器人系統時也能直觀的觀察其表現、發現其中的問題。這些實用的工具都值得初學者去跟著tutorial學習,同時做一些小demo。我們在後續的教程中,也會對涉及到的一些ROS相關的內容進行更深入的講解。

數學基礎

在ROS體系中,最為珍貴的就是其大量開源的ROS包,很多封裝好的ROS包就像一個個黑盒子,你可以利用它們快速跑出各種各樣的demo。雖然跑demo效果酷炫,但你的好奇心可能會驅使你想去了解其中的本質,想去真正深入的學習Robotics理論知識。而這時,你會需要一個十分紮實的數學基礎,來讓你更好的去理解各種演算法的數學本質。應用最多、最普遍的就是線性代數和概率論相關的知識,以下是一些可以作為參考的資料。

線性代數:線性代數可以參考碩哥 @YY碩 推薦的兩本書,《Linear Algebra Done Right》和《Linear Algebra Done Wrong》,用於系統的學習線性代數。如果更希望以課程的形式學習的話,推薦Gilbert Strang教授的公開課《麻省理工公開課:線性代數》。這裡也推薦一些容易理解的讀物: 理解矩陣、神奇的矩陣和《線性代數的幾何意義》。

概率論:概率論是研究隨機性和不確定性的科學,由於環境、感測器噪音的存在,使得機器人的感知問題成為一個不確定性問題,一般來說機器人姿態估計、地圖重建、目標檢測、目標識別等演算法都會涉及到貝葉斯估計、最大似然估計相關理論。這部分可以參考《Probabilistic Robotics》的基礎知識部分、《Uncertainty in Deep Learning》、《Deep Learning》第三章。如果大家有更好、更系統的學習資料,也歡迎大家補充。

隨著你對機器人理論演算法的深入,你還會遇到凸優化、圖論、拓撲學、資訊理論、微分幾何等通用但大學階段一般不會深入學習的數學問題,比如軌跡規劃和深度學習都會涉及到非線性優化問題,利用同倫與同調的拓撲性質也可以對路徑規劃演算法中的優化進行簡化和加速,通過相對熵來對比預測分佈和真實分佈的一致性,常用於優化演算法,而在動態調整蒙特卡洛定位演算法的粒子數目中也有應用。這部分屬於進階的數學知識,在此只是提供參考,掌握非一日之功,需要慢慢消化。

  • 凸優化:學習如何建模,把現實問題抽象成數學問題可以參考Stephen Boyd教授的《Convex Optimization》,如何求解Deterministic的優化問題可以參考《Numerical Optimization》,深度學習中的優化問題一般都是Stochastic的一階優化問題,可參考Sebastian Ruder的blog: 《An overview of gradient descent optimization algorithms》,當然也有二階優化方法,比如ACKTR。
  • 拓撲學和圖論:這方面是路徑規劃中的理論基礎,Subhrajit Bhattacharya的博士論文《Topological and geometric techniques in graph-search based robot planning》是拓撲學和幾何學利用在圖搜索規劃中的應用。而關於圖論的相關書籍可以參考《Graph Theory with Applications》
  • 資訊理論:《Deep Learning》中的3.13有資訊理論的簡單介紹,而《Information Theory: A Tutorial Introduction》也是很好的入門教材,瞭解熵、相對熵、交叉熵這些資訊理論基本概念有助於我們更好的理解機器學習和優化中的思想。
  • 李羣李代數:在接觸剛體旋轉相關的問題時會接觸到李羣李代數相關的知識,高博 @半閑居士 在《視覺SLAM十四講》的第4講中有對李羣李代數做一些介紹,也可以通過《State Estimation For Robotics》中的第6、7章進行深入的學習。

Robotics 理論知識

機器人屬於比較綜合的學科,涉及到環境感知、智能決策、導航規劃、運動控制等多個領域,不過也不要畏懼,入門機器人也不會太難

當你已經擁有一定的數學基礎,就可以真正試著去深入一些ROS包的內部,比如最經典的ROS Navigation Stack,其奧祕基本都包含於《Probabilistic Robotics》(建議看英文原版)這本書中。這本書幾乎不需要先修知識,由淺入深,幾乎涵蓋2D環境下的移動機器人系統方方面面,非常經典 。假如你覺得光靠讀書十分晦澀,可以試著去看Sebastian Thrun的 Artificial Intelligence For Robotics課程或Wolfram Burgard的Introduction to Mobile Robotics課程。

掌握了這些基礎後,你對機器人的框架、脈絡就會有簡單的認識,此時應該選定一個感興趣的方向紮實深入研究下去,我們針對每個方向簡單寫一些介紹,並推薦幾本圖書或課程作為參考,方便大家索引。

  • 狀態估計:在狀態估計領域,不得不提的一本書就是《State Estimation For Robotics》了,其內容涵蓋了狀態估計(線性高斯系統、非線性高斯系統)、三維空間運動、和相關的應用。這本書的理論非常深刻實用,也非常嚴謹。但數學公式非常之多,需要有一定紮實數學基礎。可能只有認真跟著書裡面的公式推導,才會有很大的收穫。而對於初學者,可以通過《Probabilistic Robotics》學習到基礎的知識,做一些小的應用出來。
  • 計算機視覺(CV):《Learning OpenCV 3》 是比較好的入門圖書,該書不僅講解了一些圖像處理簡單原理,也有代碼實現,初學者也快利用OpenCV快速實現一些demo,驗證一些想法,想深入瞭解原理可以參考Richard Szeliski的著作《Computer Vision Algorithms and Applications》。Udacity上的計算機視覺課程也是一個不錯的學習材料。如果以後的發展方向是VO、VSLAM等等,《Multiple View Geometry in Computer Vision》這本書也是非常必要的。
  • 深度學習(DL):近幾年DL在目標檢測、目標識別、語義分割、語音識別等多個領域都有比較好的應用,網上的教程也非常多,對於ICRA AI挑戰賽來說比較關鍵的是目標檢測與識別,這裡推薦一下Goodfellow的《Deep Learning》前幾章基礎知識部分,deeplearning.ai的課程和Stanford經典課程cs231n,入門後主要就是讀paper了,DL還處於快速發展的階段,每一週都會release很多paper,可以通過rss訂閱arxiv中感興趣的topic,實時追蹤領域最新動態。
  • 運動規劃:運動規劃部分建議從基於圖搜索的演算法進行入手,對其有一定了解後,可以用代碼實現圖的建立、圖的搜索等。而後可以嘗試閱讀《Motion Planning》瞭解運動規劃在機器人上面的應用,以及一些傳統planning演算法。後續還可以繼續閱讀《Planning Algorithm》,這本書的planning比較宏觀,涉及的內容比上一本書要廣許多,適合作為進階的閱讀材料。同時運動規劃中的trajectory planning也會涉及到與凸優化相關知識,具體的應用可以參照paper《Trajectory modification considering dynamic constraints of autonomous robots》。
  • 智能決策:關於決策研究涵蓋了工業和遊戲廣泛應用到的傳統智能決策方法,例如狀態機,決策樹,行為樹等,直接搜索每個對應方法的核心邏輯,橫向對比每種方法的優劣,就可以很快上手,相關資料可以參見遊戲AI的一些設計。智能決策的理論演變主要是基於馬爾科夫決策過程,發展到近年來火熱的端到端基於學習和優化的方法,例如深度強化學習,這方面的學習推薦《Reinforcement Learning:An Introduction》和David Silver的強化學習課程。

而對於RoboRTS使用的部分演算法以及每一個模塊的詳細分析和用法,我們將更新在之後發布的教程中。

關於RoboRTS的未來

我們團隊開發RoboRTS框架的初衷在於讓更多的人參與到機器人在不同規則場景下的智能決策研究,因此為了適配這樣一套系統研究,綜合現有成熟的RoboMaster平臺,我們對未來RoboRTS有如下的框架規劃:

其中包括了四大模塊:

  1. 自動移動機器人平臺
  2. 裁判系統平臺
  3. 遊戲模擬平臺
  4. 學習訓練平臺

當前我們所做的工作主要集中在第一部分上。我們根據上一代機器人平臺發布以來的一些反饋,會在今年年末的時候重新推出新一代的硬體平臺,提供給未來ICRA挑戰賽的參賽隊員以及感興趣的科研人員。新一代的平臺的機械結構會更加模塊化,便於安裝和快拆,也適配更多種類的感測器,讓學生和科研人員可以更加專註於演算法層面的問題,免去許多嵌入式控制、機械設計層面的煩惱。為了讓更多學生更方便的調試演算法,我們將協議介面部分抽象出來作為獨立的SDK,完善調試的工具鏈,針對各個模塊的技術文檔和教程的工作也在進行之中。

與此同時,為了更好的進行多機器人協同和比賽信息共享,我們將比賽中成熟穩定的裁判系統和自動平臺融入起來,提供通信更加穩定的信息共享和指令控制,這方面的工作也在近期計劃之中。

遊戲模擬器對於學習訓練的意義是不言而喻的,現實和虛擬世界中的機器人、環境以及感測器的建模和渲染仍然有一定的距離,這方面的工作我們還在摸索之中。

由於整個系統的跨學科交叉性非常大,僅靠一己之力是完全無法完成的。在這個項目上,我們希望建立一個開放的平臺供RoboMaster賽隊和對此有興趣的跨專業的同學們以及科研工作者們共同交流與協作,分享新奇的腦洞,展示有趣的功能,亦或是記錄一下踩過的坑,來共同推動整個項目的進程。

機器人的發展和普及,既需要踏實深入的演算法理論研究,也需要貼近實際,關心人機交互的工程應用。希望藉助RoboMaster這個平臺,以及我們所做的一點點工程上的實踐,能夠吸引更多的人參與到機器人系統和演算法的研究上。


推薦閱讀:
相關文章