ROS订阅消息时缓冲区的读取

本文通过测试解析ROS在高频率传感器数据处理中的回调函数与缓冲区机制。重点研究了GPS与激光雷达数据同步问题,揭示了回调函数如何处理缓冲区中的数据,确保不丢失高速传感器的消息。

  这篇blog主要是通过测试解释ROS在调用callback函数时如何读取缓冲区数据。问题源自于读知乎文章——从零开始做自动驾驶定位(三): 软件框架 1中的缓冲区机制部分产生的疑问。

问题描述

  知乎文章中对ROS缓冲区机制的部分描述如下:
在这里插入图片描述

  因为ROS一直在入门(从未踏入过),所以当时对“把缓冲区中的数据读完”产生了疑惑。回调函数每次只读取缓冲区中最旧的数据,而回调函数“返回”的指针也无法操作读取缓冲区中的其它数据,那如何实现把缓冲区的数据读完的?

  这个问题的大背景是GPS消息频率较高,而激光点云消息频率则相对较低,如果激光点云的回调函数处理时间过长,GPS消息可能会丢帧。为了保证不丢帧,需要把GPS的subscriber中的缓冲区大小设得大一点。但如果按照“回调函数每次只读取缓冲区中最旧的数据”思考会发现这并不能解决问题(当时仍思维定视地认为回调函数依旧定周期执行)。

测试

  测试用的数据是含IMU (500Hz)和PointCloud (10Hz)消息的bag。下面是测试代码的最终版。

#include <ros/ros.h>
#include <iostream>
#include <sensor_msgs/PointCloud2.h>
#include <sensor_msgs/Imu.h>
#include <sys/times.h>

struct timeval start;

void
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值