【ROS学习】(六)ROS多线程订阅消息
来源:互联网 发布:中国制造的实力 知乎 编辑:程序博客网 时间:2024/06/01 13:24
对于一些只订阅一个话题的简单节点来说,我们使用ros::spin()进入接收循环,每当有订阅的话题发布时,进入回调函数接收和处理消息数据。但是更多的时候,一个节点往往要接收和处理不同来源的数据,并且这些数据的产生频率也各不相同,当我们在一个回调函数里耗费太多时间时,会导致其他回调函数被阻塞,导致数据丢失。这种场合需要给一个节点开辟多个线程,保证数据流的畅通。
为了观察不同话题的消息被阻塞的情况,可以参考以下实验代码
https://github.com/wenglihong/wlh_ros_demo/blob/master/multi_thread_demo/src/multi_topic_pub.cpp
https://github.com/wenglihong/wlh_ros_demo/blob/master/multi_thread_demo/src/multi_topic_sub.cpp
可以看到,发布程序中,以10hz的频率发布了chatter1和chatter2两个话题,在订阅程序中,回调函数1中加入了2s的延时,导致了回调函数2也只能2s才能接收到一个数据,为了是回调函数2能正常接收数据,我研究一下在一个ROS节点中开辟多个线程的方法。
在ROS中,有两种方法可以在一个节点中开辟多个线程
1.ros::MultiThreadedSpinner
MultiThreadedSpinner类似于ros::spin(),在构造过程中可以指定它所用线程数,但如果不指定线程数或者线程数设置为0,它将在每个cpu内核开辟一个线程。
用法如下
ros::MultiThreadedSpinner spinner(4); // Use 4 threadsspinner.spin(); // spin() will not return until the node has been shutdown
2.ros::AsyncSpinner
AsyncSpinner比MultiThreadedSpinner更优,它有start() 和stop() 函数,并且在销毁的时候会自动停止。下面的用法等价于上面的MultiThreadedSpinner例子。
ros::AsyncSpinner spinner(4); // Use 4 threadsspinner.start();ros::waitForShutdown();
以上代码片参考了ROS wiki
http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning
完整的工程代码可以参考
https://github.com/wenglihong/wlh_ros_demo/tree/master/multi_thread_demo
- 【ROS学习】(六)ROS多线程订阅消息
- ROS多线程订阅消息(ros::asyncspinner)
- ROS学习(-)基本概念+发布&订阅消息
- ROS学习笔记(八):消息的发布与订阅
- ROS多线程订阅
- ROS学习之 cpp消息发布者和消息订阅者
- ROS学习笔记(六)
- ROS学习笔记--消息发布器和订阅器
- ROS学习笔记2 消息发布与订阅
- ROS学习(基于Ubuntu 15.04 和ROS Jade)第三章 ROS核心教程 之 11 编写简单的消息发布器和订阅器 (C++)
- ROS学习(基于Ubuntu 15.04 和ROS Jade)第三章 ROS核心教程 之 12 测试消息发布器和订阅器
- ROS学习--(六)理解ROS节点和话题
- ROS:消息发布器和订阅器(c++)
- 【ROS学习】(四)ROS消息传递——std_msgs
- ROS总结——ROS消息发布和订阅
- ROS下视频消息发布与订阅
- ROS学习(六):CMakeLists.txt 文件
- ROS学习第四弹 (ROS编辑器及配置/ROS msg/srv 消息和服务)
- Linux硬盘挂载
- html文本框去除空格和中文
- PB 依据指定应用程序文件名返回PID
- MySQL千万级别表数据中提高RAND随机查询的实验
- Java类型转换(int - byte[],float - byte[])
- 【ROS学习】(六)ROS多线程订阅消息
- 前端面试-浏览器渲染机制
- MongoDB 3.2 在 Eclipse 平台下的入门
- JAVA中的接口
- Android事件分发机制
- PhoneGap 获取GPS坐标转换百度坐标
- 2015年总结
- Kibana基本使用
- iOS 中为同一个label设置不同的颜色