os::NodeHandle类有两个作用:

第一、它在roscpp程序内提供了一种RAII(Resource Acquisition Is Initialization)类型式启动和关闭内部节点的方法.

第二、它提供了名字空间解决方案中额外一层,使对于子部件的写操作更加简单.

1、自动地启动和关闭

在节点初始化和关闭一节中,使用ros::NodeHandle管理节点的内部引用,使启动和关闭一个节点变得简单.

在创建时,如果一个内部节点没有被启动,节点句柄将启动该节点.一旦所有的节点句柄实例被销毁,那么节点将被自动关闭.    

2、命名空间

节点句柄允许给构造器明确一个命名空间

 

ros::NodeHandle nh("my_namespace");

 

这使节点拥有相对命名<node_namespace>/my_namespace,而不仅仅是<node_namespace>

也可以给节点句柄明确一个父节点句柄和一个紧跟的命名空间

 

ros::NodeHandle nh1("ns1");//ns1=namespace1
ros::NodeHandle nh2(nh1, "ns2");//nh1下的namespace2

 

这使节点句柄nh2进入<node_namespace>/nh1/nh2命名空间下

全局命名

 

ros::NodeHandle nh("/my_global_namespace");

 

一般不鼓励这样做,因为它可以导致节点被推入命名空间(例如:roslaunch),然而,在代码中使用全局名称时会非常有用。

局部命名

 

ros::NodeHandle nh("~my_private_namespace"); 
ros::Subscriber sub = nh.subscribe("my_private_topic", ...);

 

上面的例子将订阅<node_name>/my_private_namespace/my_private_topic

 

 

 

 

posted on 2018-11-22 11:49  一抹烟霞  阅读(367)  评论(0编辑  收藏  举报

Live2D