ROS指令空間是一個很重要的内容,官方文檔:http://wiki.ros.org/Names
分為三類:relative,global,private。下邊是一個官網給的示例。
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 |
global最好了解,隻要字首是/,那麼命名空間就和寫的一樣,不會改變。
private也好了解,字首是~,那麼命名空間的字首包含節點的命名空間,相當于是節點命名空間下的一個屬性。
relative直覺的看起來,是和節點的命名空間并列的,即和節點的命名空間相比,擁有相同的字首。
下邊用一個launch檔案和param獲得參數的例子說明一下
1. relative的方式
launch檔案
<launch>
<arg name="id" default="0"/>
<node name="uav$(arg id)" pkg="test_limit" type="main" output="screen"/>
<param name="id" type="int" value="$(arg id)"/>
</launch>
cpp檔案部分
ros::NodeHandle nh;
nh.param<int>("id", id, 1);
2. private的方式
launch檔案
<launch>
<arg name="id" default="0"/>
<node name="uav$(arg id)" pkg="test_limit" type="main" output="screen">
<param name="id" type="int" value="$(arg id)"/>
</node>
</launch>
cpp檔案部分
ros::NodeHandle nh_private("~");
nh_private.param<int>("id", id, 1);
可以看出cpp檔案部分param的參數都是"id",但是launch檔案部分不同,relative方式的node和param是并列的,而在private的方式裡param是node的部分。
relative方式的launch檔案如果有多個同時啟動,則id的值就會被互相覆寫,因為多個檔案中的id的命名空間都是/id。之前不知道private方式的用法,通過加group的方式解決的,走彎路了。一般從launch檔案中擷取節點的參數時都是用private的方式。