ROS学习—ros::spin()和ros::spinOnce()的区别和理解

最近面试中被问到了这个问题,算是ROS学习中的基础问题,整理一下。

首先,直击要害,这俩函数名都是ROS消息回调处理函数,通常会出现在ROS的主循环中。
区别在于,spin()调用后不会再返回,也就是主程序运行到这儿就不往下执行了,进行不断地循环,直到用户输入Ctrl+C或者ROS主进程关闭时退出。ros::spin()函数用起来比较简单,一般都在主程序的最后,加入该语句就可。

而spinOnce()在调用后还可以继续执行之后的程序,为什么呢,因为spinOnce()通常和 while(ros::ok())一起出现,需要自己设置调用频率,以及需要根据消息到达的频率设置消息队列大小以防止消息丢失。比如

ros::Rate r(10.0);                 //定义接收频率为10Hz(1秒发10次)
while(ROS::ok()){
	ros::spinOnce();               // check for incoming messages
	r.sleep();
	}	

因此,spinOnce()的使用也比spin()更自由,可以出现在程序的各个部位,但是需要注意的是要合理控制消息池大小和ros::spinOnce()执行频率,也就是上面提到过的, 比如消息发送频率为10Hz(这里是指在消息发送端代码定义的频率), ros::spinOnce()的调用频率为5Hz(这里是指消息接收端代码定义的频率,上面代码是接收端),那么消息池的大小就一定要大于2,才能保证数据不丢失,无延迟。

还有一点,,如果程序写了相关的消息订阅函数,那千万不要忘了在相应位置加上ros::spin()或者ros::spinOnce()函数,不然你永远都得不到另一边发出的数据或消息的,切记!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值