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