ROS订阅消息线程

参考一下wiki的说明:http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning

单线程回调函数 spin()及 spinOnce()

函数意义
ROS消息回调处理函数,通常在ROS订阅程序中,程序不断调用ros::spin() 或 ros::spinOnce()。
两者区别在于前者调用后不再返回,也就是你的主程序就到这里了,不往下执行,而spinOnce()调用后还可以继续执行之后的程序。
注意:ros::spin()后面除了“return 0 其他语句就不要写了,写了也不执行”,千万别写到循环里面,写里面也没用,程序执行到ros::spin()就结束了
使用方法
ros::spin() 通常写在订阅函数结尾,在节点关闭或ros:;shundown()或按下【Ctrl】-【C】才返回。
ros::spinOnce() 一般写在订阅程序循环里面,与ros::Rate 对应。

如果一个订阅节点程序中需要订阅多个话题,考虑到时间同步问题,就用到多线程了。

多线程回调函数 MultiThreadedSpinner() 及 AsyncSpinner()

使用方法
1. ros::MultiThreadedSpinner 阻塞多线程回调函数
MultiThreadedSpinner类似于ros::spin(),在构造过程中可以指定它所用线程数,但如果不指定线程数或者线程数设置为0,它将在每个cpu内核开辟一个线程。

ros::MultiThreadedSpinner spinner(4); // Use 4 threads
spinner.spin(); // spin() will not return until the node has 	been shutdown

2.ros::AsyncSpinner 防阻塞多线程回调函数
AsyncSpinner比MultiThreadedSpinner更优,它有start() 和stop() 函数,并且在销毁的时候会自动停止。

ros::AsyncSpinner spinner(4); // Use 4 threads
spinner.start();
ros::waitForShutdown();

总结:

回调方法阻塞线程
ros::spin()阻塞单线程
ros::spinOnce非阻塞单线程
ros::MultiThreadedSpinner阻塞单线程
ros::AsyncSpinner非阻塞多线程

在这里插入图片描述
参考博客:https://blog.csdn.net/wengge987/article/details/50619851

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值