如果你从事机器人相关工作,或许遇到过一种常见但令人烦恼的情况:唯一重要的那次运行没有被记录。或者虽然记录了,但 ROS 2 bag(ROS 2 主题的录制文件)却存放在位于三个时区之外的客户现场的机器人存储中。

这个问题通常是由于手动启动 ros2 bag record 并在每次测试后使用 scp 从机器人复制数 GB 数据造成的,这种方式根本无法扩展。这也可能导致 bag 同步缺失或意外覆盖。

有一种更好的方法:让每台机器人持续自行录制,并自动将其 bag 上传到你的服务器。这正是 ros2-exporter-agent snap 所做的。

ros2-exporter-agent 能做什么?

该 snap 在机器人上运行四个小型协作服务:

  • recorder:将你的 ROS 2 主题录制到 MCAP bag 中,并按时间或大小进行分割
  • synchronization:每两分钟,此服务尝试使用 rclone 上传 bag 文件
  • daily-rotation:在午夜重启录制,以便将 bag 分组为整洁的、带时间戳的集合
  • auto-clean:删除超过 10 分钟的本地文件,以防止磁盘被旧 bag 填满。Bag 仅在本地作为短暂的暂存缓冲区存在

该设计以安全性为核心考量:只有在 auto-clean 运行后才开始录制,且同步服务会自动重试。如果服务器暂时无法访问,机器人会自动重试上传。

适用于每个团队的服务器设置

服务器本身可以部署在任何对你有意义的地方:局域网内的机器(就在机器人操作现场)、办公室里的自托管服务器,或者简单的云服务器。

上传端使用标准的 rclone,支持超过 40 种存储后端。无论配置后端如何,snap 始终上传到名为 bagstore 的 rclone remote。从实验室服务器切换到 AWS S3 只需更改配置即可。

下面提供了两个用于 ros2-exporter-agent 的 rclone 配置示例。

一个简单的可通过 SSH 访问的服务器(SFTP 后端):

[fileserver]
type = sftp
host = bags.robot-company.com
user = robot
port = 22
key_file = /root/snap/ros2-exporter-agent/common/device_rsa_key

[bagstore]
type = alias
remote = fileserver:/srv/bags/robot-01

一个兼容 S3 的存储桶(AWS, Ceph, MinIO…):

[s3store]
type = s3
provider = Ceph
access_key_id = <access-key>
secret_access_key = <secret-key>
endpoint = https://s3.robot-company.com

[bagstore]
type = alias

请注意这种模式:第一个部分取决于具体后端,但 bagstore 别名永远不会改变。无论你管理一台还是一百台机器人,使用 SSH 还是 S3,snap 的逻辑都保持完全一致。

几分钟内设置好机器人

入门只需一条命令和两个配置文件:

sudo snap install ros2-exporter-agent --channel latest/candidate

安装时,snap 会在 /var/snap/ros2-exporter-agent/common/local-configuration/ 中创建两个模板。

将它们重命名以移除 .template 后缀,然后进行编辑:

  • rclone.conf 描述 bag 的去向,可使用上述任意后端
  • rosbag2-recorder.yaml 描述要录制的内容、包含或排除哪些主题,以及多久分割一次 bag 文件

snap README 的配置部分通过示例记录了这两种格式。

一旦这两个文件就位,服务就会读取它们,机器人随即开始自行录制和上传。

机队的集中配置

在每台机器人上编辑文件在一定范围内是可行的。然而,该 snap 也提供了管理机队的选项。在这种情况下,snap 还通过 content interface 读取其配置。一个独立的配置 snap 持有 rclone.conf 和 rosbag2-recorder.yaml,任何连接到它的机器人都会获得相同的设置。这自动化了大部分手动编辑工作。 

rob-cos-demo-configuration 仓库是一个现成的示例,包含一个 ‘basic‘ 分支(SFTP 文件服务器)和一个 ‘advanced‘ 分支(兼容 S3 的存储)。

配置 snap 还集成了一些自动化功能,例如为每个设备生成 UID 并将 UID 应用到配置中。这些自动化功能可能会为你的自有机队提供灵感。

Fork 它,根据你的服务器详情调整配置,构建你自己的配置 snap,那么每一台接入的机器人都会被相同地配置。只需更新一次配置,整个机队都将接收更新。

进一步发展的想法

一旦你开始保存来自机队的 bag,你可能希望借助额外的集成来进一步发展:

  • 将 bag 拉取到你的笔记本电脑:使用围绕 rclone copy 的小型封装器(或共享别名/脚本),以便任何工程师都能通过一条命令获取 robot-07 昨天的 bag。
  • 在 Web 查看器中浏览 bag:在存储前端放置一个轻量级文件浏览器,以便任何人都可以通过浏览器查找和下载 bag。
  • 直接从存储打开 bag:像 Foxglove 这样的工具可以通过 URL 加载远程 MCAP 文件,因此你可以在不先下载的情况下开始检查 bag。