1.ros::spin()和spinOnce含义html
若是在节点中若是订阅了话题,那么就必需要调用ros::sping()或者ros::spinOnce()函数去处理话题绑定的回调函数,不然该节点将不会调用节点所订阅的全部回调函数来处理接收到的数据.换句话说若是一个节点里面没有订阅话题只有发布话题,那么是能够不须要调用这两个函数的.可是为了方便之后节点添加了订阅消息话题,建议仍是加上这两个函数之一.下面是关于这两个函数的讨论:node
What is the actual meaning of ros::spin()c++
WritingPublisherSubscriber(c++)多线程
2.多线程调用ros::spin()和spinOnce函数
咱们注意到 ros::spin()只会单独开辟一个单一线程去处理这些回调函数队列,当订阅不一样频率的话题时,那么全部订阅话题的接收频率为全部话题处理最慢的一个,为了可以让话题接收不一样的频率,咱们可使用ros::MultiThreadedSpinner 或者ros::AsyncSpinner 来解决问题.例如:
学习
MultiThreadedSpinner相似于ros::spin(),在构造过程当中能够指定它所用线程数,但若是不指定线程数或者线程数设置为0,它将在每一个cpu内核开辟一个线程。spa
ros::MultiThreadedSpinner spinner(4); // Use 4 threads spinner.spin(); // spin() will not return until the node has been shutdown
AsyncSpinner比MultiThreadedSpinner更优,它有start() 和stop() 函数,而且在销毁的时候会自动中止。线程
[code]ros::AsyncSpinner spinner(4); // Use 4 threads spinner.start(); ros::waitForShutdown();
详细请参考:code
Callbacks and Spinning(官方介绍)htm