Ros 中的多线程
参考文献:http://blog.csdn.net/sinat_27554409/article/details/48446611 老王说ROS
http://blog.csdn.net/yaked/article/details/50776224 rosspin、rosspinOnce及多线程订阅
1、 Ros:spin() VS ros::spinOnce() 区别
对于前者来说,spin(),运行一次之后,会一直停在那不动,所以spin()后面可以不用加任何东西。ROS 会自动的调用一些回调函数。
Spinonce 就灵活的多了,不过需要控制好它的调用周期,它比spin定时要准很多。
当我们用nh.createTimer创建定时函数的时候,发现其定时周期不可控,用rqt查看的。所以,我们改成spinOnce 的模式来定时调用。此能实现精准调用。
参考文档:老王说ROS(7)用ros做系统设计 http://blog.exbot.net/archives/1675
以上都是同步的,在一个线程当中。
2、多线程
在ROS当中,原作者是不推荐用多线程的,他建议用多进程,变成一个个节点的形式进行通信。
分为两种模式:同步和异步。
同步:MultiThreadSpinner s(4),一共5个线程。包括了主线程。
异步:AsyncSpinner s(4), 一共5个线程。包括了主线程。
利用Timer 可能会出现一些问题。
3、当程序当中有数据处理线程的时候,建议开辟 异步多线程 订阅,算法写在订阅函数里面。
当然,目前的处理当中,我更倾向于重新开辟一个线程,然后通过循环数组来进行数据交互。