ROS中的spin和spinOnce以及多线程回调

参考:
https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter6/6.3.html

1.普通的spin和spinOnce

  • ros::spin()用于调用所有可触发的回调函数,将进入循环,不会返回,类似于在循环里反复调用spinOnce()
  • ros::spinOnce()只会去触发一次

只有当有消息来时,回调函数才会被触发执行。具体去触发的命令就是ros::spin(),它会反复的查看有没有消息来,如果有就会让回调函数去处理。

因此千万不要认为,只要指定了回调函数,系统就回去自动触发,你必须ros::spin()或者ros::spinOnce()才能真正使回调函数生效。

2.多线程spin和spinOnce

回调函数作为参数被传入到了另一个函数中(在本例中传递的是函数指针),在未来某个时刻(当有新的message到达),就会立即执行。Subscriber接收到消息,实际上是先把消息放到一个队列中去,如图所示。队列的长度在Subscriber构建的时候设置好了。当有spin函数执行,就会去处理消息队列中队首的消息。
ROS中的spin和spinOnce以及多线程回调_第1张图片
ROS中的spin和spinOnce以及多线程回调_第2张图片

你可能感兴趣的:(ROS,ROS)