设计:为 rosbag2 添加快照服务
在 ros2/rosbag2#663 中,建议为 rosbag2 添加”快照(snapshot)“功能。
该功能旨在为用户提供一种机制:在指定话题上维护最近消息的临时缓存,只在用户触发时才写入永久存储。
例如,如果发生了罕见的异常行为,该功能允许你在观察到异常时才录制最近的 ROS 话题消息,而不必录制整个运行过程。
以指定的缓存大小在快照模式下启动 rosbag2:
$ ros2 bag record --max-cache-size 100000 --snapshot-mode [topics [topics ...]]通过 CLI 触发快照:
$ ros2 service call /rosbag2_recorder/snapshot rosbag2_interfaces/Snapshot用键盘快捷键触发快照:
例如,在打开的录制进程中按 s 键即可触发快照。
-
在
ros2bag的record子命令中添加--snapshot-mode标志,它将通过StorageOptions传递。 -
创建一个新类
CircularMessageCache,它维护两个循环缓冲区,每个缓冲区在类MessageCacheCircularBuffer中单独实现,并根据现有的--max-cache-size参数调整大小。在快照模式下,CircularMessageCache会持续向同一个循环缓冲区添加消息,直到被Recorder类触发切换到备用缓冲区。 -
在
rosbag2_recorder节点中创建一个服务~/snapshot,监听快照请求。收到服务调用后,它将触发CircularMessageCache中的缓冲区切换,并调用SequentialWriter中新的take_snapshot函数(详见下文)将快照消息写入存储。 -
修改
SequentialWriter,在启用快照模式时使用CircularMessageCache而不是MessageCache和CacheConsumer。 -
在
SequentialWriter中添加一个新的take_snapshot函数,由rosbag2_recorder节点的快照服务调用,将快照数据写入 rosbag。 -
修改
BaseWriterInterface,加入纯虚函数take_snapshot,确保所有未来的写入器都与快照模式兼容。 -
在
rosbag2_interfaces中把~/snapshot服务接口实现为Snapshot.srv。它不需要任何参数(类似于Resume.srv)。
快照功能的实现可以分解为以下 PR:
- 实现
CircularMessageCache和MessageCacheCircularBuffer。然后添加相应的测试。 - 将
CircularMessageCache集成到SequentialWriter中并更新其测试。 - 在
Recorder类中创建~/snapshot服务,添加相应的测试,并创建Snapshot.srv服务接口。 - 在
record子命令中添加--snapshot-mode并更新StorageOptions。 - 在快照模式中添加用于触发快照的键盘快捷键。