ARTICLE DETAIL

资讯详情

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

相对动作还是绝对动作?OpenDM动作chunk构建、夹爪处理与归一化统计机制深度剖析

相对动作还是绝对动作?OpenDM动作chunk构建、夹爪处理与归一化统计机制深度剖析 相对动作还是绝对动作OpenDM动作chunk构建、夹爪处理与归一化统计机制深度剖析【免费下载链接】opendmAn Open-World Foundation Model for General-Purpose Embodied Intelligence.项目地址: https://gitcode.com/gh_mirrors/op/opendmOpenDM 是一个面向开放世界的具身智能机器人大模型项目其核心模型 DM0.5 通过动作 chunkaction chunk 夹爪特殊处理 分位数归一化三件套把机器人轨迹数据变成模型能学、能复现的动作目标。本文面向新手用最少代码带你读懂 opendm/data/transforms.py 与 opendm/data/normalize.py 中的关键机制动作目标从哪来、相对/绝对动作怎么选、夹爪维度为什么特殊、归一化统计值怎么算出来并存进norm_stats.json。动作流水线全景从 JSONL 帧到模型输入 OpenDM 的训练数据是 JSONL 文件——每个.jsonl文件是一个 episode一段完整操作录像每一行是一帧包含相机画面路径、当前机器人状态state、任务指令prompt等字段。示例数据见 assets/demo/episode0.jsonl。一帧数据进入训练流水线后与动作相关的处理依次是步骤组件作用① 构建动作 chunkBuildActionChunk从当前帧 未来帧读出固定长度的动作序列② 相对化ActionRelative把绝对目标减掉当前状态变成位移增量③ 归一化Normalize用分位数统计把数值压到[-1, 1]④ 离散化ChatTokenization把数值映射成 256 个 bin变成文本 token 参与训练⑤ 填充PadAction把动作向量补到统一维度 32完整训练流水线组装在 opendm/exp/dm05_exp.py。推理时方向相反反归一化 → 还原绝对动作。动作chunk构建固定视野 边界重复填充 核心实现是 BuildActionChunk它回答三个问题1. 目标值从哪来两种情况帧里显式提供了action字段 → 从当前帧开始读chunk_size步的action没有action→ 从下一帧开始把未来的state当作动作目标机器人下一步实际到的位置就是最好的期望动作。2. chunk 长度由谁决定由action_horizon等于模型配置的chunk_size决定模型一次说出未来这么多步的动作而不是一步一播这正是动作 chunk的含义。3. 读到 episode 末尾怎么办越界时重复最后一个可用值填充保证 chunk 长度恒定训练时不会因边界帧丢弃样本。构建结果形如data[action]形状(1, horizon, dim)并附带全 1 的action_mask。这套规则也在官方数据文档 docs/zh/data.md 的动作目标与 Episode 边界一节有权威说明。相对动作 vs 绝对动作一行减法两种哲学 ⚖️ActionRelative 把绝对目标转成相对增量relative action - state。为什么直觉上从当前位置往左移 2cm比移到桌面坐标 (12.3, -4.1)更容易跨场景泛化——这正是 OpenDM面向开放世界的设计取向。模式选择由 BuildAction 统一管理ActionMode.RELATIVE默认内部自动串联BuildActionChunk → ActionRelativeActionMode.ABSOLUTE只构建 chunk不减状态动作维度和state可以不同。枚举定义在 opendm/constants/robot.py训练时用--data-config.action-mode指定。一个硬性约束相对模式下action与state维度必须逐维对齐否则相减无意义。夹爪的特殊待遇位置相对开合绝对 这是 OpenDM 动作编码里最值得玩味的细节。ActionRelative有一个non_delta_ids参数默认值是(RobotStateDesc.GRIPPER,)——夹爪维度不做差值直接保留绝对值见 transforms.py#L399-L402。为什么因为关节角有当前位置这个天然的参考系减掉它有物理意义但夹爪是二值的开/合状态——比现在多开 0.3没有意义开到 0.8才有意义。所以规则是位置类维度joint / eef→ 相对增量夹爪维度 → 保持绝对目标。每个维度是不是夹爪靠state_desc声明。每种机器人的状态布局在 opendm/constants/robot.py 中逐维标注例如 Aloha 是6关节夹爪× 2 臂共 14 维UR5 则是6维末端位姿(eef)夹爪共 7 维。归一化统计机制分位数 在线直方图 连续动作值域混乱弧度、米、开合度混在一起必须先归一化。OpenDM 默认用分位数归一化quantile normalization实现在 Normalize用统计值q01/q99把异常值裁剪到[q01, q99]clip_to_boundsTrue线性映射到[-1, 1](x - q01) / (q99 - q01) * 2 - 1若某维度q01 q99 0如恒为 0 的维度直接输出 0避免除零。相比均值/标准差方案分位数方案对长尾分布和离群点更稳健——机器人数据里偶尔的急停、碰撞尖峰不会把统计值带偏。统计值本身怎么来RunningStats 是一个单趟在线统计器用增量公式滚动更新均值和平方均值避免存下全量数据每个维度维护一个 5000 桶的直方图min/max 变化时自动重分桶从而不保存原始样本也能算出 q01/q99 分位数最终产出 NormStatsmean / std / q01 / q99 / min / max各一份。驱动它的入口是 compute_norm_stats带动作变换过一遍数据集按robot_type分组各自累计不同机器人尺寸差异巨大绝不能混算写入一个 JSON 文件文件名含数据集与动作变换的哈希摘要见 dm05_exp.py#L324-L331换个 chunk 大小会自动重算。多机器人统计文件 多机型实验产出的norm_stats.json采用扩展文件结构norm_stats_by_robot按机型分桶 default_robot_type声明默认机型 顶层norm_stats保留默认机型副本以兼容旧代码。加载与选择的逻辑在 NormStatsFile.select还支持按control_mode如eef末端控制进一步细分统计值。训练和推理都会按样本/请求里的robot_type自动选对统计值。推理闭环ActionAbsolute 把增量还原成动作 训练用相对动作推理输出前必须还原。ActionAbsolute 完成逆过程位置维度absolute state delta夹爪维度不用加法直接从模型输出取原值因为训练时它本就是绝对值可选compose_eef_rot对末端位姿EEF的旋转部分用四元数复合代替简单加法正确处理 SO(3) 上的旋转叠加配套 ArrangeState 会把 rpy 转成轴角。推理流水线组装见 dm05_exp.py#L684-L693Denormalize →可选ActionAbsolute与训练侧严格对称。总结为什么这套机制值得抄作业 设计点解决的问题未来state当动作目标无需额外标注chunk 目标与真实轨迹天然一致episode 越界重复填充边界帧不浪费chunk 长度恒定关节相对 夹爪绝对兼顾泛化性与开合语义的物理正确性q01/q99 分位数归一化抗离群点统一压到[-1, 1]便于离散化在线直方图统计单趟、低内存还能按机型分桶推理端严格逆变换相对/绝对、归一化/反归一化一一配对读懂 opendm/data/ 下的 transforms 与 normalize 两个模块你就掌握了 OpenDM 从原始轨迹到模型 token 的完整桥梁。想动手试试可以先看 playground/dm05_sft_demo.py 与仓库内置 demo 数据配合 docs/zh/dm05_finetuning.md 走一遍完整流程。【免费下载链接】opendmAn Open-World Foundation Model for General-Purpose Embodied Intelligence.项目地址: https://gitcode.com/gh_mirrors/op/opendm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表