一、 ?總體結構
? ? ? ?根據ROS系統代碼的維護者和分布來標示,主要有兩大部分:
? ? ?(1)main:核心部分,主要由Willow Garage公司和一些開發者設計、提供以及維護。它提供了一些分布式計算的基本工具,以及整個ROS的核心部分的程序編寫。
? ? ?(2)universe:全球范圍的代碼,有不同國家的ROS社區組織開發和維護。一種是庫的代碼,如OpenCV、PCL等;庫的上一層是從功能角度提供的代碼,如人臉識別,他們調用下層的庫;最上層的代碼是應用級的代碼,讓機器人完成某一確定的功能。
? ? ? ?一般是從另一個角度對ROS分級的,主要分為三個級別:計算圖級、文件系統級、社區級。

二、 ?計算圖級
? ? ? ?計算圖是ROS處理數據的一種點對點的網絡形式。程序運行時,所有進程以及他們所進行的數據處理,將會通過一種點對點的網絡形式表現出來。這一級主要包括幾個重要概念:節點(node)、消息(message)、主題(topic)、服務(service)。

? ? ? ?(1) ?節點
? ? ? ?節點就是一些直行運算任務的進程。ROS利用規模可增長的方式是代碼模塊化:一個系統就是典型的由很多節點組成的。在這里,節點也可以被稱之為“軟件模塊”。我們使用“節點”使得基于ROS的系統在運行的時候更加形象化:當許多節點同時運行時,可以很方便的將端對端的通訊繪制成一個圖表,在這個圖表中,進程就是圖中的節點,而端對端的連接關系就是其中弧線連接。
? ? ? ?(2) ?消息
? ? ? ?節點之間是通過傳送消息進行通訊的。每一個消息都是一個嚴格的數據結構。原來標準的數據類型(整型,浮點型,布爾型等等)都是支持的,同時也支持原始數組類型。消息可以包含任意的嵌套結構和數組(很類似于C語言的結構structs)。
? ? ? ?(3) ?主題

? ? ? ?消息以一種發布/訂閱的方式傳遞。一個節點可以在一個給定的主題中發布消息。一個節點針對某個主題關注與訂閱特定類型的數據。可能同時有多個節點發布或者訂閱同一個主題的消息。總體上,發布者和訂閱者不了解彼此的存在。
? ? ? ?(4) ?服務
? ? ? ? 雖然基于話題的發布/訂閱模型是很靈活的通訊模式,但是它廣播式的路徑規劃對于可以簡化節點設計的同步傳輸模式并不適合。在ROS中,我們稱之為一個服務,用一個字符串和一對嚴格規范的消息定義:一個用于請求,一個用于回應。這類似于web服務器,web服務器是由URIs定義的,同時帶有完整定義類型的請求和回復文檔。需要注意的是,不像話題,只有一個節點可以以任意獨有的名字廣播一個服務:只有一個服務可以稱之為“分類象征”,比如說,任意一個給出的URI地址只能有一個web服務器。
? ? ? ? 在上面概念的基礎上,需要有一個控制器可以使所有節點有條不紊的執行,這就是一個ROS的控制器(ROS Master)。
? ? ? ? ROS Master 通過RPC(Remote Procedure Call Protocol,遠程過程調用)提供了登記列表和對其他計算圖表的查找。沒有控制器,節點將無法找到其他節點,交換消息或調用服務。
? ? ? ? 比如控制節點訂閱和發布消息的模型如下:

? ? ? ??ROS的控制器給ROS的節點存儲了主題和服務的注冊信息。節點與控制器通信從而報告它們的注冊信息。當這些節點與控制器通信的時候,它們可以接收關于其他以注冊及節點的信息并且建立與其它以注冊節點之間的聯系。當這些注冊信息改變時控制器也會回饋這些節點,同時允許節點動態創建與新節點之間的連接。
? ? ? ? 節點與節點之間的連接是直接的,控制器僅僅提供了查詢信息,就像一個DNS服務器。節點訂閱一個主題將會要求建立一個與出版該主題的節點的連接,并且將會在同意連接協議的基礎上建立該連接。
? ? ? ? 節點與節點之間的連接是直接的,控制器僅僅提供了查詢信息,就像一個DNS服務器。節點訂閱一個主題將會要求建立一個與出版該主題的節點的連接,并且將會在同意連接協議的基礎上建立該連接。
? ? ? ? ?另:ROS控制器控制服務:

三、 ?文件系統級
? ? ? ? ROS文件系統級指的是在硬盤上面查看的ROS源代碼的組織形式。

? ? ? ? ROS中有無數的節點、消息、服務、工具和庫文件,需要有效的結構去管理這些代碼。在ROS的文件系統級,有以下幾個重要概念:包(package)、堆(stack)、
? ? ? ? (1) ?包

? ? ? ? ROS的軟件以包的方式組織起來。包包含節點、ROS依賴庫、數據套、配置文件、第三方軟件、或者任何其他邏輯構成。包的目標是提供一種易于使用的結構以便于軟件的重復使用。總得來說,ROS的包短小精干。
? ? ? ? (2) ?堆

? ? ? ? 堆是包的集合,它提供一個完整的功能,像“navigation stack”。Stack與版本號關聯,同時也是如何發行ROS軟件方式的關鍵。
? ? ? ? ROS是一種分布式處理框架。這使可執行文件能被單獨設計,并且在運行時松散耦合。這些過程可以封裝到包(Packages)和堆(Stacks)中,以便于共享和分發。下圖是在包和堆在文件中的具體結構:
? ? ? ? ROS是一種分布式處理框架。這使可執行文件能被單獨設計,并且在運行時松散耦合。這些過程可以封裝到包(Packages)和堆(Stacks)中,以便于共享和分發。下圖是在包和堆在文件中的具體結構:

? ? ? ? ?Manifests (manifest.xml):提供關于Package元數據,包括它的許可信息和Package之間依賴關系,以及語言特性信息像編譯旗幟(編譯優化參數)。
? ? ? ? ?Stack manifests (stack.xml):提供關于Stack元數據,包括它的許可信息和Stack之間依賴關系。
? ? ? ? ?Stack manifests (stack.xml):提供關于Stack元數據,包括它的許可信息和Stack之間依賴關系。
四、 ?社區級
? ? ? ? ROS的社區級概念是ROS網絡上進行代碼發布的一種表現形式。結構如下圖所示:

? ? ? ? 代碼庫的聯合系統。使得協作亦能被分發。這種從文件系統級別到社區一級的設計讓獨立地發展和實施工作成為可能。正是因為這種分布式的結構,似的ROS迅速發展,軟件倉庫中包的數量指數級增加。
參考資料:
(1)《開源機器人操作系統——ROS》 張建偉等著
(2)《an open-source Robot Operating System》 paper
(3) ?willowgarage公司網站:http://www.willowgarage.com/
(4) ?ROS官方wiki:http://www.ros.org
(4) ?ROS官方wiki:http://www.ros.org