一 概論
名稱就是代號,ros中的節點、話題和參數的名稱必須是唯一的,這很容易想到,如果你認識兩個叫一樣名字的人,單憑一個名字你是分辨不出來說的這個人到底是誰,所以 ros中的名稱必須是唯一的。
但是,這個規定與現實不符啊,分明現實中就有這種情況啊,所以我們很容易想到兩種辦法
1 把兩個人的名字前加點東西,如三班的A和四班的A(命名空間)
2 分別叫這兩個人的小名,或者綽號。(重映射)
通過這種方式就可以解決名字沖突的問題。
ros中這兩種方式分別叫做命名空間和重映射。
二 命名空間
我們在安裝軟件時,兩個軟件文件夾中可能都有readme.txt,我們可以通過/來限定命名空間
/home/user1/readme.txt
/home/user2/readme.txt
其中的命名空間就是/home/user1
這可以在ros中寫為
rosrun turtlesim turtlesim_node __ns:=/home/user1
注意是兩個"_"組成的"__",則用rostopic list輸出的節點為
/home/user1/turtlesim
三 重映射
如果你不想起的名字和別人的名字相同,那么你可以通過重映射來改變自己的名字
如我們想要兩個turtlesim包中的turtlesim_node節點,分別叫做A和B,我們可以采取下面的操作
rosrun turtlesim turtlesim_node __name:=A
rosrun turtlesim turtlesim_node __name:=B
這時再通過rosnode list 讀取節點名稱,我們發現節點名稱變為
/A
/B
也許機智的你想到,可不可以直接
rosrun turtlesim turtlesim_node __name:=/home/user1/A
如果這樣可以的話直接不就ok了嗎?
答案是不行的,這樣混淆了命名空間和名稱的概念,如果你這么做,ros會提醒你:node names cannot contain /
所以有時必須把兩條指令組合起來使用
rosrun turtlesim turtlesim_node __name:=A __ns:=/home/user1
這時節點名為
/home/user1/A
四 總結
ros中的名稱是唯一的,我們有兩種方法可以處理此問題命名空間(__ns:=)和重映射(__name:=),有時可能需要兩者組合使用。