一、编写回调函数
订阅者节点无法知道消息什么时候到达,为了解决这个问题,必须把响应收到消息事件的代码放到回调函数中,ros每接受一个新的消息将调用一次这个函数。
void function_name(const package_name::type_name &msg)
{
...
}
package_name::type_name和发布消息时的相同,指明了想要订阅话题的消息类。回调函数的主体有权限访问接收到消息的所有域,并以她认为合适的方式存储、使用或丢弃接受到的数据。(必须包含定义该类的头文件)
二、创建订阅者对象
为订阅话题,需创建ros::Subscriber对象
ros::Subscriber sub = node_handle.subscribe(topic_name, queue_size, pointer_to_callback_function);
pointer_to_callback_function:指向回调函数的指针,当有函数到达时,通过指针找到回调函数。注意:不能在函数名后添加括号。在C++中,&运算符可选,许多程序会忽略,编译器会分辨出需要的时一个函数指针而不是函数运行的返回值,因为函数名后面没有括号。建议包含,因为会使读者明显的看出使用指针。
三、给ROS控制权
ros::spinOnce();
要求ros执行所有挂起的回调函数,然后将控制权返回给我们
ros::spin();
要求ros等待并且执行回调函数,直达这个节点关机。大体等于下列循环:
while(ros::ok())
{
ros::spinOnce();
}