ROS知识:关于如何命名的约定
概述:
命名主要是兩個(gè)范疇,一個(gè)是資源命名。一個(gè)是對(duì)包進(jìn)行命名。兩種規(guī)則有些相同,也有不同。
1 資源和名稱(chēng)
1.1 概述
在運(yùn)算圖中,參與運(yùn)算的資源有:節(jié)點(diǎn)、參數(shù)、主題和服務(wù)。
資源名稱(chēng)提供了一種分層命名結(jié)構(gòu),用于ROS計(jì)算圖中的所有資源,這些名稱(chēng)在ROS中非常強(qiáng)大,對(duì)于ROS中如何組成更大、更復(fù)雜的系統(tǒng)至關(guān)重要,因此了解這些名稱(chēng)如何工作以及如何操作它們至關(guān)重要。
在我們進(jìn)一步描述名稱(chēng)之前,以下是一些示例名稱(chēng):
-
/ (the global namespace)
-
/foo
-
/stanford/robot/name
-
/wg/node1
運(yùn)算圖資源名稱(chēng)是ROS中提供封裝的重要機(jī)制。存在命名空間的約定和封裝:
- 每個(gè)資源都定義在一個(gè)名稱(chēng)空間中,它可以與許多其他資源共享。
- 資源可以在其命名空間內(nèi)創(chuàng)建資源,并且可以訪問(wèn)其自己命名空間內(nèi)或之上的資源。
- 可以在不同名稱(chēng)空間中的資源之間建立連接,但這通常是通過(guò)兩個(gè)名稱(chēng)空間之上的集成代碼來(lái)完成的。
這種封裝將系統(tǒng)的不同部分與意外獲取錯(cuò)誤命名的資源或全局劫持名稱(chēng)隔離開(kāi)來(lái)。
名稱(chēng)的解析是相對(duì)的。因此資源不需要知道它們位于哪個(gè)命名空間中。這簡(jiǎn)化了編程,因?yàn)榭梢韵窬帉?xiě)頂級(jí)名稱(chēng)空間中的節(jié)點(diǎn)一樣編寫(xiě)協(xié)同工作的節(jié)點(diǎn)。當(dāng)這些節(jié)點(diǎn)集成到一個(gè)更大的系統(tǒng)中時(shí),可以將它們下推到定義其代碼集合的命名空間中。例如,可以使用一個(gè)斯坦福演示和一個(gè)柳樹(shù)車(chē)庫(kù)演示,并將它們與斯坦福和wg子圖合并成一個(gè)新的演示。如果兩個(gè)演示都有一個(gè)名為“camera”的節(jié)點(diǎn),它們就不會(huì)沖突。頂層節(jié)點(diǎn)可以創(chuàng)建需要對(duì)整個(gè)圖形可見(jiàn)的工具(如圖形可視化)以及參數(shù)(如demo_name)。
1.2 有效名稱(chēng)
有效名稱(chēng)具有以下特征:
- 第一個(gè)字符是字母字符([a-z | a-z])、波浪號(hào)(~)或正斜杠(/)
- 后續(xù)字符可以是字母數(shù)字([0-9 | a-z | a-z])、下劃線(z)或正斜杠(/)
例外:基名稱(chēng)(最頂端節(jié)點(diǎn))中不能有正斜杠(/)或波浪號(hào)(~)。
1.3 命名規(guī)則
ROS中有四種類(lèi)型的圖形資源名稱(chēng):base、relative、global和private,它們具有以下語(yǔ)法:
-
base
-
relative/name
-
/global/name
-
~private/name
默認(rèn)情況下,解析是相對(duì)于節(jié)點(diǎn)的命名空間完成的。例如,節(jié)點(diǎn)/wg/node1具有名稱(chēng)空間/wg,因此名稱(chēng)node2將解析為/wg/node2。
沒(méi)有任何名稱(chēng)空間限定符的名稱(chēng)都是基名稱(chēng)。基本名稱(chēng)實(shí)際上是相對(duì)名稱(chēng)的一個(gè)子類(lèi),具有相同的解析規(guī)則。基本名稱(chēng)最常用于初始化節(jié)點(diǎn)名稱(chēng)。
以“/”開(kāi)頭的名稱(chēng)是全局的——它們被認(rèn)為是完全解析的。應(yīng)盡可能避免使用全局名稱(chēng),因?yàn)樗鼈兿拗屏舜a的可移植性。
以“~”開(kāi)頭的名稱(chēng)是私有的。它們將節(jié)點(diǎn)的名稱(chēng)轉(zhuǎn)換為名稱(chēng)空間。例如,namespace/wg/中的node1具有私有名稱(chēng)空間/wg/node1。私有名稱(chēng)對(duì)于通過(guò)參數(shù)服務(wù)器將參數(shù)傳遞到特定節(jié)點(diǎn)非常有用。
以下是一些名稱(chē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 |
1.4 資源名稱(chēng)可以重新映射
當(dāng)在命令行上啟動(dòng)節(jié)點(diǎn)時(shí),可以重新映射ROS節(jié)點(diǎn)中的任何名稱(chēng)。有關(guān)此功能的詳細(xì)信息,請(qǐng)參見(jiàn)重新映射參數(shù)。
2 對(duì)應(yīng)用包的命名規(guī)則
2.1 包資源名稱(chēng)
包資源名稱(chēng)在ROS中與文件系統(tǒng)級(jí)概念一起使用,以簡(jiǎn)化引用磁盤(pán)上的文件和數(shù)據(jù)類(lèi)型的過(guò)程。包資源名稱(chēng)非常簡(jiǎn)單:它們只是資源所在包的名稱(chēng)加上資源的名稱(chēng)。例如,名稱(chēng)“std_msgs/String”指的是“std_msgs”包中的“String”消息類(lèi)型。
可以使用包資源名稱(chēng)引用的一些ROS相關(guān)文件包括:
-
Message (msg) types
-
Service (srv) types
-
Node types
包資源名稱(chēng)與文件路徑非常相似,只是它們要短得多。這是由于ROS能夠在磁盤(pán)上定位軟件包并對(duì)其內(nèi)容進(jìn)行額外假設(shè)。例如,消息描述始終存儲(chǔ)在msg子目錄中,并具有.msg擴(kuò)展名,因此std_msgs/String是path/to/std_msgs/msg/String.msg的縮寫(xiě)。類(lèi)似地,節(jié)點(diǎn)類(lèi)型foo/bar相當(dāng)于在具有可執(zhí)行權(quán)限的包foo中搜索名為bar的文件。
2.2 包的有效名稱(chēng)
包資源名稱(chēng)具有嚴(yán)格的命名規(guī)則,因?yàn)樗鼈兺ǔS糜谧詣?dòng)生成的代碼中。因此,ROS包不能有下劃線以外的特殊字符,并且必須以字母字符開(kāi)頭。有效名稱(chēng)具有以下特征:
- First character is an alpha character ([a-z|A-Z])
-
Subsequent characters can be alphanumeric ([0-9|a-z|A-Z]), underscores (_) or a forward slash (/)
- There is at most one forward slash ('/').
參考資料:
Names - ROS Wiki
總結(jié)
以上是生活随笔為你收集整理的ROS知识:关于如何命名的约定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ROS知识:ros和硬件的连接点---R
- 下一篇: ROS知识: vanilla(香草) C