这篇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

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





