天天看点

ROS命名空间

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

ros