前言
当执行一个ROS程序,就被加载到了内存中,就成为了一个进程,在ROS里叫做节点。每一个ROS的节点尽管功能不同,但都有必不可少的一些步骤,比如初始化、销毁,需要通行的场景通常都还需要节点的句柄。 、
初始化节点
对于一个C++写的ROS程序,之所以它区别于普通C++程序,是因为代码中做了两层工作:
- 调用了 ros::init() 函数,从而初始化节点的名称和其他信息,一般我们ROS程序一开始都会以这种方式开始。
- 创建 ros::NodeHandle 对象,也就是节点的句柄,它可以用来创建Publisher、Subscriber以及做其他事情。
句柄(Handle)这个概念可以理解为一个“把手”,你握住了门把手,就可以很容易把整扇门拉开,而不必关心门是什么样子。NodeHandle就是对节点资源的描述,有了它你就可以操作这个节点了,比如为程序提供服务、监听某个topic上的消息、访问和修改param等等。
关闭节点
通常我们要关闭一个节点可以直接在终端上按 Ctrl + C ,系统会自动触发SIGINT句柄来关闭这个进程。 你也可以通过调用 ros::shutdown() 来手动关闭节点,但通常我们很少这样做。以下是一个节点初始化、关闭的例子。
#include<ros/ros.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "your_node_name");
ros::NodeHandle nh;
//....节点功能
//....
ros::spin();//用于触发topic、service的响应队列
return 0;
}
这段代码是最常见的一个ROS程序的执行步骤,通常要启动节点,获取句柄,而关闭的工作系统自动帮我们完成,如果有特殊需要你也可以自定义。你可能很关心句柄可以用来做些什么,接下来我们来看看NodeHandle常用的成员函数。
NodeHandle常用成员函数
包括:
//创建话题的publisher
ros::Publisher advertise(const string &topic, uint32_t que