ROS2中涉及到的基本概念


從計算圖(Graph)級的角度來看,ROS的本質就是一個基於網絡的數據流動控制器。它的核心roscore其實就相當於一個服務器(Server),主導着數據的流動,每一個程序都相當於一個客戶(Client),客戶之間需要通信,如發送文字、圖片、語音等。

ROS2中涉及到的基本概念有:節點(Node)、話題(Topic)、消息(Message)、服務(Service)和發現(Discovery)。

下面分別予以介紹:

1、節點(Node)

節點是一些執行運算任務的進程,有着數據的輸入和輸出。也就是說,節點就是一個數據傳輸和處理的程序,你可以把ROS系統理解為一張巨大的網絡,在這個網絡中我們有着眾多的節點,網絡中流動着數據。

查看節點的詳細信息命令:

$ ros2 node info /rosout

結果如下:

Node [/rosout] 
Publications: 
* /rosout_agg [rosgraph_msgs/Log] 

Subscriptions:
 * /rosout [unknown type] 

Services: 
* /rosout/set_logger_level 
* /rosout/get_loggers 

contacting node http://machine_name:54614/ ... 
Pid: 5092
--------------------- 

轉自https://blog.csdn.net/sad490/article/details/79829497 

可以看到,節點包含的信息:節點的發布的話題,以及話題中所包含信息的類型,還有這個節點所訂閱(Subscribe)的話題(Topic),還包含着節點包含的服務。

節點也可以被稱之為“軟件模塊”。我們使用“節點”使得基於ROS的系統在運行的時候更加形象化:當許多節點同時運行時,可以很方便的將端對端的通訊繪制成一個圖表,在這個圖表中,進程就是圖中的節點,而端對端的連接關系就是其中弧線連接。

2、消息(Message)

節點之間是通過傳送消息進行通訊的。每一個消息都是一個嚴格的數據結構。原來標准的數據類型(整型,浮點型,布爾型等等)都是支持的,同時也支持原始數組類型。消息可以包含任意的嵌套結構和數組(很類似於C語言的結構structs)。

使用如下命令就可以看到某一種類型所包含的數據類型:

ros2 msg show visualization_msgs/InteractiveMarkerControl

3、主題(Topic)

Topic和C++中的數據流很像,在每一個Topic中,流動着重要的數據,如果某一個程序(其實就是節點)想要了解關於這個話題的數據,就訂閱它,然后,你就可以獲取所感興趣的數據了。由此對於一個話題,有發布、訂閱、查看信息等操作。

消息以一種發布/訂閱的方式傳遞。一個節點可以在一個給定的主題中發布消息。一個節點針對某個主題關注與訂閱特定類型的數據。可能同時有多個節點發布或者訂閱同一個主題的消息。總體上,發布者和訂閱者不了解彼此的存在

發布主題命令:

ros2 topic pub /chatter std_msgs/String "data: Hello world"

查看主題內容命令:

ros2 topic echo /chatter

查看主題的一些信息:

ros2 topic info /chatter

4、服務(Service)

雖然基於話題的發布/訂閱模型是很靈活的通訊模式,但是它廣播式的路徑規划對於可以簡化節點設計的同步傳輸模式並不適合。在ROS中,我們稱之為一個服務,用一個字符串和一對嚴格規范的消息定義:一個用於請求,一個用於回應。這類似於web服務器,web服務器是由URIs定義的,同時帶有完整定義類型的請求和回復文檔。需要注意的是,不像話題,只有一個節點可以以任意獨有的名字廣播一個服務:只有一個服務可以稱之為“分類象征”,比如說,任意一個給出的URI地址只能有一個web服務器。


5、發現(Discovery)

ROS2里是沒有master的,那么節點之間是怎么知道彼此存在的呢?這就全靠一種自動發現的機制——Discovery。什么意思呢?簡單來說,當一個節點啟動后,首先在網絡中發條廣播,大聲告訴這個世界我來了,其他節點聽到之后,也紛紛反饋各自的信息,這樣一來二去也就聯系上了。當然,萬一哪個節點掉線了怎們辦?沒關系,每個節點都會周期性的發布廣播,告訴其他節點他還在線,就算要下線,他也會廣播告訴其他節點他要走了,下次再聊。總之,發現(Discovery)可以理解為一種身份聲明和響應的機制。

另外,再來介紹兩個文件系統級的基本概念。
ROS文件系統級指的是在硬盤上面查看的ROS源代碼的組織形式。

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

6、包(package)

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

7、堆(stack)

堆是包的集合,它提供一個完整的功能,像“navigation stack”。Stack與版本號關聯,同時也是如何發行ROS軟件方式的關鍵。

ROS是一種分布式處理框架。這使可執行文件能被單獨設計,並且在運行時松散耦合。這些過程可以封裝到包(Packages)和堆(Stacks)中,以便於共享和分發。下圖是在包和堆在文件中的具體結構:


Manifests (manifest.xml):提供關於Package元數據,包括它的許可信息和Package之間依賴關系,以及語言特性信息像編譯旗幟(編譯優化參數)。
Stack manifests (stack.xml):提供關於Stack元數據,包括它的許可信息和Stack之間依賴關系。


參考博客:

https://blog.csdn.net/hcx25909/article/details/8795211
https://blog.csdn.net/sad490/article/details/81475280  
https://blog.csdn.net/sad490/article/details/79829497                                                                                                 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM