一 概論node
名稱就是代號,ros中的節點、話題和參數的名稱必須是惟一的,這很容易想到,若是你認識兩個叫同樣名字的人,單憑一個名字你是分辨不出來講的這我的究竟是誰,因此 ros中的名稱必須是惟一的。spa
可是,這個規定與現實不符啊,分明現實中就有這種狀況啊,因此咱們很容易想到兩種辦法code
1 把兩我的的名字前加點東西,如三班的A和四班的A(命名空間)blog
2 分別叫這兩我的的小名,或者綽號。(重映射)class
經過這種方式就能夠解決名字衝突的問題。軟件
ros中這兩種方式分別叫作命名空間和重映射。命名空間
二 命名空間方法
咱們在安裝軟件時,兩個軟件文件夾中可能都有readme.txt,咱們能夠經過/來限定命名空間im
/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:=),有時可能須要二者組合使用。