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文件


    
    
    

cpp文件部分

ros::NodeHandle nh;
nh.param("id", id, 1);

2. private的方式

launch文件


    
    
        
    

cpp文件部分

ros::NodeHandle nh_private("~");
nh_private.param("id", id, 1);

可以看出cpp文件部分param的参数都是"id",但是launch文件部分不同,relative方式的node和param是并列的,而在private的方式里param是node的部分。

relative方式的launch文件如果有多个同时启动,则id的值就会被相互覆盖,因为多个文件中的id的命名空间都是/id。之前不知道private方式的用法,通过加group的方式解决的,走弯路了。一般从launch文件中获取节点的参数时都是用private的方式。

你可能感兴趣的:(ros)