ros::spin()和ros::spinOnce()介绍讲解及区别

首先要理解的一点是,任何一个发布和订阅,都会有其对应的发布缓存区和订阅缓存区,正如advertise和subscribe函数中都有缓存数量的参数。当有发布者发布消息后,会存放在发布缓存区,如果该topic有订阅者,则从发布缓存区读取到订阅缓存区,等待被使用。
spin()和spinOnce()的目的都是将消息从订阅缓存区拿到回调函数中去,那么这两者有什么区别呢?

spinOnce()

当程序运行到spinOnce()时,程序到相应的topic订阅缓存区查看是否存在消息,如果有消息,则将消息传入回调函数执行回调函数;如果没有消息则继续向后执行。spinOnce()并不是等待到一个消息才向后执行,而是查看有没有消息!

spin()

当程序运行到spin()时,程序同样去相应的topic订阅缓存区查看是否有消息,如果有消息,则将消息传入回调函数;如果没有消息则重复上述过程。因此spin()可以当作是对spinOnce()的循环,即:

while(1)
{
	ros::spinOnce();
}

显然,spin()后面的代码将不会再被执行,表现出来的功能就是持续等待消息。

总结

刚接触ros时,以为消息机制会类似于android的监听机制,即开启监听后就启动了监听线程在后台不断等待消息,有消息后马上就可以传入回调函数开始执行。而实际实验后发现只有运行到spin()及spinOnce()时才会去查看消息。

你可能感兴趣的:(ROS,ros,topic,message,消息,spin)