本文將主要對clearpathrobotics網(wǎng)站關(guān)于ROS的介紹進行翻譯。
1,何為ROS?
ROS(Robot Operating System)是遵從BSD許可的系統(tǒng),它可以在PC上控制機器人的各個組件。ROS系統(tǒng)由多個各自獨立的節(jié)點(組件)組成,并且各個節(jié)點之間可以通過發(fā)布/訂閱(publish/subscribe)消息模型進行通信。例如,我們將一個特定傳感器的驅(qū)動模塊作為一個ROS節(jié)點,其將傳感器數(shù)據(jù)發(fā)布(publish)到消息流。這些消息可能會被某些節(jié)點獲取到,例如濾波器、記錄器、更高級系統(tǒng)中的應(yīng)用如導(dǎo)航、路徑查找等節(jié)點。
(從此段可以理解,ROS的publish操作為某個節(jié)點將其自身數(shù)據(jù)或傳感器數(shù)據(jù)發(fā)送到一個注冊到ROS中的消息池中,其他節(jié)點可以申請獲取數(shù)據(jù),而publish數(shù)據(jù)的節(jié)點不關(guān)心哪些節(jié)點需要,其他節(jié)點如何獲取數(shù)據(jù)將在下面介紹。)
2,為何使用ROS?
ROS中的節(jié)點可以運行在不同的系統(tǒng)、平臺,甚至是不同的架構(gòu)中。假如有一個Arduino publish的消息,你可以使用筆記本訂閱(subscribe)此消息,也可以使用android手機駕駛摩托。對于用戶的需求,ROS具有靈活適應(yīng)性,并且它還是開源的,任何人都可以對它進行維護。
3,核心概念
ROS啟動于ROS Master。Master允許其他ROS中不同軟件片(節(jié)點)查找對方或與對方交流。那樣,我們就不必指定“發(fā)送傳感器數(shù)據(jù)到IP為127.0.0.1的電腦”,我們只需要簡單的告訴Node1發(fā)送消息到Node2.
如何實現(xiàn)節(jié)點間消息傳遞呢?通過publishing 和 subscribing Topics。
設(shè)想有一部相機安裝在機器人上,我們希望可以從相機中或者筆記本上看到圖像,同時讓機器人也可以看到這些圖像。
在我們的例子中,我們定義一個Camera Node,用于和相機通信(驅(qū)動),一個Image Processing Node運行在機器人上處理圖像數(shù)據(jù),一個Image Display Node用于將圖像顯示在屏幕上。開始階段,所有節(jié)點(Node)都要注冊到Master上。Master可以認(rèn)為是一個查詢表,各個節(jié)點可以查詢它要把消息發(fā)送到哪個節(jié)點(peer to peer communication)。
注冊到ROS Master后,Camera Node 聲明它要Publish一個Topic叫做/image_data。另外兩個節(jié)點(Image Processing Node and Image Display Node)聲明他們Subscribe這個Topic /image_data。因此,一旦Camera Node 收到Camera發(fā)送的數(shù)據(jù),就立即將數(shù)據(jù)/image_data直接發(fā)送到另外兩個節(jié)點。(實際上,這就類似于TCP/IP直連,不同的是他們是通過同一個通道image_data,這個image_data應(yīng)該就類似于共享內(nèi)存,這個理解不知道是否正確或者恰當(dāng)。)
那么你又想了,如果Image Processing Node想主動獲取Camera Node收到的數(shù)據(jù)怎么辦呢?ROS定義了Services用于解決這個問題。
節(jié)點可以在ROS Master上注冊一個特定的service,就像注冊它的消息(topic)一樣。在我們的例子中,Image Processing Node第一次請求/image_data,Camera Node將收集Camera的數(shù)據(jù),然后發(fā)送給Image Processing Node。