ROS CallBack函数和spinOnce()的触发机制,和消息队列的理解

news/2024/11/20 13:43:59/

ROS Subscriber的callback函数的触发条件

当循环到spinOnce()函数时,会调用subscriber的callback函数,此时会检查订阅到的消息队列的大小,
如果此时subscriber的消息队列的size为n,则会执行n次callback

ROS消息队列的理解

主要分以下几种情况,

subscriber的消息队列为1时

sub方的消息队列size为1,callback函数永远只拿到最新的数据

subscriber的消息队列为10(>1)时

sub方的消息队列size为10,callback函数会被触发10次,依次读取缓存收到的所有数据,如果这个消息队列足够大的话,是不会漏掉任何pub方发布的任一帧数据的。

publisher的消息队列为1时

pub方的消息队列size为1,每次publish只会发布此次循环中最新的数据

publisher的消息队列为10(>1)时

publisher的消息队列size大于1的情况会比较tricky,首先得先讲讲publish函数的机制,当pub方调用publish函数时,其实系统并不会阻塞直至消息真正发送出去,而是会将此次要发送的msg存入一个队列(此队列即为publisher的消息队列),然后立即返回,什么时候真正发送消息是由ros说了算。考虑以下代码:

#include <ros/ros.h>
#include <std_msgs/UInt32.h>int main(int argc, char** argv) {ros::init(argc, argv, "pub_node");ros::NodeHandle n;// ros::Publisher chatter_pub = n.advertise<std_msgs::UInt32>("chatter", 1);ros::Publisher chatter_pub = n.advertise<std_msgs::UInt32>("chatter", 20);ros::Rate loop_rate(10);while (ros::ok()) {static int count = 0;static std_msgs::UInt32 msg;msg.data = count;for (int i = 0; i < 10; ++i) {chatter_pub.publish(msg);}loop_rate.sleep();++count;}return 0;
}

注意到代码中的for循环,for循环执行了10次publish操作,直觉上会认为在一个while循环周期,此publisher发布了10次消息,但根据我们刚才讲的,publish函数并不会阻塞直至消息真正发送,而是将此msg存入一个publish队列,所以如果publish队列很短的话,如1,则很有可能一个while循环周期并不会执行10次publish操作(在我的机器上大概只有2次),因为还没等到ros真正发送消息,队列里的老消息就被新消息顶掉了。但如果我们将这个publish队列设置成20,那么一个while循环周期将会确确实实地执行10次publish操作,因为队列的size是20,大于for循环的10次,所以老消息不会被挤掉。

因此,如果这个publisher消息队列足够大的话,是不会漏发任何一帧本该发送的数据的。


http://www.ppmy.cn/news/34805.html

相关文章

css绘制一个Pinia小菠萝

效果如下&#xff1a; pinia小菠萝分为头部和身体&#xff0c;头部三片叶子&#xff0c;菠萝为身体 头部 先绘制头部的盒子&#xff0c;将三片叶子至于头部盒子中 先绘制中间的叶子&#xff0c;利用border-radius实现叶子的效果&#xff0c;可以借助工具来快速实现圆角的预想…

linux实验之shell编程基础

这世间&#xff0c;青山灼灼&#xff0c;星光杳杳&#xff0c;秋风渐渐&#xff0c;晚风慢慢 shell编程基础熟悉shell编程的有关机制&#xff0c;如标准流。学习Linux环境变量设置文件及其内容/etc/profile/etc/bashrc/etc/environment~/.profile~/.bashrc熟悉编程有关基础命令…

java面试准备8

什么是类装载的执行过程 类加载主要分为五个步骤&#xff1a; 加载&#xff1a;根据类路径&#xff08;ClassPath&#xff09;找到对象的class文件然后导入。 验证&#xff1a;检查加载的class文件的正确性。 准备&#xff1a;给类中的静态变量分配内存空间。 解析&#xff1a…

成果VR虚拟3D展厅让内容更丰富饱满

随着数字技术的不断发展和普及&#xff0c;数字化展厅成为了一种重要的展示形式。线上虚拟展厅作为数字化展示的一种新形式&#xff0c;采用虚拟现实技术&#xff0c;能够克服时空限制&#xff0c;打破传统展览业的展示模式&#xff0c;为用户提供更加丰富、立体、沉浸式的展览…

【大数据处理与可视化】三 、Pandas库的运用

【大数据处理与可视化】三 、Pandas库的运用实验目的实验内容实验步骤一、使用pandas库分别创建Series对象和DataFrame对象&#xff0c;并对创建的对象使用索引、排序等相关操作&#xff1b;练习DataFrame对象的统计计算和统计描述的功能。1&#xff06;2、创建一个DataFrame(d…

(只需五步)注册谷歌账号详细步骤,解决“此电话号码无法验证”问题

目录 第一步&#xff1a;打开google浏览器 第二步&#xff1a;设置语言为英语&#xff08;美国&#xff09; 第三步&#xff1a;点击重新启动&#xff0c;重启浏览器 第四步&#xff1a;开始注册 第五步&#xff0c;成功登录google账号&#xff01; 如果出现这样的原因&…

第2篇|文献研读|nature climate change|减缓气候变化和促进热带生物多样性的碳储量走廊

研究背景 从 2000 年到 2012 年&#xff0c;潮湿和干燥热带地区的森林总损失超过 90,000 平方公里 yr-1&#xff0c;这主要是由农业扩张驱动的。热带森林砍伐向大气中排放 0:95 Pg C yr-1 并导致广泛的生物多样性丧失。保护区的生物多样性取决于与保护区所在的更广泛景观的生态…

Python实现rar、zip和7z文件的压缩和解压

一、7z压缩文件的压缩和解压 1、安装py7zr 我们要先安装py7zr第三方库&#xff1a; pip install py7zr如果python环境有问题&#xff0c;执行上面那一条安装语句老是安装在默认的python环境的话&#xff0c;我们可以执行下面这条语句&#xff0c;将第三方库安装在项目的虚拟…