1.普通的spin和spinOnce
ros::spin()
用于调用所有可触发的回调函数,将进入循环,不会返回,类似于在循环里反复调用spinOnce()- 而
ros::spinOnce()
只会去触发一次
只有当有消息来时,回调函数才会被触发执行。具体去触发的命令就是ros::spin()
,它会反复的查看有没有消息来,如果有就会让回调函数去处理。
因此千万不要认为,只要指定了回调函数,系统就回去自动触发,你必须ros::spin()
或者ros::spinOnce()
才能真正使回调函数生效。
2.多线程spin和spinOnce
回调函数作为参数被传入到了另一个函数中(在本例中传递的是函数指针),在未来某个时刻(当有新的message到达),就会立即执行。Subscriber接收到消息,实际上是先把消息放到一个队列中去,如图所示。队列的长度在Subscriber构建的时候设置好了。当有spin函数执行,就会去处理消息队列中队首的消息。