1.ROS是什么
ROS是一個適用於機器人的開源的元操作系統。其實它並不是一個真正的操作系統,其底層的任務調度、編譯、尋址等任務還是由Linux操作系統完成,也就是說ROS實際上是運行在Linux上的次級操作系統。但是ROS提供了操作系統應用的各種服務(如:硬件抽象、底層設備控制、常用函數實現、進程間消息傳遞、軟件包管理等),也提供了用於獲取、編譯、跨平台運行代碼的工具和函數。ROS主要采用松耦合點對點進程網絡通信,目前主要還是支持Ubuntu系統,windows和Mac OS目前支持的還不好,所以推薦在Ubuntu系統上安裝使用ROS。
2.ROS的概念
ROS 是一個用於開發機器人應用程序的、類似操作系統的機器人軟件平台。ROS 提供開發機器人應用程序時所需的硬件抽象、子設備控制,以及機器人工程中廣泛使用的傳感、識別、繪圖、運動規划等功能。此外 ROS 還提供進程之間的消息解析、功能包管理、庫和豐富的開發及調試工具。
主節點
主節點(master)負責節點到節點的連接和消息通信,類似於名稱服務器(Name Server) 。
roscore 是它的運行命令,當您運行主節點時,可以注冊每個節點的名字,並根據需要獲取信息。沒有主節點,就不能在節點之間建立訪問和消息交流(如話題和服務)
節點
節點(node)是指在 ROS 中運行的最小處理器單元。可以把它看作一個可執行程序。在
ROS 中,建議為一個目的創建一個節點,建議設計時注重可重用性。例如,在移動機器人的情況下,為了驅動機器人,將每個程序細分化。也就是說,使用傳感器驅動、傳感器數據轉換、 障礙物判斷、電機驅動、編碼器輸入和導航等多個細分節點。
功能包
功能包(package)是構成 ROS 的基本單元。ROS 應用程序是以功能包為單位開發的。功能包包括至少一個以上的節點或擁有用於運行其他功能包的節點的配置文件。它還包含功能 包所需的所有文件,如用於運行各種進程的 ROS 依賴庫、數據集和配置文件等。
消息
節點之間通過消息(message)來發送和接收數據。消息是諸如 integer, floatingpoint 和 boolean 等類型的變量。用戶還可以使用諸如消息里包括消息的簡單數據結構或列舉消息的消息數組的結構。使用消息的通信方法包括 TCPROS, UDPROS 等,根據情況使用單向消息發送/接收方式的話題(topic)和雙向消息請求(request) /響應(response)方式的服務
(service) 。
話題
話題(topic)就是“故事" 。在發布者(publisher)節點關於故事向主節點注冊之后,它以消息形式發布關於該故事的廣告。希望接收該故事的訂閱者(subscriber)節點獲得在主節 點中以這個話題注冊的那個發布者節點的信息。基於這個信息,訂閱者節點直接連接到發布者節點,用話題發送和接收消息。
發布與發布者
發布(publish)是指以與話題的內容對應的消息的形式發送數據。為了執行發布,發布者(publisher)節點在主節點上注冊自己的話題等多種信息,並向希望訂閱的訂閱者節點發送消息。發布者在節點中聲明自己是執行發布的個體。單個節點可以成為多個發布者。
訂閱與訂閱者
訂閱是指以與話題內容對應的消息的形式接收數據。為了執行訂閱,訂閱者節點在主節 點上注冊自己的話題等多種信息,並從主節點接收那些發布此節點要訂閱的話題的發布者節
點的信息。基於這個信息,訂閱者節點直接聯系發布者節點來接收消息。訂閱者在節點中聲 明自己執行訂閱的個體。單個節點可以成為多個訂閱者。
3.ROS的架構
OS層
ROS並不是一個傳統意義上的操作系統,無法像Windows、Linux一樣直接運行在計算機硬件之上。ROS1主要構建於Linux系統之上,ROS2帶來了改變,支持構建的系統包括Linux、Windows、Mac、RTOS,甚至沒有操作系統的裸機。
中間層
Linux是一個通用系統,並沒有針對機器人開發提供特殊的中間件,ROS在中間層做了大量的工作,其中最為重要的就是基於TCPROS/UDPROS的通信系統,這是基於TCP/UDP網絡所做的再次封裝。通信系統使用發布/訂閱、客戶端/服務器等模型,實現多種通信機制的數據傳輸。
除了TCPROS/UDPROS的通信機制外,ROS還提供一種進程內的通信方法——Nodelet,可以為多進程通信提供一種更優化的數據傳輸方式,適合對數據傳輸實時性方面有較高要求的應用。
ROS1的通訊系統基於TCPROS/UDPROS,而ROS2的通訊系統基於DDS。DDS是一種分布式實時系統中數據發布/訂閱的標准解決方案。ROS2內部提供了DDS的抽象層實現,用戶不需要關注底層DDS的提供廠家。
在ROS1的架構中Nodelet和TCPROS/UDPROS是並列的層次,為同一個進程中的多個節點提供一種更優化的數據傳輸方式。ROS2中也保留了這種數據傳輸方式,只不過換了一個名字,叫做“Intra-process”,同樣也是獨立於DDS。
在通信機制之上,ROS提供了大量機器人開發相關的庫,如數據類型定義、坐標變換、運動控制等,可以提供給應用層使用。
應用層
ROS1強依賴於ROS Master(通過遠程過程調用提供登記列表和對其他計算圖表的查找功能,幫助ROS節點之間相互查找、建立連接,同時還為系統提供參數服務器,管理全局參數),一旦Master宕機,整個系統會面臨崩潰的處境。但是從右邊ROS2的架構中可以發現,之前讓人耿耿於懷的Master終於消失了,節點之間使用一種稱為“Discovery”的發現機制來獲取彼此的信息。
ROS社區內共享了大量的機器人應用功能包,這些功能包內的模塊以節點為單位運行,以ROS標准的輸入輸出作為接口,開發者不需要關注模塊的內部實現機制,只需要了解接口規則即可實現復用,極大地提高了開發效率。
從系統實現的角度,ROS也可以分為三個層次:文件系統(程序文件的組織和構建)、計算圖(從計算圖的角度來看,ROS系統軟件的功能模塊以節點為單位獨立運行,可以分布於多個相同或不同的主機中,在系統運行時通過端到端的拓撲結構進行連接)和開源社區。
4.ROS 的工作過程
ROS可以形象的描述為一個工廠的運行機制,創建好一個工作空間(workspace)就像一個工廠,工廠里又有好多個生產車間,每個功能包(pkg)看作是一個生產車間,每個生產車間又有好多工人在配合,每個節點(node)看作是一個工人,節點是又是可執行程序的最小單位,工人們之間相互溝通通過消息(mesage)來完成。
話題(topic)
話題是單向的,一般用於連續發送數據的傳感器,建立一次聯系后,一個發布者可以向多個訂閱者發送信息,同樣,一個訂閱者也可以訂閱多個發布者的消息。
服務(service)
服務是同步雙向的通信機制,服務器只有在有請求的時候才響應,客戶端在發出請求后才接受響應。當服務的請求和響應完成時,兩個連接點自動斷開。
動作(action)
動作的通訊方式與服務有類似的情況,不同的是服務器收到請求后直至完成響應所需時間較長,中途需要反饋給客戶端目前完成的情況,報告當前的現狀。
由以上三種通訊方式完成ROS節點間的信息交流,但是發布者,訂閱者,服務服務器,服務客戶端,動作服務器,動作客戶端分布在不同的節點中。這些節點需要一個讓它們建立聯系的主節點構建通信的橋梁。分布在外面的不同節點,向主節點注冊自己的信息,以便其它節點訪問,同時向主節點獲取那些訪問自己節點的信息。獲取后節點和節點間就可以通訊,不再需要主節點。
5.ROS中話題與服務的區別
話題和服務是 ROS 中使用最多的通信方法,它們之間有很多不同之處:
條目 | 話題 | 服務 |
---|---|---|
同步性 | 異步 | 服務 |
通信模型 | 發布/訂閱 | 客戶端/服務器 |
反饋機制 | 無 | 有 |
實時性 | 弱 | 強 |
底層協議 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
緩沖區 | 有 | 無 |
節點關系 | 多對多 | 一對多(一個Server) |
使用場景 | 弱邏輯處理,多數據傳輸 | 強邏輯處理,少數據傳輸 |
話題是 ROS 中基於發布者/訂閱者模型的異步通信,發布者與訂閱者雙方解耦,常用於不斷更新,含有較少邏輯處理的數據通信;
服務是 ROS 中基於客戶端。服務器模型的同步通信,適用於邏輯性強的數據交換;
6.ROS的優缺點
ROS為我們開發機器人帶來了許多方便,然而它也確實存在一些問題:
優點
提供框架、工具和功能
方便移植
龐大的用戶群體
免費開源
缺點
通信實時性能有限
系統穩定性尚不滿足工業級要求
安全性上沒有防護措施