學習新事物,方法高於技術本身,如果沒有把握"BIG PICTURE"的話很難理解進去。通過以下幾點進行理解ROS:
- ROS實際上不是操作系統,他只是一個通信的框架,一個代碼管理的架構。任務的時序規划和CPU資源分配工作都是靠LINUX來實現,所以,ROS脫離不了LINUX,ROS依附在LINUX上。
- 機器人的核心平台是:多傳感器和處理器之間的通信,處理器和執行器之間的通信,這些通信必須保持一個統一的時鍾,試想如果從傳感器傳回來的數據時間上不同步,那就談不上數據融合了。
- ROS主要解決了兩個問題:其一,讓設備間的通訊有一個統一的調度中樞(ROSCORE),通過這個中樞控制信號傳遞,讓開發者明白機器人的活動狀態。其二,代碼管理的框架,讓不同開發者采用不同語言進行混合開發,這樣可以集成各種軟件的優勢協同工作,有點類似於異構系統。
ROS系統的架構主要被設計和划分成三部分,沒一部分都代表一個層級的概念:
- 文件系統級(FileSystem Level)
- 計算圖級(Computaion Graph Levell)
- 開源社區級(Community Level)
第一級是文件系統級。你將會使用這一組概念來理解ROS的內部構成,文件夾結構,以及工作所需要的核心文件。
第二級是計算圖級,體現的是進程和系統之間的通信。你將會看到ROS各個概念和功能,包括建立系統,處理各類進程,與多台計算機通信等。
第三級是開源社區級。這個層級是非常重要的,因為開源社區的大力支持才使得ROS在快速的發展。
1、理解ROS文件系統級別
剛接觸ROS,里面涉及了很多的陌生的概念,但當你理解了這些概念之后,就會輕車熟路,倍感親切了。ROS的文件系統結構如下圖所示:
- 功能包(Package):功能包是ROS中軟件組織的基本形式。一個功能包具有最小的結構和最少的內容,用於創建ROS程序。它可以包含ROS運行的進程(節點),配置文件等。
- 功能包清單(Manifest):功能包清單提供關於功能包,許可信息,依賴關系,編譯標志等的信息。功能包清單是一個manifests.xml文件,通過這個文件能夠實現功能包的管理。
- 功能包集(Stack):如果你將幾個具有某些功能的功能包組織在一起,那么你將會獲得一個功能包集。在ROS系統中,存在大量的不同用途的功能包集例如導航功能包集。
- 功能包集清單(Stack manifest):功能包清單(stack.xml)提供了一個關於功能包集的清單,包括開源代碼的許可證信息,與其他功能包集的依賴關系等。
- 消 息類型(Message/msg type):消息是一個進程發送到其他進程的信息。ROS系統有許多已經定義好的標准消息,你也可以自定義消息,消息存儲在對應功能包的msg文件夾下。 消息類型的說明存儲在mypackage/msg/MyMessageType.msg中,也就是對應功能包的msg文件夾下。
- 服務類型(Service/srv type):對服務類型進行描述說明的文件,在ROS系統中服務的請求和相應的數據結構,這些描述說明存儲在mypackage/srv/MyServiceType.srv中,也就是對應功能能包的srv文件夾下。
下面是一個功能包的文件結構示例圖:
2、理解計算圖級
ROS會創建一個鏈接到所有進程的網絡。在系統中的任何節點都可以訪問此網絡,並通過該網絡與其他節點交互,獲取其他就節點發布的信息,並將自身數據發布到網絡上。
在該層級最基本的概念包括有節點,節點管理器,參數服務器,消息,服務,主題和消息記錄包。這些概念都以不同的方式向計算圖級提供數據。
- 節 點(Node):節點是主要的計算執行進程。一個功能包可以有多個節點功能,就是說可以有多個main入口。如果你想要有一個可以與其他節點進行交互的進 程,那么需要創建一個節點,並將節點鏈接到ROS網絡。通常情況下,系統包含能夠實現不同功能的多個節點,為了減少系統的風險,最好每個節點的功能都是功 能較為單一的,而不是在系統中創建一個保羅萬象的大節點。就誒點能夠使用如roscpp(C++)或rospy(python)的ros客戶端庫進行編寫 程序。
- 節點管理器(Master):節點管理器用於節點的名稱注冊和查找等。如果你的整個ROS系統中沒有節點管理,就不會有節點,服 務,消息之間的通信。需要注意的是,由於ROS本身是一個分布式網絡系統,你可以在一台計算機上運行節點管理器,在其他計算機上運行由該管理器管理的節 點。
- 參數服務器(Parameter Server):參數服務器能夠使數據通過關鍵詞存儲在一個系統的核心位置。通過使用參數,就能在運行時配置節點或者改變節點的工作任務。
- 消息(Message):節點通過消息完成彼此的溝通。消息包含一個節點發送到其他節點的數據信息。ROS中包含多種標准類型的消息,例如整型,字節等,同時你也可以基於標准消息開發自定義類型的消息。
- 主 題(Topic):主題是由ROS網絡對消息進行陸游和消息管理的數據總線。每條消息都發布到相應的主題。當一個節點發送數據時,我們就說該節點正在向主 題發布消息。節點可以通過訂閱某個主題,接收來自其他節點的消息。一個節點可以訂閱一個主題,而並不需要該節點同時發布該主題。這就保證了消息的發布者和 訂閱者之間的相互解偶,完全無需知曉對方的存在。主題的名稱必須是獨一無二的,否則同名主題之間的消息路由就出現錯誤。
- 服務(Service): 在發布主題時,正在發送的數據能夠以多對多的方式交互。但當你需要從某個節點獲得一個請求或應答時,就不能通過主題來實現了,在這種情況下,就需要用到服 務了,服務能夠允許我們直接與某個節點進行交互。此外,服務必須有一個唯一的名稱。當一個節點提供某個服務時,所有節點都可以通過使用ROS客戶端庫所編 寫的代碼與它通信。
- 消息記錄包(Bag):消息記錄包是一種用於保存和回放ROS消息數據的文件格式。消息記錄包是一種用於存儲數據的 重要機制。他能夠獲取並記錄各種難以收集的傳感器數據。我們可以通過消息記錄包反復獲取實驗數據,進行必要的開發和算法測試。在使用復雜機器人進行實驗工 作時,需要經常使用消息記錄包。
3、開源社區級
ROS開源社區的概念主要關於ROS資源,能夠獨立的網絡社區分享軟件和知識。這些資源包括:
- 發行者(Distribution):ROS發行版是可以獨立安裝的,帶有版本號的一系列功能包集。ROS發行版像Linux發行版一樣發揮類似的作用。這使得ROS軟件安裝更加容易,而且能夠通過一個軟件集合來維持一致的版本。
- 軟件源(Repositorie):ROS依賴於共享開源代碼與軟件源的網站或主機服務,在這里不同的機構能夠發布分享各自的機器人軟件和程序。
- ROS Wiki:ROS Wiki是用於記錄有關ROS系統信息的主要論壇。任何人都可以注冊賬戶和貢獻自己的文件,提供更正和更新,編寫教程以及其他信息。
- 郵件列表(Mailing list):ROS用戶郵件列表是關於ROS的主要交流渠道,能夠交流從ROS軟件更新到ROS軟件使用中的各種疑問或信息。
參考資料
[1]. Aaron Martinez Enrique Fern andez, ROS機器人程序設計[B], P14-42, 2014.
[2]. ROS的Big Picture理解