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的方式。