为什么ROSBag记录每秒只记录来自任何传感器的十个事件



作为制图师教程的一部分提供的示例ROSBags(https://google-cartographer-ros.readthedocs.io/en/latest/demos.html)对于LiDAR消息具有每秒约1507个消息的消息频率以及来自IMU的每秒250个消息的频率。我有一个IMU每秒广播大约100条消息,还有一个Velodyne VLP-16使用Velodyne自己的驱动程序(VLP16_points.launch(广播消息。对于这两个传感器,rosbag记录似乎每秒只记录10条消息。如何提高录制频率?

我怀疑它实际上是一个缓冲区瓶颈,而不是一个时间限制器的函数(例如,传递给进行录制的计时器回调的频率,就像你所期望的那样(。

在丢弃帧以写入或处理已经存在的数据之前,它只需要将这么多数据写入磁盘或订阅缓冲区中的数据。

除了使用他们的C++api编写自己的节点并分析问题本身(如果非常必要的话,这也是一个有效且不太困难的选项(之外,还有一些命令行内置参数可以控制缓冲区大小(下面添加了重点(。

我还建议计算你想要的录制速率,单位是kB/s;如果你知道一个激光雷达消息的大小,你想存储多少,以及它们的生成速率(rostopic hz/rostopic bw(,就可以很好地估计你的实际要求。

-b SIZE, --buffsize=SIZE

使用SIZE MB的内部缓冲区(默认值:256,0=无限(。这是记录器对象的消息队列,在消息被传递到袋子上降低此值可能会导致消息在它们到达记录过程之前被丢弃

$ rosbag record -b 1024 /chatter

--chunksize=SIZE

高级。记录到大小为KB的块(默认值:768(。这是一个缓冲区在包文件对象中。降低此值将导致更多写入磁盘。

$ rosbag record --chunksize=1024 /chatter

http://wiki.ros.org/rosbag/Commandline#record


注释编辑:

当原始主题msg转换为文本并存储时,上面的两个选项会影响序列化消息的缓冲区。如果超过了,你的终端应该有ROS_WARN消息。(如果没有,您可以启用它们。(

如果你没有看到任何关于丢帧的ROS_WARN消息,那么问题可能是正常的丢帧ROS消息。参考前面的问题,您可以启用主题统计信息来查看是否有消息因队列大小而被丢弃。从源代码来看,对于命令行工具,每个订阅的主题只有一个100的消息缓冲区(ops.queue_size=100;(。如果这是问题所在,最简单的解决方案是将源包从github复制到您的工作区,并修改队列大小。但我怀疑这不是真正的问题。

如果你录制的主题超过10个,假设可能还有另一个问题,因为默认情况下它是";仅";启动10个"异步微调器"线程;但所有其他提到的潜在问题更有可能是根本原因。

最新更新