Mr_matcher的细节1
1.NodeHandle类(或者NodeHandle句柄)的私有名称
1)句柄可以让你通过构造函数指定命名空间
ros::NodeHandle nh("my_namespace");
这使得使用该句柄的任何相对名字都是相对<node_namespace>/my_namespace,而不是只相对<node_namespace>.
你也可以指定一个父句柄和追加的命名空间
ros::NodeHandle nh1("ns1");
ros::NodeHandle nh2(nh1,"ns2");
这将把nh2放入到<node_namespace>/ns1/ns2命名空间
2)也可以指定全局名字
ros::NodeHandle nh("/my_global_namespace");
这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。
3)私有名字
使用私有名字比直接调用有私有名的句柄方法更有技巧,你可以在一个私有命名空间中直接创建一个新的句柄。
ros::NodeHandle nh("~my_private_namespace");
ros::Subscriber sub = nh.subscribe("my_private_topic",....);
以上例子会订阅<node_name>/my_private_namespace/my_private_topic
注意:理解的重点上文中红色标注的部分,node_namespace和node_name是两回事!
自己实验之后:测出命名空间的范围级别区别:rosparam list >rosnode list >rostopic list = rosservice list.topic和service可以被NodeHandle所改变,但是不会因为节点名的改变而改变。
4)命名空间的修改以及节点名的重映射
rosrun turtlesim turtlesim_node __ns:=/home/user1
rosrun turtlesim turtlesim_node __name:=A
rosrun turtlesim turtlesim_node __name:=B
相对名称:
一个主要替代方案是让ROS为计算图源提供一个默认的命名空间,具有此特征的名称叫做相对计算图源名称(ralative graph resource name),或简称为相对名称(relative name)。
设置默认命名空间:为节点选择一个不同的默认命名空间的最好也是最常用的方法是在启动文件中使用命名空间(ns)属性
私有名称:
私有名称,以一个波浪字符(~)开始, 是第三类也是最后一类计算图源名称。和相对名称一样,私有名称并不能完全确定它们自身所在的命名空间,
而是需要ROS 客户端库将这个名称解析为一个全局 名称。与相对名称的主要差别在于,私有名称不是用当前默认命名空间,而是用的它们节点名称作为命名空间。
例如,有一个节点,它的全局名称是 /sim1 /pubvel,ROS 将其私有名称∼max_vel 转换至如下全局名称:/sim1/pubvel + ~max_vel⇒ /sim1/pubvel/max_vel 这种命名方式适用的地方
是每个节点内部都有这样一些资源,这些资源只与本节点有关,而不 会与其他节点打交道,这些资源就可以使用私有名称,与松耦合性相对的。私有名称的关键字“private”仅仅表示其他节点
不会使用它们所在的命名空间, 也就是仅在命名空间层面上有意义。对于其他节点来讲,只要知道私有名称解析后的全局名称,都可以通过其全局名称访问这些计算图源。
二者的组合:
rosrun turtlesim turtlesim_node __name:=A __ns:=/home/user1
命名空间:http://wiki.ros.org/Names