機器人作業系統

ROS（，一般譯為機器人作業系統），是專為機器人軟體開發所設計出來的一套電腦作業系統架構。它是一個開源的元級作業系統（後作業系統），提供類似於作業系統的服務，包括硬體抽象描述、底層驅動程式管理、共用功能的執行、程式間訊息傳遞、程式發行包管理，它也提供一些工具和庫用於獲取、建立、編寫和執行多機融合的程式。

ROS 的執行架構是一種使用 ROS 通訊模組實現模組間 P2P 的松耦合的網路連線的處理架構，它執行若干種類型的通訊，包括：

基於服務的同步 RPC（遠端過程呼叫）通訊；
基於 Topic 的非同步資料流通訊，還有引數伺服器上的資料儲存。

發展目標

ROS 的首要設計目標是在機器人研發領域提高程式碼複用率。ROS 是一種分散式處理框架（又名 Nodes）。這使可執行檔案能被單獨設計，並且在執行時鬆散耦合。這些過程可以封裝到資料包（Packages）和堆疊（Stacks）中，以便於共享和分發。ROS 還支援程式碼庫的聯合系統。使得協作亦能被分發。這種從檔案系統級別到社群一級的設計讓獨立地決定發展和實施工作成為可能。上述所有功能都能由 ROS 的基礎工具實現。

為了實現 “共享與協作” 這一首要目標，人們制訂了 ROS 架構中的其他支援性目標：

“輕便”：ROS 是設計得儘可能方便簡易。不必替換主框架與系統，因為 ROS 編寫的程式碼可以用於其他機器人軟體框架中。毫無疑問的，ROS 更易於整合與其他機器人軟體框架。事實上 ROS 已完成與 OpenRAVE、Orocos 和 Player 的整合。
ROS-agnostic 庫：建議的開發模型是使用 clear 的函式介面書寫 ROS-agnostic 庫。
語言獨立性：ROS 框架很容易在任何程式語言中執行。目前已經能在 Python 和 C++ 中順利執行，同時新增有 Lisp、Octave 和 Java 語言庫。
測試簡單：ROS 有一個內建的單元 / 組合集測試框架，稱為 “rostest”。這使得整合除錯和分解除錯很容易。
擴充套件性：ROS 適合於大型即時系統與大型的系統開發專案。

ROS 的概念

ROS 有三個層次的概念：分別為 Filesystem level，Computation graph level， 以及 Communication level。 以下內容具體的總結了這些層次及概念。除了這三個層次的概念， ROS 也定義了兩種名稱 -- Package 資源名稱和 Graph 資源名稱。同樣會在以下內容中提及。

2.1 ROS 的 Filesystem Level

檔案系統層概念就是碟片裡的資源，例如：

Packages ：ROS 的基本組織，可以包含任意格式檔案。一個 Package 可以包含 ROS 執行時處理的檔案（nodes），一個 ROS 的依賴庫，一個數據集合，配置檔案或一些有用的檔案在一起。
Manifests ：Manifests (manifest.xml) 提供關於 Package 元資料，包括它的許可資訊和 Package 之間依賴關係，以及語言特性資訊像編譯旗幟（編譯最佳化引數）。
Stacks : Stacks 是 Packages 的集合，它提供一個完整的功能，像 “navigation stack” Stack 與版本號關聯，同時也是如何發行 ROS 軟體方式的關鍵。
Manifest Stack Manifests: Stack manifests (stack.xml) 提供關於 Stack 元資料，包括它的許可資訊和 Stack 之間依賴關係。
Message (msg) types : 資訊描述，位置在路徑：my_package/msg/MyMessageType.msg, 定義資料型別在 ROS 的 messages ROS 裡面。
Service (srv) types : 服務描述，位置在路徑：my_package/srv/MyServiceType.srv, 定義這個請求和相應的資料結構 在 ROS services 裡面。

2.2 ROS 的 Computation Graph Level

Computation Graph Level（計算圖）就是用 ROS 的 P2P（peer-to-peer 網路傳輸協議）網路集中處理所有的資料。基本的 Computation Graph 的概念包括 Node， Master， Parameter Server，messages, services, topics， 和 bags， 以上所有的這些都以不同的方式給 Graph 傳輸資料。

Nodes : Nodes（節點）是一系列執行中的程式。ROS 被設計成在一定顆粒度下的模組化系統。一個機器人控制系統通常包含許多 Nodes。比如一個 Node 控制雷射雷達，一個 Node 控制車輪馬達，一個 Node 處理定位，一個 Node 執行路徑規劃，另外一個提供圖形化介面等等。一個 ROS 節點是由 Libraries ROS client library 寫成的，例如 roscpp 和 rospy .

