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