ROS的概念分為三個層次:文件系統(tǒng)層、計算圖層、社區(qū)層,這些層次以及概念將會在接下來的章節(jié)介紹。
除了這三個層次的概念,ROS同樣定義兩個names類型,包資源名稱和圖形資源名稱。
1、ROS文件系統(tǒng)層次
文件系統(tǒng)層概念主要指在硬盤里能看到的ROS目錄和文件, 例如:
- Packages : Packages是在ROS中整理及組織軟體的主要單元。一個Packages包含節(jié)點(ROS runtime processes)、ROS程式庫(ROS-dependent library)、數(shù)據(jù)集(datasets)、配置文件(configuration files)??等等。Packages是您在ROS中能建立及分享的最小單元。
- Metapackages : Metapackages 是一組具體的服務(wù)相關(guān)的功能包。大部分的metpackages 只作為轉(zhuǎn)換rosbuild Stacks的向后兼容的備選。
- Package Manifests : Manifests (package.xml) 描述一個package的元信息,包括了package的名字,版本,功能簡述,證書信息,依賴關(guān)系,以及一些其他的被export的package所有的信息。關(guān)于package.xml 的文件說明,參考REP-0127.
- Repositories : 代碼倉庫是使用VCS版本控制系統(tǒng)的軟件包集合,軟件包利用版本控制維持同一版本,它能使用catkin自動發(fā)布工具bloom進(jìn)行發(fā)布。這些代碼倉庫常通過映射來進(jìn)行轉(zhuǎn)換 rosbuild Stacks.倉庫可以是只有一個軟件包。
- Message (msg) types : 存儲在my_package/msg/MyMessageType.msg的Message文件,主要定義了ROS系統(tǒng)的messages傳輸?shù)臄?shù)據(jù)結(jié)構(gòu)。
- Service (srv) types : 存儲在 my_package/srv/MyServiceType.srv的服務(wù)services文件,定義了ROS的服務(wù)通信時的請求(request )和響應(yīng)(response )相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
2、ROS計算圖層次
- 計算圖*是ROS在點對點網(wǎng)絡(luò)里整合并處理數(shù)據(jù)的過程。基本計算圖概念是 節(jié)點 , 主機(jī) , 參數(shù)服務(wù)器 , 消息 , 服務(wù) , 話題 , 和 數(shù)據(jù)包 ,它們通過不同的方式提供數(shù)據(jù)給圖層。
這些概念是在ros_comm庫里實現(xiàn)的:
- Nodes : 節(jié)點主要執(zhí)行計算處理 。ROS被設(shè)計為細(xì)粒度的模塊化的系統(tǒng);一個機(jī)器人控制系統(tǒng)通常有很多節(jié)點組成 。例如,一個節(jié)點控制激光測距儀,一個節(jié)點控制輪電機(jī),一個節(jié)點執(zhí)行定位,一個節(jié)點執(zhí)行路徑規(guī)劃,一個節(jié)點提供系統(tǒng)圖形界面,等等。一個ROS節(jié)點通過ROS客戶端庫 client library編寫,例如 roscpp 或rospy
- Master : ROS Master 為計算圖的其余部分提供名稱注冊和查找。沒有 Master,節(jié)點將無法找到彼此、交換消息或調(diào)用服務(wù)。
- Parameter Server : 參數(shù)服務(wù)器允許將數(shù)據(jù)按密鑰存儲在一個中央位置。它目前是 Master 的一部分。
- Messages : 節(jié)點之間通過傳遞消息進(jìn)行通信。消息只是一種數(shù)據(jù)結(jié)構(gòu),包括類型化字段。支持標(biāo)準(zhǔn)基本類型(整數(shù)、浮點數(shù)、布爾值等),以及基本類型數(shù)組。消息可以包括任意嵌套的結(jié)構(gòu)和數(shù)組(很像 C 結(jié)構(gòu))。
- Topics : 消息通過具有發(fā)布/訂閱語義的傳輸系統(tǒng)進(jìn)行路由。節(jié)點通過將消息發(fā)布到給定主題來發(fā)送消息。主題是用于標(biāo)識消息內(nèi)容的名稱。對某種數(shù)據(jù)感興趣的節(jié)點將訂閱適當(dāng)?shù)闹黝}。一個主題可能有多個并發(fā)發(fā)布者和訂閱者,一個節(jié)點可能發(fā)布和/或訂閱多個主題。通常,發(fā)布者和訂閱者并不知道彼此的存在。這個想法是將信息的生產(chǎn)與其消費分離。從邏輯上講,可以將主題視為強(qiáng)類型消息總線。每條總線都有一個名稱,任何人都可以連接到總線來發(fā)送或接收消息,只要它們是正確的類型。
- Services : 發(fā)布/訂閱模型是一種非常靈活的通信范式,但其多對多、單向傳輸不適用于請求/回復(fù)交互,而這在分布式系統(tǒng)中通常是必需的。請求/回復(fù)是通過服務(wù)完成的,服務(wù)由一對消息結(jié)構(gòu)定義:一個用于請求,一個用于回復(fù)。提供節(jié)點以某個名稱提供服務(wù),客戶端通過發(fā)送請求消息并等待回復(fù)來使用該服務(wù)。ROS 客戶端庫通常將這種交互呈現(xiàn)給程序員,就好像它是一個遠(yuǎn)程過程調(diào)用。
- Bags : Bags 是一種用于保存和回放 ROS 消息數(shù)據(jù)的格式。袋子是存儲數(shù)據(jù)(例如傳感器數(shù)據(jù))的重要機(jī)制,這些數(shù)據(jù)可能難以收集,但卻是開發(fā)和測試算法所必需的。
ROS Master 在 ROS 計算圖中充當(dāng)名稱服務(wù)。它存儲 ROS 節(jié)點的主題和服務(wù)注冊信息。節(jié)點與 Master 通信以報告其注冊信息。當(dāng)這些節(jié)點與 Master 通信時,它們可以接收有關(guān)其他注冊節(jié)點的信息并進(jìn)行適當(dāng)?shù)倪B接。當(dāng)這個注冊信息發(fā)生變化時,Master 也會對這些節(jié)點進(jìn)行回調(diào),這允許節(jié)點在新節(jié)點運行時動態(tài)創(chuàng)建連接。
節(jié)點直接連接到其他節(jié)點;Master 只提供查找信息,很像 DNS 服務(wù)器。訂閱主題的節(jié)點將從發(fā)布該主題的節(jié)點請求連接,并將通過商定的連接協(xié)議建立該連接。ROS 中最常用的協(xié)議稱為 TCPROS,它使用標(biāo)準(zhǔn)的 TCP/IP 套接字。
這種架構(gòu)允許解耦操作,其中名稱是構(gòu)建更大和更復(fù)雜系統(tǒng)的主要手段。名稱在 ROS 中具有非常重要的作用:節(jié)點、主題、服務(wù)和參數(shù)都有名稱。每個 ROS 客戶端庫都支持名稱的命令行重映射,這意味著可以在運行時重新配置已編譯的程序以在不同的計算圖拓?fù)渲羞\行。
例如,要控制 Hokuyo 激光測距儀,我們可以啟動 hokuyo_node 驅(qū)動程序,它與激光通信并在掃描主題上發(fā)布 sensor_msgs/LaserScan 消息。為了處理這些數(shù)據(jù),我們可能會使用laser_filters 編寫一個節(jié)點來訂閱關(guān)于掃描主題的消息。訂閱后,我們的過濾器會自動開始接收來自激光的消息。
注意兩側(cè)是如何解耦的。hokuyo_node 節(jié)點所做的只是發(fā)布掃描,不知道是否有人訂閱。過濾器所做的只是訂閱掃描,而不知道是否有人發(fā)布它們。這兩個節(jié)點可以按任意順序啟動、終止和重新啟動,而不會引發(fā)任何錯誤情況。
稍后我們可能會為我們的機(jī)器人添加另一個激光器,因此我們需要重新配置我們的系統(tǒng)。我們需要做的就是重新映射使用的名稱。當(dāng)我們開始我們的第一個 hokuyo_node 時,我們可以告訴它重新映射 scan 到 base_scan,并對我們的過濾器節(jié)點做同樣的事情。現(xiàn)在,這兩個節(jié)點都將使用 base_scan 主題進(jìn)行通信,而不會聽到關(guān)于 scan 主題的消息。然后我們可以為新的激光測距儀啟動另一個 hokuyo_node。
3、ROS 交流社區(qū)
ROS 社區(qū)級概念是 ROS 資源,使不同的社區(qū)能夠交換軟件和知識。這些資源包括:
- Distributions : ROS 發(fā)行版是您可以安裝的版本化堆棧的集合。發(fā)行版與 Linux 發(fā)行版扮演著類似的角色:它們使安裝一組軟件變得更加容易,并且它們還可以在一組軟件中保持一致的版本。
- Repositories :ROS 依賴于代碼存儲庫的聯(lián)合網(wǎng)絡(luò),不同的機(jī)構(gòu)可以在其中開發(fā)和發(fā)布自己的機(jī)器人軟件組件。
- The ROS Wiki : ROS 社區(qū) Wiki 是記錄有關(guān) ROS 信息的主要論壇。任何人都可以注冊一個帳戶并貢獻(xiàn)自己的文檔、提供更正或更新、編寫教程等等。
- Bug Ticket System :有關(guān)文件票的信息,請參閱票證。
- Mailing Lists : ros-users 郵件列表是有關(guān) ROS 新更新的主要溝通渠道,也是詢問有關(guān) ROS 軟件問題的論壇。
- ROS Answers : 用于回答您的 ROS 相關(guān)問題的問答網(wǎng)站。
- Blog : 柳葉車庫博客提供定期更新,包括照片和視頻。
4、名稱
4.1、圖資源名稱
圖資源名稱提供分層命名結(jié)構(gòu),用于 ROS 計算圖中的所有資源,例如節(jié)點、參數(shù)、主題和服務(wù)。這些名稱在 ROS 中非常強(qiáng)大,并且對于 ROS 中如何組成更大、更復(fù)雜的系統(tǒng)至關(guān)重要,因此了解這些名稱的工作原理以及如何操作它們至關(guān)重要。
在我們進(jìn)一步描述名稱之前,這里有一些示例名稱:
- / (全局命名空間)
- /foo
- /stanford/robot/name
- /wg/node1
圖資源名稱是ROS中提供封裝的重要機(jī)制。每個資源都定義在一個命名空間中,它可以與許多其他資源共享。通常,資源可以在其命名空間內(nèi)創(chuàng)建資源,并且它們可以訪問在其自己的命名空間內(nèi)或之上的資源。可以在不同命名空間中的資源之間建立連接,但這通常由兩個命名空間上方的集成代碼完成。這種封裝隔離了系統(tǒng)的不同部分,以免意外獲取錯誤命名的資源或全局劫持名稱。
名稱是相對解析的,因此資源不需要知道它們在哪個命名空間中。這簡化了編程,因為可以編寫一起工作的節(jié)點,就好像它們都在頂級命名空間中一樣。當(dāng)這些節(jié)點被集成到一個更大的系統(tǒng)中時,它們可以被下推到一個定義它們代碼集合的命名空間中。例如,可以將一個斯坦福演示和一個 Willow Garage 演示合并到一個帶有 stanford 和 wg 子圖的新演示中。如果兩個演示都有一個名為“camera”的節(jié)點,它們就不會發(fā)生沖突。需要對整個圖形可見的工具(例如圖形可視化)以及參數(shù)(例如 demo_name)可以由頂級節(jié)點創(chuàng)建。
4.1.1、有效名稱
有效名稱具有以下特征:
1.第一個字符是字母字符 ([a-z|A-Z])、波浪號 (~) 或正斜杠 (/)
2.后續(xù)字符可以是字母數(shù)字 ([0-9|a-z|A-Z])、下劃線 (_) 或正斜杠 (/)
例外:基本名稱(如下所述)中不能包含正斜杠 (/) 或波浪號 (~)。
4.1.2、解決
ROS中有四種類型的圖資源名稱:base、relative、global和private,它們的語法如下:
- base
- relative/name
- /global/name
private/name”開頭的名稱是私有的。它們將節(jié)點的名稱轉(zhuǎn)換為命名空間。例如,命名空間 /wg/ 中的 node1 具有私有命名空間 /wg/node1。私有名稱可用于通過參數(shù)服務(wù)器將參數(shù)傳遞到特定節(jié)點。
默認(rèn)情況下,解析是相對于節(jié)點的命名空間完成的。例如,節(jié)點 /wg/node1 具有命名空間 /wg,因此名稱 node2 將解析為 /wg/node2。
沒有命名空間限定符的名稱是基本名稱。基名實際上是相對名的一個子類,具有相同的解析規(guī)則。基本名稱最常用于初始化節(jié)點名稱。
以“/”開頭的名稱是全局的——它們被認(rèn)為是完全解析的。應(yīng)盡可能避免使用全局名稱,因為它們限制了代碼的可移植性。
以“
以下是一些名稱解析示例:
Node | Relative (default) | Global | Private |
---|---|---|---|
/node1 | bar->/bar | /bar->/bar | ~bar->/node1/bar |
/wg/node2 | bar->/wg/bar | /bar->/bar | ~bar->/wg/node2/bar |
/wg/node3 | foo/bar->/wg/foo/bar | /foo/bar->/foo/bar | ~foo/bar->/wg/node3/foo/bar |
4.1.3、重新映射
在命令行啟動節(jié)點時,可以重新映射 ROS 節(jié)點中的任何名稱。有關(guān)此功能的更多信息,請參閱重新映射參數(shù)。
4.2、包資源名稱
包資源名稱在具有文件系統(tǒng)級概念的 ROS 中使用,以簡化引用磁盤上文件和數(shù)據(jù)類型的過程。包資源名稱非常簡單:它們只是資源所在的包的名稱加上資源的名稱。例如,名稱“std_msgs/String”指的是“std_msgs”包中的“String”消息類型。
可以使用包資源名稱引用的一些與 ROS 相關(guān)的文件包括:
- Message (msg) types
- Service (srv) types
- Node types
包資源名稱與文件路徑非常相似,只是它們要短得多。這是因為 ROS 能夠在磁盤上定位包并對它們的內(nèi)容做出額外的假設(shè)。例如,消息描述始終存儲在 msg 子目錄中并具有 .msg 擴(kuò)展名,因此 std_msgs/String 是 path/to/std_msgs/msg/String.msg 的簡寫。同樣,Node 類型 foo/bar 相當(dāng)于在 Package foo 中搜索具有可執(zhí)行權(quán)限的名為 bar 的文件。
4.2.1、有效名稱
包資源名稱具有嚴(yán)格的命名規(guī)則,因為它們經(jīng)常用于自動生成的代碼中。因此,一個 ROS 包不能有除下劃線以外的特殊字符,它們必須以字母字符開頭。有效名稱具有以下特征:
1.第一個字符是字母字符 ([a-z|A-Z])
2.后續(xù)字符可以是字母數(shù)字 ([0-9|a-z|A-Z])、下劃線 (_) 或正斜杠 (/)
3.最多有一個正斜杠 ('/')。
4.3、 代碼接口
roscpp::names 接口參考 (ROS Indigo)
-
計算
+關(guān)注
關(guān)注
2文章
452瀏覽量
39147 -
ROS
+關(guān)注
關(guān)注
1文章
283瀏覽量
17479
發(fā)布評論請先 登錄
相關(guān)推薦
ROS的基本概念和系統(tǒng)架構(gòu) ROS的安裝和簡單測試

超詳細(xì) ROS安裝教程
什么是ROS?ROS產(chǎn)生、發(fā)展和壯大的原因和意義
怎么入門ROS
搭建ARM+ROS的硬件載體之ROS的移植及測試方法
ROS 學(xué)習(xí)筆記之五:對Arduino環(huán)境刮目相看

ROS學(xué)習(xí)筆記之七:ROSSerial初試

ROS基本介紹

ROS1的通信架構(gòu)的基礎(chǔ)通信方式及相關(guān)概念

ROS操作系統(tǒng)學(xué)習(xí)筆記3

ROS操作系統(tǒng)學(xué)習(xí)筆記4
實現(xiàn)ARM+ROS(機(jī)器人操作系統(tǒng))之運行ROS!

Unity與ROS鏈接介紹

評論