Master : ROS Master 提供了登記列表和對其他計算圖的查詢。沒有 Master，節點將無法找到其他節點，交換訊息或呼叫服務。
Server Parameter Server: 引數伺服器使資料按照鍵的方式儲存。目前，引數伺服器是 Master 的組成部分。
Messages : 節點之間透過 messages 來傳遞訊息。一個 message 是一個簡單的資料結構，包含一些歸類定義的區。支援標準的原始資料型別（整數、浮點數、布林數，等）和原始陣列型別。message 可以包含任意的巢狀結構和陣列（很類似於 C 語言的結構 structs）
Topics : Messages 以一種釋出 / 訂閱的方式傳遞。一個 node 可以在一個給定的 topic 中釋出訊息。Topic 是一個 name 被用於描述訊息內容。一個 node 針對某個 topic 關注與訂閱特定型別的資料。可能同時有多個 node 釋出或者訂閱同一個 topic 的訊息；也可能有一個 node 同時釋出或訂閱多個 topic。總體上，釋出者和訂閱者不瞭解彼此的存在。主要的概念在於將資訊的釋出者和需求者解耦、分離。邏輯上，topic 可以看作是一個嚴格規範化的訊息 bus。每個 bus 有一個名字，每個 node 都可以連線到 bus 傳送和接受符合標準型別的訊息。
Services : 釋出 / 訂閱模型是很靈活的通訊模式，但是多對多，單向傳輸對於分散式系統中經常需要的 “請求 / 回應” 式的互動來說並不合適。因此，“請求 / 回應” 是透過 services 來實現的。這種通訊的定義是一種成對的訊息：一個用於請求，一個用於回應。假設一個節點提供了一個服務提供下一個 name 和客戶使用服務傳送請求訊息並等待答覆。ROS 的客戶庫通常以一種遠端呼叫的方式提供這樣的互動。
Bags : Bags 是一種格式，用於儲存和播放 ROS 訊息。對於儲存資料來說 Bags 是一種很重要的機制。例如感測器資料很難收集但卻是開發與測試中必須的。

在 ROS 的計算圖中，ROS 的 Master 以一個 name service 的方式工作。它給 ROS 的節點儲存了 topics 和 service 的註冊資訊。Nodes 與 Master 通訊從而報告它們的註冊資訊。當這些節點與 master 通訊的時候，它們可以接收關於其他以註冊節點的資訊並且建立與其它以註冊節點之間的聯絡。當這些註冊資訊改變時 Master 也會回饋這些節點，同時允許節點動態建立與新節點之間的連線。

節點之間的連線是直接的； Master 僅僅提供了查詢資訊，就像一個 DNS 伺服器。節點訂閱一個 topic 將會要求建立一個與釋出該 topics 的節點的連線，並且將會在同意連線協議的基礎上建立該連線。ROS 裡面使用最廣的連線協議是 TCPROS，這個協議使用標準的 TCP/IP 介面。

這樣的架構允許解耦操作（decoupled operation），透過這種方式大型或是更為複雜的系統得以建立，其中 names 方式是一種行之有效的手段。names 方式在 ROS 系統中扮演極為重要的角色： topics, services, and parameters 都有各自的 names。每一個 ROS 客戶端庫都支援重新命名，這等同於，每一個編譯成功的程式能夠以另一種形似【名字】執行。

例如，為了控制一個北陽雷射測距儀（Hokuyo laser range-finder），可以啟動 hokuyonode 驅動，這個驅動可以給與雷射儀進行對話並且在 "掃描"topic 下可以釋出 sensormsgs/LaserScan 的資訊。為了處理資料，也許會寫一個使用 laserfilters 的 node 來訂閱 "掃描"topic 的資訊。訂閱之後，過濾器將會自動開始接收雷射儀的資訊。注意兩邊是如何脫鉤工作的。 所有的 hokuyonode 的節點都會完成釋出 "掃描"，不需要知道是否有節點被訂閱了。所有的過濾器都會完成 "掃描" 的訂閱，不論知道還是不知道是否有節點在釋出 "掃描"。 在不引發任何錯誤的情況下，這兩個 nodes 可以任何的順序啟動，終止，或者重啟。

以後也許會給機器人加入另外一個雷射器，系統因此需要重新設定，所需要做的就是重新對映已經使用過的 names。當開始的第一個 hokuyonode 時，可以說它用 basescan 代替了對映掃描，並且和過濾器節點做相同的事。現在，這些節點將會用 basescan 的 topic 來通訊從而代替，並且將不再監聽 "掃描"topic 的資訊。然後就可以為新雷射測距儀啟動另外一個 hokuyonode。