ros的命名空間有全域性命名空間 相對命名空間 私有命名空間
對應著全域性名稱 相對名稱 私有名稱
用於區分topic等
以「/」開頭的節點名
話題名表示其屬於全域性命名空間,被稱為全域性名稱,在整個程式中是獨一無二的,具有絕對的意味
例如/turtlesim
/turtle1/cmd_vel
/a/b/c/d/e
當以全域性名稱訂閱乙個topic的時候,節點只會尋找這個全域性名稱,比如你訂閱了/a/cmd_vel,節點不會接收
/cmd_vel或者/b/cmd_vel或者/x/a/cmd_vel
相對名稱沒有「/」
例如turtlesim
turtle1/cmd_vel
a/b/c/d/e
ros會為相對名稱提供乙個預設的命名空間(預設為「/」),但你可以為每個節點設定預設命名空間。下面是幾個例子
1.大部分ros程式接受叫**__ns**的命令列引數,此引數將為程式指定乙個預設命名空間。
例如:*rosrun turtlesim turtlesim_node __ns:=/my
2.一般在launch檔案裡使用命名空間
例如:
這裡就將整個launch裡的節點都帶上了預設命名空間**/abc**(包括訂閱的節點)
為什麼要使用相對名稱
1.當有很多層命名空間的時候,寫這些話題名會讓你很難受,比如/a/b/c/d/e/cmd_vel,你可能花費大把的時間用來寫名稱,並且容易導致失誤。這時候,乙個好的選擇是使用相對名稱。
2.方便移植,當你移植別人的節點到你的程式的時候,如果別人使用的都是全域性名稱,你不得不在其基礎上進行修改來防止節點發生名稱衝突。如果別人使用的是相對名稱,你可以通過定義不同的命名空間來快速的移植,也有有利於系統結構的清晰。
私有名稱以乙個波浪字元(「~」)開頭
私有名稱也不能夠完全確定它們自身所在的命名空間,和相對名稱的區別是 私有名稱使用的不是預設命名空間,而是用它們的節點名稱作為命名空間
例如
為什麼要使用私有名稱ros:
:init
(argc, argv,
"name");
ros:
:nodehandle nh
("~");
//創造控制代碼的時候指明了其命名空間為**私有命名空間**
ros:
:subscriber sub = nh.
subscribe
("topic",.
..);
//訂閱的話題是 name/topic
ros:
:publisher pub = nh.
advertise
("topic",.
..);
//發布的話題是 nmae/topic
每個節點內部都有一些資源,這些資源只與本節點相關,不會與其他節點打交道,這時候為了安全我們使用私有名稱。
用於改變名稱
乙個節點訂閱了乙個point型別的訊息,訂閱的名稱叫a, 有乙個節點發布了point型別的訊息,發布的型別叫b,顯然這種情況下兩個節點是沒有辦法進行通訊的
這時候可以做的就是在啟動a的.launch檔案裡將a重對映到b,這時候就可以看做訂閱了b,從而完成了兩個節點的通訊。
重對映的語法是(相對名稱和私有名稱也都是可以重對映的)
借用別人的總結,在ros中名稱是唯一的。命名空間和重對映都是為此服務的。 4 4 1 rosrun設定命名空間與重對映
1.1設定命名空間演示 語法 rosrun 包名 節點名 ns 新名稱 rosrun turtlesim turtlesim node ns rosrun turtlesim turtlesim node ns yyy兩個節點都可以正常執行 1.2執行結果 rosnode list檢視節點資訊,顯示...
ROS 命名空間
ros 計算圖級資源 節點 引數 主題 服務,這些命名規範和解釋規則適應所有這些資源,在ros中配置引數,進行topic訂閱發布中很重要!命名規範 第乙個字元必須是 a z a z 或者波浪號 或者斜槓 後面的字元可以是 0 9 a z a z 下劃線 斜槓 名字的解釋規則 全域性 global 命...
Ros中的命名空間
ros中的命名空間 在發布或者定閱時,有這麼一行 ros init argc,ar publish node a ros nodehandle nh ros publisher sub pub nh.advertise chattera 1000 第三行 chattera 就是一種命名空間名稱的方式...