作为 Cartographer 教程 ( https://google-cartographer-ros.readthedocs.io/en/latest/demos.html ) 的一部分提供的示例 ROSBags 对于 LiDAR 消息的消息频率约为每秒 1507 条消息,每条消息为 250 条消息。第二个来自 IMU。我有一个 IMU 每秒广播大约 100 条消息,还有一个 Velodyne VLP-16 使用 Velodyne 自己的驱动程序 (VLP16_points.launch) 广播消息。对于这两个传感器,rosbag record 似乎每秒最多只能记录 10 条消息。我怎样才能增加这个记录频率?
1 回答
我怀疑它不是一个时间限制器的功能(例如,传递给一个计时器回调的频率,就像你可能期望的那样),它实际上是一个缓冲区瓶颈。
在丢帧以写入或处理已经存在的数据之前,它只需要将大量数据写入磁盘或订阅者缓冲区中的数据。
除了使用他们的 C++ api 编写您自己的节点并分析问题本身(如果非常必要,这也是一个有效且不太难的选项),还有一些命令行内置参数可以控制缓冲区大小(下面,强调添加)。
我还建议以 kB/s 为单位计算所需的记录速率;如果您知道一个激光雷达消息的大小、要存储的数量以及它们的生成速率 ( rostopic hz
/ rostopic bw
),那么您就可以很好地估计您实际询问的内容。
-b SIZE, --buffsize=SIZE
使用大小为 MB 的内部缓冲区(默认值:256,0 = 无限)。这是记录器对象的消息队列,在消息被传递到包之前。降低此值可能会导致消息在到达记录过程之前被丢弃。
$ rosbag record -b 1024 /chatter
--chunksize=SIZE
先进的。记录到 SIZE KB 的块(默认值:768)。这是包文件对象中的一个缓冲区。降低此值将导致更多写入磁盘。
$ rosbag record --chunksize=1024 /chatter
http://wiki.ros.org/rosbag/Commandline#record
来自评论的编辑:
当原始主题 msg 转换为文本并存储时,上述两个选项会影响序列化消息的缓冲区。如果超过了,终端中应该有 ROS_WARN 消息。(如果没有,您可以启用它们。)
如果您没有看到任何有关丢帧的 ROS_WARN 消息,那么问题可能是正常丢帧的 ros 消息。参考之前的问题,您可以启用主题统计以查看是否有任何消息因队列大小而被丢弃。从源码来看,对于命令行工具来说,每个订阅的topic只有100的msg buffer(ops.queue_size = 100;)。如果这是问题,最简单的解决方案是将源包从 github 复制到您的工作区,并修改队列大小。但我怀疑这不是真正的问题。
如果您录制的主题超过 10 个,则假设可能存在另一个问题,因为默认情况下它“仅”启动 10 个“异步微调器”线程;但所有其他提到的潜在问题更有可能是根本原因。