使用Rust从MCAP文件中提取ROS数据

使用Rust高效提取MCAP中的ROS消息。

使用Rust从MCAP文件中提取ROS数据

最近使用Rust写了一个小工具xcap,可以从MCAP文件中提取ROS数据。

先简单介绍一下背景。ROS全称为"Robot Operating System",名字听起来像机器人操作系统,实际上并非操作系统,而是一套以分布式数据通信为底层基础的软件开发框架,尤其为机器人应用开发做了很多基础性的工作。MCAP则是一种数据封装格式。在ROS中,不同的模块可以通过消息发送接收的方式来通讯。MCAP可以高效的将这些消息存储下来,以供开发工程师后续离线处理。打个比方,ROS像是城市广播系统,而MCAP就像是你的录音机磁带。

MCAP的实现是开源的,且官方提供了各种语言的接口,包括Python、C++。Python下简单的几行代码就可以实现MCAP解包。使用Rust来实现这个功能的初心也很简单——Python解包代码需要安装多个依赖,有些依赖甚至是私有库。使用C++倒是无需再担忧依赖问题,只是,反正都是从零开始,为何不一开始就将C++的问题拒之门外呢?

所以便有了这个小项目。其原理非常简单,ROS消息以序列的方式封装在MCAP文件中。首先借助MCAP库将原始消息解析逐条解析,然后将原始消息通过解压缩、反序列化的操作转换为Rsut可操作的结构体,最后根据具体的业务逻辑完成后续操作,例如图像解码、二进制转存等。

除了核心的解包功能外,这个工具还在易用性方面做了一些工作,包括

  • 支持分片后的MCAP文件
  • 列出全部Topic名称,无需手动查找
  • 可以直接读取MinIO中存储的MCAP
  • 解包进度条
  • 速度快,耗时仅为Python的60%

代码开放在了Github:

GitHub - yinguobing/xcap: Single binary to extract ROS messages from MCAP files.
Single binary to extract ROS messages from MCAP files. - yinguobing/xcap