Skip to content

ROSBag Engine - 浏览器环境 ROSBag 解析引擎

Published:

rosbag-engine 技术文档

目录

模块概述

rosbag-engine 提供浏览器端的 ROS bag / MCAP 数据读取、解析与流式播放能力,覆盖远程分块读取、Worker 线程解析、按主题/时间窗口迭代、按需字段投影与内存/缓存控制,支持在超大文件场景下的在线标注与可视化。

核心目标:

主要实现:


业务流程(高层)

  1. 数据源初始化(按后缀与参数选择实现)
    • URL:HTTP Range 远程读取 → LRU 缓存 → 可读对象
    • File:直接构造可读对象
    • .bagBagIterableSource.mcapMcapIterableSource
  2. 元信息加载
    • Bag:parse: false 延迟解析;为每个 connection 构建并复用 MessageReader
    • MCAP:优先 McapIndexedReader;失败回退到 McapUnindexedIterableSource
  3. 消息迭代与消费
    • 主线程通过 WorkerIterableSource 获取 IMessageCursor
    • 按 17ms 时间窗批量拉取结果,贴合 60fps 渲染节奏
    • 支持主题选择、时间范围、反向读取与“回填”
  4. 解压与反序列化
    • LZ4(兼容 Windows)解压;Reader/Schema 复用;MCAP 支持按需字段投影
  5. 内存与缓存控制
    • 远程 LRU 缓存(默认约 200MiB)可配置
    • 消息对象体积估算(字节级),利于策略与统计
  6. 可中止与容错
    • 自定义 Comlink TransferHandler 传递 AbortSignal,支持随时中止

核心优化点


关键技术

ROS Bag(.bag)

MCAP(.mcap)

  1. 索引读取(Indexed)
  1. 非索引读取(Unindexed)

压缩算法与解压


指标体系

业务级指标

模块级指标

落地建议


瓶颈定位方法


优化策略与预期效果

可直接落地

预期收益(相对未优化基线)


代码要点索引


使用示例

按 URL 远程拉取(自动选择 Worker 与实现):

import { RemoteDataSourceFactory } from '@/core/rosbag-engine'

const factory = new RemoteDataSourceFactory()
const source = factory.initialize({ params: { url: 'https://example.com/sample.bag' } })

const init = await source.initialize()
// init: { start, end, topics }

const topics = new Map<string, { fields?: string[] }>([
  ['/camera/image', {}],
  ['/imu', { fields: ['orientation', 'angular_velocity'] }],
])

for await (const it of source.messageIterator({ topics, start: init.start, end: init.end })) {
  if (it.type === 'message-event') {
    // 渲染或处理消息
  }
}

回填最近状态:

const backfill = await source.getBackfillMessages({ topics, time: init.end })

注意:.mcap 若无法索引,将退回 Unindexed 模式,仅适用于小文件。


注意事项


版本记录

评论