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