ROS的命名空间与重映射

ROS的命名空间有 全局命名空间 相对命名空间 私有命名空间
对应着       全局名称   相对名称   私有名称
用于区分topic


全局名称

以“/”开头的节点名
话题名表示其属于全局命名空间,被称为全局名称,在整个程序中是独一无二的,具有绝对的意味

例如
/turtlesim
/turtle1/cmd_vel
/A/B/C/D/E

当以全局名称订阅一个topic的时候,节点只会寻找这个全局名称,比如你订阅了/A/cmd_vel,节点不会接收
/cmd_vel或者/B/cmd_vel或者/X/A/cmd_vel


相对名称

相对名称没有“/

例如
turtlesim
turtle1/cmd_vel
A/B/C/D/E

ROS会为相对名称提供一个默认的命名空间(默认为“/”),但你可以为每个节点设置默认命名空间。下面是几个例子

1.大部分ROS程序接受叫**__ns**的命令行参数,此参数将为程序指定一个默认命名空间。
例如:*rosrun turtlesim turtlesim_node __ns:=/my

2.一般在launch文件里使用命名空间

例如:


	
    
    
	

这里就将整个launch里的节点都带上了默认命名空间**/ABC**(包括订阅的节点)

为什么要使用相对名称
1.当有很多层命名空间的时候,写这些话题名会让你很难受,比如/a/b/c/d/e/cmd_vel,你可能花费大把的时间用来写名称,并且容易导致失误。这时候,一个好的选择是使用相对名称。
2.方便移植,当你移植别人的节点到你的程序的时候,如果别人使用的都是全局名称,你不得不在其基础上进行修改来防止节点发生名称冲突。如果别人使用的是相对名称,你可以通过定义不同的命名空间来快速的移植,也有有利于系统结构的清晰。


私有名称

私有名称以一个波浪字符(“”)开头
私有名称也不能够完全确定它们自身所在的命名空间,和相对名称的区别是 私有名称使用的不是默认命名空间,而是用它们的节点名称作为命名空间

例如

ros::init(argc, argv, "name");
ros::NodeHandle nh("~");   //创造句柄的时候指明了其命名空间为**私有命名空间**
ros::Subscriber sub = nh.subscribe("topic", ...);  //订阅的话题是 name/topic
ros::Publisher  pub = nh.advertise("topic", ...);  //发布的话题是 nmae/topic

为什么要使用私有名称
每个节点内部都有一些资源,这些资源只与本节点相关,不会与其他节点打交道,这时候为了安全我们使用私有名称。


重映射

用于改变名称
一个节点订阅了一个Point类型的消息,订阅的名称叫A, 有一个节点发布了Point类型的消息,发布的类型叫B,显然这种情况下两个节点是没有办法进行通信的
这时候可以做的就是在启动A的.launch文件里将A重映射到B,这时候就可以看做订阅了B,从而完成了两个节点的通信。
重映射的语法是 (相对名称和私有名称也都是可以重映射的)


	


借用别人的总结,在ROS中名称是唯一的。命名空间和重映射都是为此服务的。

                                                                      转载请注明出处
                                                                      欢迎留言讨论

你可能感兴趣的:(ROS,ROS)