ROS的命名空間與重對映

2021-08-21 23:33:50 字數 2188 閱讀 5290

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 就是一種命名空間名稱的方式...