从 ros::Rate loop_rate(10) 说起 2021/10/29

本文详细解释了ROS中的ros::Rate用于设定循环频率,并探讨了它与loop_rate.sleep的配合使用。同时,介绍了ros_spin()和ros_spinOnce()在处理回调函数和消息轮转中的作用,说明了它们如何控制消息的接收与执行流程,以及它们之间的区别。
摘要由CSDN通过智能技术生成

1: ros::Rate loop_rate(10)
Rate is a type included in

ros/ros.h

which is used to give a specific time period for a task.

Thus it has been written as:

ROS:: Rate variable_name(time_delay_HZ);

You can give any name to your variable they have given loop_rate and you can give any time delay in HZ (10HZ=100ms). 因为 1s = 1000ms.
ref: https://stackoverflow.com/questions/56565275/can-you-explain-this-syntax-rosrate-loop-rate10
2: ref: https://blog.csdn.net/qq_37802555/article/details/107670710
ros::Rate loop_rate(10)

ros::Rate loop_rate() 与 loop_rate.sleep 这两个函数必须一起使用,控制的是循环的频率,与消息或者服务的发布 publish 频率没有直接关系。
这两者一个写在循环内部(loop_rate.sleep()),一个写在循环外部(ros::Rate loop_rate(); )

ros::Rate loop_rate(10) 意思为,我想控制我的程序的发布信息的快慢速度。这个应该和 loop_rate.sleep 一起使用才能达到控制速度的目的。

3:ros_spin() 和 ros_spinOnce()

这个是 ros 内部 信息数据 (消息,服务,topic)的轮转。

3.1 ros_spin() 和 ros_spinOnce() 的作用对象

集中处理本节点的所有的回调函数
集中处理本节点的所有的回调函数
集中处理本节点的所有的回调函数

回调函数即为 call back 函数
一般 subscriber 和 server 有回调函数

ros_spin() 和 spin_once 控制的是 callback 函数。他们通过 callback 函数来间接处理节点订阅的消息或者服务的 request.

所以 ros_spin() 和 spin_once 是怎么控制 callback 函数的呢?

3.2 ros 的消息 message 接收机制
消息,即为 message, 是指 topic 通信中的messages. 但是,在这里的 service 的 request 和 response 的接收机制 和 topic 中的messages 类似。

任何一个发布 publish 和订阅 subscribe, 都会有对应的发布缓存区和订阅缓存区,**正如 publisher 和 subscriber 函数中都有缓存数量的参数(队列长度)。**这一点不太清楚。是什么在排队?是发布和订阅的内容,在排队。

其实也可以理解是 参数 (作用在回调函数上的那些参数)在排队。

publisher 的实现,就是靠在一个 while 循环里面一直循环发送 “hello world” 到话题 (topic) chatter 上。subscriber 一旦知道chatter 上有 data, 就会把这些 data 作为参数传入到 callback 函数中。

此时还没有执行callback 函数,而是把 callback 函数放到了一个回调函数队列中。所以,事实上,这里是,发布器 publisher 不断发送 data / (参数) 到 chatter 上,然后相应的 callback 函数进入队列中,它们的函数名一样,函数实参不一样。
已经排好队了,
那么什么时候才会执行 callback 函数呢?
这个时候就会用到 ros::spin() 和 ros::spinOnce() 的事了。
当 spinOnce 函数被调用时,spinOnce 会调用回调函数队列中的第一个 callback 函数,此时 callback 函数才被执行,然后等到下次 spinOnce 函数又被调用时,回调函数队列中的第二个 callback 函数又会被调用,以此类推。

spin() 和 spinOnce() 起到开关的作用,即消息经过 spin() 或者 spinOnce() 后才恢复轮转。
所以 spin() 和 spinOnce() 的主要区别如下:
3.3 spinOnce()
当程序运行到 spinOnce() 时,程序到相应的 topic 订阅缓存区查看是否存在消息,如果有消息,则将消息传入回调函数执行回调函数;如果没有消息则继续向后执行。
spinOnce() 不是说等待到一个消息才向后执行,而是查看有没有消息。

2.4 spin()

spin 可以当作是对 spinOnce() 的循环,即:

> while(1) {
>     ros:: spinOnce();  }

spin() 后面的代码将不会再被执行,表现出来的功能就是持续等待消息。
感觉这个函数应该用得蛮少的。
当程序运行到 spin() 时,程序同样会去相应的 topic 订阅缓存区查看是否有消息,如果有,则将消息传入回调函数,如果没有,则重复上述过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值