参考:
https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter6/6.5.html
1.NodeHandle
ros::NodeHandle
对象,也就是节点的句柄,它可以用来创建Publisher
、Subscriber
以及做其他事情。
句柄(Handle
)这个概念可以理解为一个“把手”,你握住了门把手,就可以很容易把整扇门拉开,而不必关心门是什么样子。NodeHandle
就是对节点资源的描述,有了它你就可以操作这个节点了,比如为程序提供服务、监听某个topic
上的消息、访问和修改param
等等。
2.NodeHandle的命名空间的影响
2.1.对topic的影响
2.2.对param的影响
在实际的项目中,实例化句柄时,经常会看到两种不同的写法 ros::NodeHandle n;
ros::NodeHandle nh("~");
这两种写法有什么不同呢?以本教学报的name_demo
为例。在本节launch
文件夹的demo.launch
定义两个参数,一个全局serial
他的数值是5,一个是局部的serial
,他的数值是10.
<launch>
<!--全局参数serial-->
<param name="serial" value="5" />
<node name="name_demo" pkg="name_demo" type="name_demo"
output="screen">
<!--局部参数serial-->
<param name="serial" value="10" />
</node>
</launch>
在name_demo.cpp
中,我们分别尝试了,利用全局命名空间句柄提取全局的param
和局部的param
,以及在局部命名空间下的句柄提取全局的param
和局部的param
,详细的代码如下:
#include <ros/ros.h>
int main(int argc, char* argv[])
{
int serial_number = -1;//serial_number初始化
ros::init(argc, argv, "name_demo");//node初始化
/*创建命名空间*/
//n 是全局命名空间
ros::NodeHandle n;
//nh 是局部命名空间
ros::NodeHandle nh("~");
/*全局命名空间下的Param*/
ROS_INFO("global namespace");
//提取全局命名空间下的参数serial
n.getParam("serial", serial_number);
ROS_INFO("global_Serial was %d", serial_number);
//提取局部命名空间下的参数serial
n.getParam("name_demo/serial", serial_number);//在全局命名空间下,要提取局部命名空间下的参数,需要添加node name
ROS_INFO("global_to_local_Serial was %d", serial_number);
/*局部命名空间下的Param*/
ROS_INFO("local namespace");
//提取局部命名空间下的参数serial
nh.getParam("serial", serial_number);
ROS_INFO("local_Serial was %d", serial_number);
//提取全局命名空间下的参数serial
nh.getParam("/serial", serial_number);//在局部命名空间下,要提取全局命名空间下的参数,需要添加“/”
ROS_INFO("local_to_global_Serial was %d", serial_number);
ros::spin();
return 0;
}
最后的结果:
[ INFO] [1525095241.802257811]: global namespace
[ INFO] [1525095241.803512501]: global_Serial was 5
[ INFO] [1525095241.804515959]: global_to_local_Serial was 10
[ INFO] [1525095241.804550167]: local namespace
[ INFO] [1525095241.805126562]: local_Serial was 10
[ INFO] [1525095241.806137701]: local_to_global_Serial was 5