ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 OSS Rerun Server 将机器人录制文件(RRD)转换为 LeRobot v3 训练数据集

使用 OSS Rerun Server 将机器人录制文件(RRD)转换为 LeRobot v3 训练数据集 使用 OSS Rerun Server 将机器人录制文件RRD转换为 LeRobot v3 训练数据集【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本文是 Rerun 项目下 examples/python/rerun_export/README.md 示例的深度技术指南讲解如何基于开源的 Rerun OSS server把.rrd机器人录制文件加载、查询并转换为 Hugging Face LeRobot v3 标准格式的训练数据集涵盖时间对齐、多路视频流处理、特征 schema 推断与多 episode 批量导出。读完本文你将掌握一套可直接复用的录制数据 → 模仿学习训练集转换流水线并理解其底层的时间对齐latest-at与数据映射原理。背景为什么需要从 RRD 导出 LeRobot 数据集Rerun 的录制文件.rrd以时间轴与实体-组件模型保存了机器人运行过程中几乎全部的多模态数据——关节指令action、关节状态observation、多视角相机视频流、语言指令等。但这些原始录制并不等于训练集模仿学习imitation learning训练管线要求数据以标准化的目录结构、固定的采样帧率、统一的 schema 呈现。LeRobot 是 Hugging Face 推出的机器人领域项目基于 PyTorch 提供了模型、数据集与工具。本示例展示的正是这两者的衔接点利用 OSS Rerun server 的查询能力把 RRD 录制转换为 LeRobot v3 格式的数据集从而直接接入机器人模型训练管线。整个工作流的核心环节包括启动本地 OSS Rerun server加载 RRD 文件每个录制segment对应一个 LeRobot episode按训练需求过滤实体路径与组件剔除调试可视化、中间计算等无关信号将多路异构传感器数据按目标帧率对齐到统一时间轴自动推断 LeRobot 的 features schema数据类型、形状、视频尺寸写出 LeRobot v3 数据集Parquet 数据表 视频 元数据并支持一键推送到 Hugging Face Hub。需要说明本仓库提供的官方完整指南位于 docs/content/howto/train/lerobot_export.md对应的可运行示例代码位于 docs/snippets/all/howto/lerobot_export.py本文的代码片段均来自该示例。安装与前置条件转换代码封装在独立的rerun-lerobotPython 包中从 PyPI 安装即可pip install rerun-lerobot该包内部依赖rerunPython SDK用于启动 server、查询数据、读写 RRDlerobotLeRobot 官方 Python 库提供LeRobotDataset数据集 APIrerun_lerobot.converter核心转换逻辑convert_dataframe_to_episode做时间对齐与重采样rerun_lerobot.feature_inference特征 schema 自动推断infer_featuresrerun_lerobot.types转换配置类型LeRobotConversionConfig、VideoSpec。运行时前置条件本机已安装 Python 3 环境需要一份或多份.rrd录制文件本文示例代码引用仓库内的 tests/assets/rrd 目录下的样本数据若后续要推送数据集到 Hugging Face Hub需要提前配置HF_TOKEN或执行huggingface-cli login。第一步启动 Server 并加载录制转换的第一步是启动一个本地 OSS Rerun server并把 RRD 文件目录注册为数据集import pathlib from pathlib import Path import rerun as rr from lerobot.datasets.lerobot_dataset import LeRobotDataset from rerun_lerobot.converter import convert_dataframe_to_episode from rerun_lerobot.feature_inference import infer_features from rerun_lerobot.types import LeRobotConversionConfig, VideoSpec # 指向你的 RRD 文件目录示例使用仓库内的样本数据 sample_5_path Path(__file__).parents[4] / tests / assets / rrd / sample_5 # 启动一个内嵌的本地 server并注册名为 robot_dataset 的数据集 server rr.server.Server(datasets{robot_dataset: sample_5_path}) client server.client() dataset client.get_dataset(namerobot_dataset)要点说明rr.server.Server(datasets{...})会在本地启动一个 OSS Rerun server 进程client是连接该 server 的查询客户端get_dataset(name...)拿到的是 catalog 层面的数据集句柄——每个录制segment会成为数据集中的一个 segment每个 segment 最终对应 LeRobot 的一个 episode关于录制在 catalog server 上的对象模型可参考 catalog-object-model 概念文档。第二步过滤训练所需数据机器人录制往往包含远超训练需要的数据。用filter_segments选中目标录制再用filter_contents只保留会映射到 LeRobot 标准格式的实体路径# 选择单个录制episode进行导出 single_recording dataset.segment_ids()[0] # 只保留训练需要的数据 # - 发送给机器人的动作指令action # - 观测到的关节位置robot state # - 多视角相机画面camera # - 任务描述语言指令 training_data ( dataset .filter_segments(single_recording) .filter_contents([ /action/joint_positions, /observation/joint_positions, /camera/**, /language_instruction, ]) .reader(indexreal_time) )典型映射思路示例注释中即如此组织录制内容LeRobot 中的角色关节位置指令/action/joint_positionsaction动作关节状态/observation/joint_positions、末端执行器位姿observation观测相机流/camera/**视频输入video语言指令/language_instruction任务描述task调试可视化、中间计算结果、未使用的传感器等一律通过filter_contents排除。.reader(indexreal_time)指定后续查询以real_time时间轴为对齐基准。第三步配置导出参数数据映射LeRobotConversionConfig定义了 Rerun 灵活的数据模型如何映射到 LeRobot 标准化格式。必须明确哪个组件是 action哪个是 observation要包含哪些视频流数据集的目标帧率用于对齐的时间轴。# 任务指令的来源可以是 TextDocument 实体、静态元数据等 instructions /language_instruction:TextDocument:text # 指定要纳入数据集的视频流。 # 每个流需要一个 key相机标识以及 VideoStream 所记录的实体路径 videos [ VideoSpec(keyext1, path/camera/ext1, video_formath264), VideoSpec(keyext2, path/camera/ext2, video_formath264), VideoSpec(keywrist, path/camera/wrist, video_formath264), ] config LeRobotConversionConfig( fps15, # 目标帧率LeRobot 数据集的采样率 index_columnreal_time, # 用于对齐的时间轴 action/action/joint_positions:Scalars:scalars, # 完整限定的 action 列 state/observation/joint_positions:Scalars:scalars,# 完整限定的 state 列 taskinstructions, # 任务描述列 videosvideos, # 视频流 )参数说明fps数据集的目标帧率。LeRobot 要求数据在时间上均匀采样导出时默认按配置的帧率生成等间隔样本action/state以实体路径:组件类型:组件名形式书写的完整限定列名fully qualified columnvideosVideoSpec(key..., path..., video_format...)key是该视频流在 LeRobot 数据集中的相机标识path是录制中记录VideoStream的实体路径。第四步自动推断 LeRobot features schemaLeRobot 用一套名为 features 的 schema 描述数据集结构。infer_features会检查数据内容并自动生成这套定义无需手工编写features infer_features( tabletraining_data.to_arrow_table(), configconfig, )特征推断会从底层数据中确定数据类型float、int、image、video、text 等数组形状标量、向量、矩阵视频尺寸通过解码视频首帧获得宽高。从仓库源码看re_lerobotcrate 中的Feature结构正是由dtypeshape 可选的names构成见 crates/data_flow/re_lerobot/src/lib.rs例如形状[3, 224, 224]的Image特征表示 3 通道RGB、224×224 的图像Names支持字符串、扁平数组、嵌套数组与单键对象如{motors: [...]}等多种反序列化形式并有对应的单元测试覆盖。这说明自动推断最终产出的正是 LeRobot 官方格式的 features 定义。第五步创建数据集并导出 episode创建 LeRobot 数据集实例lerobot_dataset LeRobotDataset.create( repo_idrerun/droid_lerobot, # 数据集标识 fpsconfig.fps, featuresfeatures, rootTMP_DIR / lerobot_dataset, # 数据集写盘位置 use_videosconfig.use_videos, )注意root是数据集文件的写出目录LeRobot 要求该目录为空或不存在。导出单个 episode核心转换步骤convert_dataframe_to_episode( dftraining_data, configconfig, lerobot_datasetlerobot_dataset, segment_idsingle_recording, featuresfeatures, ) # 完成元数据写入并关闭所有文件 lerobot_dataset.finalize()convert_dataframe_to_episode是整个流水线的核心其内部做了两件事时间对齐与重采样按目标fps生成一串等间隔时间戳作为 episode 的规范时间步canonical timesteps逐时间步取值对每个时间步用 Rerun 的latest-at语义查询每个选中组件的最近可用值——若某条流在该时刻没有精确样本则向前填充forward-fill其最近一次观测值。这正是 latest-at 语义 的应用场景它保证即使在多路传感器帧率不一致如 30fps 相机与 100Hz 关节状态的情况下重采样后的数据集每个时间步对每个特征都有值满足 LeRobot 训练数据对齐的要求。finalize()负责收尾写入meta/info.json、stats.json、tasks.parquet等元数据关闭全部文件句柄使数据集符合 LeRobot v3 的目录规范data/、meta/、videos/结构详见 datasetv3.rs 中的布局注释。多 episode 批量导出一个数据集包含多条录制时遍历全部 segment id对每个 segment 重复过滤 转换步骤lerobot_dataset LeRobotDataset.create( repo_idrerun/droid_lerobot_full, fpsconfig.fps, featuresfeatures, rootTMP_DIR / lerobot_dataset_full, use_videosconfig.use_videos, ) for segment_id in dataset.segment_ids(): print(fExporting segment: {segment_id}) segment_data ( dataset .filter_segments(segment_id) .filter_contents([ /action/joint_positions, /observation/joint_positions, /camera/**, /language_instruction, ]) .reader(indexreal_time) ) convert_dataframe_to_episode( dfsegment_data, configconfig, lerobot_datasetlerobot_dataset, segment_idsegment_id, featuresfeatures, ) lerobot_dataset.finalize()使用导出的数据集导出的 LeRobot 数据集可直接被 LeRobot 官方训练脚本消费print(fTotal episodes: {lerobot_dataset.num_episodes}) print(fTotal frames: {lerobot_dataset.num_frames})也可以推送到 Hugging Face Hub 与团队共享dataset.push_to_hub(repo_idyour-username/your-dataset-name)命令行批量处理rerun-lerobot包还内置了一个 CLI把上述工作流封装成一条命令便于批处理rerun-lerobot \ --rrd-dir ./tests/assets/rrd/sample_5 \ --output ./lerobot_dataset \ --dataset-name rerun-example-droid \ --fps 15 \ --action /action/joint_positions:Scalars:scalars \ --state /observation/joint_positions:Scalars:scalars \ --task /language_instruction:TextDocument:text \ --video ext1:/camera/ext1:VideoStream:sample \ --video ext2:/camera/ext2:VideoStream:sample \ --video wrist:/camera/wrist:VideoStream:sample参数与 Python API 一一对应--fps为目标帧率--action/--state为完整限定的组件列--task为任务描述列每个--video key:path:type:...声明一路视频流。反向流程把 LeRobot 数据集加载回 Rerun与导出互补Rerun 同样内置了对 LeRobot 数据集的读取支持形成加载 → 可视化/处理 → 导出的完整闭环。官方指南见 Working with LeRobot datasets# 直接在 Rerun Viewer 中打开 LeRobot 数据集目录 rerun path/to/lerobot_dataset也可以把目录拖拽进 Viewer或用 SDK 的log_file_from_path加载。数据集中的每个 episode 会作为独立的 recording 载入特征被映射到 Rerun 的实体-组件模型标量观测与动作、相机图像与视频、任务描述各自作为独立实体共享同一条时间轴。底层实现位于 crates/data_flow/re_lerobot crate它支持v2 与 v3两个版本的 LeRobot 数据集LeRobotDataset::open(path)自动检测版本v3 依据meta/episodes/目录判断v2 依据meta/data/判断v1 依据meta_data/data/判断见 lib.rs统一入口为LeRobotDatasetOpstrait用iter_episode_indices()枚举 episode用load_episode_chunks()将单个 episode 加载为re_chunk::Chunk序列v3 实现datasetv3.rs对视频 blob 采用引用计数缓存视频按需懒加载当引用它的所有 episode 处理完毕后自动驱逐控制内存占用。更细的摄取操作按 episode 拆分、URDF 机器人模型叠加、catalog 注册等可参考仓库技能文档 skills/rerun-lerobot/SKILL.md。实践注意事项综合官方指南与技能文档转换过程中有以下常见坑点帧率必须匹配LeRobot 要求均匀采样fps应与数据实际采集率协调导出端通过 latest-at forward-fill 保证每个时间步都有值root目录必须为空LeRobotDataset.create要求写出目录为空或不存在否则可能残留旧数据实体路径要精确限定action/state使用实体路径:组件类型:组件名的完整限定写法写错会导致列无法解析视频格式需与解码器匹配VideoSpec.video_format如h264必须与录制中的实际编码一致导出时会进行视频重封装remux以保证 LeRobot 格式兼容多 episode 时逐段过滤每个 episode 转换前都要重新执行filter_segments(...).filter_contents(...)避免把不同录制的数据混入同一 episode。总结借助 OSS Rerun server 的查询能力配合rerun-lerobot包可以在不写底层解析代码的情况下完成多模态机器人录制 → LeRobot v3 训练数据集的转换server 负责加载与查询infer_features负责 schema 推断convert_dataframe_to_episode负责 latest-at 时间对齐与重采样LeRobotDataset.create/finalize负责标准的目录化写盘。配合内置 CLI 与 Hugging Face Hub 推送能力这条流水线可以直接嵌入机器人数据团队的日常训练数据生产流程。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表