
Rerun 0.35 版本解析命令面板、内置 Catalog、HDF5 与 MCAP 流式处理全升级【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本文以 Rerun 0.35 版本的官方发布说明changeset-0-35.md为核心骨架深入解析该版本在 Viewer 交互、内置 Catalog、数据导入管线HDF5 / MP4 / MCAP以及 ROS 2 时间轴处理上的关键更新并结合仓库源码验证底层实现帮助读者理解每个新特性的使用方式、适用场景与破坏性变更的迁移路径。一、0.35 版本概览Rerun 0.35 是一个以「更流畅的数据接入与消费」为主题的版本一方面强化 Viewer 的交互体验改进的命令面板、实验性内置 Catalog、更智能的 URL 展示另一方面大幅升级了数据导入管线——新增 HDF5 读取器、增强 MP4 视频解码、支持时间窗口与损坏文件的 MCAP 转换并改善了 ROS 2 消息的时间戳处理。该版本发布说明来自 docs/content/changelog/changeset-0-35.md其结构为 Highlights新特性与 Breaking changes破坏性变更两大块本文沿此脉络展开。二、Viewer 交互升级1. 改进的命令面板Command PaletteViewer 的命令面板CmdK/CtrlK现在支持搜索并选中实体entities与组件components。这意味着你可以在不看数据面板的情况下通过快捷键直接跳转到感兴趣的实体或组件。此外命令面板还增加了上下文相关的命令例如刷新当前选中的 catalog 或 dataset。这类命令会根据当前上下文动态出现进一步减少鼠标操作。2. 实验性 Viewer 内置 CatalogViewer 现在内置了一个实验性的 catalog 功能用于在没有启动独立 catalog 服务的情况下直接操作本地录制文件。目前它需要先在设置菜单中手动激活因为仍有一些粗糙的边缘场景。内置 catalog 的核心价值在于轻松流式读取任意大小的 rrd 文件——不再需要先把整个文件加载进内存实现了完整的 OSS redap server 协议因此可以通过 Python SDK 直接连接出于安全考虑仅允许来自本机的连接。从仓库结构看redap 协议相关的客户端实现位于 crates/store/re_redap_clientPython 侧的 catalog 查询逻辑可参考 rerun_py/src/catalog如 index_columns.rs、schema.rs。官方将这一改动定位为「让 Viewer 在消费实时数据与服务端数据时更简洁、更显式」的第一步。3. 内置 URL 类型的富展示Rerun 现在能识别已知的链接格式指向 rrd 文件、hub 数据集等并将其显示为紧凑的链接按钮而不再是一段普通文本链接。同时Rerun Hub 数据集的打开按钮也被重新设计交互更直观。三、数据导入管线HDF5 读取器Hdf5Reader1. 快速上手0.35 版本引入了实验性的Hdf5Reader用于将 HDF5 文件读取为惰性lazychunk 流。每个 HDF5 group 对应一个 Rerun entity每个 dataset 对应一个 componentfrom rerun.experimental import Hdf5Reader, IndexColumn reader Hdf5Reader(episode.h5) store reader.stream(index_columnIndexColumn.timestamp(/time, input_units)).collect()2. 核心设计group → entitydataset → component从 Python 侧的 _hdf5_reader.py 源码可以看出每个 HDF5 group 映射为一个 Rerun entity文件根目录映射为实体/嵌套 group 映射为嵌套实体路径如/observations/images对应实体/observations/imagesgroup 的叶子 datasets 成为该实体的列stream()是唯一的数据加载入口所有加载选项都挂在它上面因此同一个 reader 可以对同一文件多次stream()出不同配置的流。3. 数据集维度到 Arrow 列的映射规则stream()按维度加载数据集详见stream()的 docstringHDF5 数据集维度生成的列0-D标量静态static数据单个值无时间轴1-D[N]含 N 个标量行的列2-D[N, K]N 行、每行是 K 个元素的定长列表FixedSizeListK3-D 及以上[N, d1, …, dk]N 行、每行是一个匹配类型的 blobArrowListPRIMITIVE_TYPE按行主序保存原始值一维及更高维数据集的第一个维度leading dimension始终是行轴。元素类型映射为对应的 Arrow 等价类型有符号/无符号整数、浮点、字符串不施加任何语义解释。测试文件 test_hdf5_reader.py 用固定 fixture 验证了这些规则例如2-D[5, 3]数据集映射为pa.list_(pa.float64(), 3)4-D[5, 2, 2, 3]的图像数据每行是一个 12 元素的按行主序 blob0-D 数据集如/meta/count生成静态 chunk。4. HDF5 属性attributes的处理HDF5 attributes 会在专门的__hdf5_properties实体下以静态 chunk形式发出保持与源文件布局一致根属性落在__hdf5_properties对象/a/b上的属性落在__hdf5_properties/a/b。每个属性成为一个以它命名的静态组件。这样设计是为了保持通用的__properties实体可用于用户自定义的属性层。测试验证了属性映射的细节例如根属性description、version以及/observations上的frequency: 30.0与joints: [1.0, 2.0, 3.0]float64[3] 属性映射为定长列表。5. 行对齐Row alignment规则所有加载的、未忽略的、非标量的数据集按位置对齐到文件级时间轴因此必须共享相同的行数标量数据集是静态的不受此约束提供了index_column时共享行数即为该索引数据集的长度未提供时所有数据集必须协商出统一行数该行数成为生成的row_index时间轴的长度。违反对齐的数据集会直接报错除非被列入ignore_datasets不会自动丢弃任何数据来满足对齐。测试中的test_data_misaligned.h5fixture 正是用来验证「不齐则报 ValueError显式忽略后恢复」的行为。6. stream() 完整参数stream()的全部参数均只接受关键字传参root_group当作文件根处理的 group默认整个文件。只有其子树会被加载与对齐它自己的属性作为根属性其他路径index_column、ignore_datasets、生成的实体路径都相对它解释root_group上方的属性不会被发出需用attributes()读取。entity_path_prefix给每个实体路径加的前缀如/world。index_column作为文件级时间轴索引的数据集用IndexColumn构造如IndexColumn.timestamp(/time, input_units)或IndexColumn.sequence(/frame_id)相对root_group解释引用的数据集必须是一维的省略时生成全文件统一的row_index序列时间轴0, 1, …。ignore_datasets要整体排除的数据集或 group 路径列表group 路径会排除整个子树相对root_group解释被忽略的数据集既不加载也不参与行对齐。use_structs为True默认时一个实体的所有列被打包进单个 ArrowStruct组件每个 dataset 一个字段以 dataset 命名为False时每个 dataset 成为同实体上的独立组件。只有一个数据集的 group 始终以裸组件形式发出绝不包装成单字段 struct。7. 元数据访问器除stream()外Hdf5Reader还提供三个轻量元数据接口只读元数据不读取数据集值groups(path/)递归列出指定路径下的 group 路径datasets(path/)递归列出数据集及其 shape 与 dtype返回DatasetInfo(path, shape, dtype)结构DatasetInfo 定义于同一模块attributes(path/)以类型化 Python dict 读取对象属性标量属性返回 Python 标量数组属性返回列表。8. 底层实现惰性流与后台线程从 Rust 侧绑定 hdf5_reader.rs 可以看到实现机制Hdf5StreamFactory通过re_hdf5::load_hdf5在独立后台线程线程名hdf5-chunk-source中解码解码结果通过有界 crossbeam channel容量由CHUNK_CHANNEL_CAPACITY决定以配额感知方式re_quota_channel::send_crossbeam传递给消费端实现真正的惰性流式读取stream()会先调用re_hdf5::validate_layout急切校验布局仅元数据因此错误的配置行不对齐、index_column不存在、root_group不存在或不是 group、文件存在但无法解析为 HDF5都会在stream()调用处立刻以ValueError暴露而不是在迭代中途才失败时间单位支持ns/us/ms/s索引类型支持timestamp/duration/sequence与 Python 侧IndexColumn的类型安全构造函数一一对应。9. IndexColumn统一的索引列描述IndexColumn定义于 _index_column.py是实验性读取器共享的、类型化的时间轴索引描述IndexColumn.timestamp(/time, input_units) # 时间戳时间轴input_unit 描述原始值 IndexColumn.duration(/elapsed, input_unitus) # 经过时间时间轴 IndexColumn.sequence(/frame_id) # 序数整数索引无单位关键点input_unit描述的是原始值代表什么单位而非期望的输出单位内部会统一换算为纳秒时间轴种类由你选择的构造函数决定因此不存在拼错字符串的问题。四、数据导入管线MP4 视频读取器增强0.35 显著增强了Mp4ReaderRust 与 Python 双端核心能力是通过 FFmpeg 对视频进行管线化处理移除不支持的 B 帧B-frames转码到不同的输出格式调整 GOP 大小利用部分 GPU 加速编解码器。此外还改善了不支持编解码器的报错提示更清晰并修复了处理大 MP4 偏移量时的崩溃问题。该功能仍处于实验阶段官方明确表示「仍在迭代如何让 mp4 → RRD 的流程尽可能无缝」并欢迎反馈。Python 侧封装见 _mp4_reader.py集成测试见 test_mp4_reader.py。五、时间窗口化与损坏 MCAP 转换1. 按时间范围读取 MCAP0.35 支持从源 MCAP 文件中读取选定的时间范围。该选项在 Python 的McapReader和 CLI 中均可用详见rerun mcap convert --help。Python 侧chunk/_mcap_reader.py的McapReader构造函数接受start_time_ns此时间之前的消息被跳过None表示起始端开放end_time_ns此时间之后的消息被跳过None表示结束端开放recover是否在内存中恢复缺失或无效的 MCAP summary默认False。stream()上同样可以传start_time_ns/end_time_ns用于覆盖构造时传入的值仅对本次扫描生效若两者任一提供则两者都会被重置。2. 有界窗口处理超大型录制文件的利器除了简单的时间过滤这一能力还允许在有限窗口中转换和优化大型录制文件而不必一次性加载整个录制。发布说明给出的实测数据在一个 20 GB 的测试录制上分 32 个窗口处理峰值内存从约 26 GB 降到 1.4 GB墙钟时间从 14.3 秒降到 5.8 秒。需要说明的是窗口间的循环需要用户在源码 MCAP 侧写少量代码每次用不同的时间范围重新stream()即可0.35 本身不提供自动分窗的 CLI 标志。3. 直接读取损坏的 MCAP 文件转换器现在可以直接读取损坏的 MCAP 文件无需单独的恢复recovery流程。当McapReader或 CLI 开启recover选项时转换器会在处理过程中按需重建缺失的 summary 和索引。从 CLI 实现 commands/mcap/mod.rs 可以看到相关参数--start-time TIME仅转换该时间范围内的数据--end-time TIME仅转换该时间范围内的数据--recover开启恢复模式。时间范围是半开区间[start, end)且当仅提供一端时另一端自动开放start缺省为 0end缺省为u64::MAX。底层恢复逻辑由 crates/store/re_mcap/src/recover.rs 承载。附带地rerun mcap check命令commands/mcap/check.rs也支持--recover用于在 summary 缺失或无效时先从文件可读部分重建 summary再执行结构性与时间轴检查。六、改进的 ROS 2 时间戳处理1. 新行为所有带有顶层std_msgs/msg/Header的 header 字段、或builtin_interfaces/Time的 stamp 字段的 ROS 2 MCAP 消息现在都会额外出现在ros2_timestamp时间轴上除了标准的 MCAP log 与 publish 时间轴之外。2. 之前的限制在 0.35 之前ros2_timestamp时间轴只为被转换为 Rerun archetype 的 ROS 消息填充。现在任何经过 schema reflection模式反射处理的 ROS 消息例如自定义 ROS 消息类型都支持该时间轴便于用户按 header 时间戳顺序查看所有数据。3. 源码验证在 decoders/ros2_reflection.rs 中add_ros2_timestamps在解析器 finalize 阶段被调用它通过解码计划MessageDecodePlan读取每个消息的纳秒时间戳并逐个加入ros2_timestamp时间轴单元格由 util.rs 中的TimestampCell::from_nanos_ros2构造。若某条消息没有 header 或顶层时间戳则直接跳过若时间戳无法读取则整条ros2_timestamp时间轴会被丢弃并给出警告而不是产生缩短的时间轴相关行为有单元测试覆盖如header_stamp_becomes_the_ros2_timestamp_timeline测试。七、破坏性变更与迁移指南1.StateChange.state改为数组StateChangearchetype 的state字段现在接受一组值而非单个值。每个条目在状态时间轴视图中获得自己的一条 lane泳道因此一个实体可以同时跟踪多个状态例如一个游戏手柄的多个按钮。注意线上数据格式与已存储的录制文件均无变化——这只影响各语言 SDK 的 API。Rust迁移需注意// 0.34 rec.log(door, rerun::StateChange::new().with_state(open))?; // 0.35 rec.log(door, rerun::StateChange::single(open))?; // 或等价写法 rec.log(door, rerun::StateChange::new().with_state([open]))?;with_state现在接受迭代器因此传入单个字符串不再能编译。要重置单个实例的状态请使用新的with_state_opt——其中的None条目会重置该实例对应的 lanerec.log(buttons, rerun::StateChange::new().with_state_opt([Some(Idle), None]))?;Python无需改动。rr.StateChange(stateopen)继续可用且现在支持state[idle, pressed]表示多条 lane。C无需改动。rerun::StateChange().with_state(open)继续可用且现在支持with_state({idle, pressed})。状态时间轴视图的实现位于 crates/viewer/re_view_state_timeline其测试tests/basic.rs覆盖了多状态 lane 的行为。2.ParquetReader的索引列改用IndexColumn实验性ParquetReader的index_columns参数不再接受(name, type[, unit])元组改为传入用timestamp/duration/sequence构造器构建的IndexColumn值时间轴种类由所选构造器决定unit变为仅限关键字的input_unit# 0.34 ParquetReader(path, index_columns[(frame, sequence), (ts, timestamp, ms)]) # 0.35 from rerun.experimental import IndexColumn ParquetReader(path, index_columns[IndexColumn.sequence(frame), IndexColumn.timestamp(ts, input_unitms)])这实际上是与Hdf5Reader索引描述的统一——两者共享同一套类型安全的IndexColumn语法。相关实现见 _parquet_reader.py 与 parquet_reader.rs。3. 移除--followRerun 不再支持 tailing.rrd文件--follow已删除。如果你之前在实时工作流中依赖它请改为将数据 tee 到多个 sink——例如在产生数据的进程中同时记录到 viewer 与一个.rrd文件。多 sink 的 tee 模式配置方法见官方 sink 文档页sinks 文档 中的 multiple-sinks tee pattern 一节。八、小结Rerun 0.35 的主要收获可以归纳为三条主线交互层命令面板支持搜索实体与组件、实验性内置 Catalog 让本机大 rrd 文件可以低门槛流式浏览、内置 URL 富展示提升数据链接的可读性导入层Hdf5Reader以 group/entity、dataset/component 的直观映射接入 HDF5 生态Mp4Reader借助 FFmpeg 大幅扩展视频兼容性MCAP 转换支持时间窗口与损坏文件恢复为大规模机器人数据如 LeRobot 风格的数据集提供了可扩展的处理路径时间轴语义ROS 2 消息的 header 时间戳现在对任意经过 schema reflection 的消息可见配合状态时间轴的多 lane 支持让时序数据的观察与编排更精细。升级到 0.35 时需要重点处理的三处破坏性变更集中在StateChange.state数组化Rust 侧、ParquetReader索引列语法统一为IndexColumn以及--follow的移除。这些变更都不影响已存储的数据格式迁移成本集中在 SDK 调用代码上。如需查看更早版本的迁移说明可参阅官方迁移文档migration.md。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考