Skip to content

Roadmap: Locomotion 具名 sensor terms 公共化与跨任务复用契约 #1371

Description

@TATP-233

Owner summary

Locomotion biped 族的具名 sensor 奖励 terms 目前存在三份拷贝:G1 模块内硬编码 sensor 名的私有实现;T800 把自家 XML 的 IMU sensor 起名为 G1 的名字,再在 owner yaml 里跨任务引用 g1.manager_terms.*;PR#1368 microduck 初版又逐字复制了一遍(542 行 manager_terms 中约 230 行重复)。推荐方案:具名 sensor terms 的 sensor 名下沉为 yaml 参数,公共实现收敛到 tasks/locomotion/common/ 并按数据源分文件;G1/T800 迁移到参数化实现并解除跨任务引用;把"跨任务复用必须经由 common"固化为 package boundary 测试。交付边界:不含 biped 步态 terms(G1GaitPhase、feet_phase 等)下沉,作为远期方向记录启动条件;不改变任何任务的奖励数值语义(microduck 的 lin_vel 两项保持 sensor 数据源,imu site 相对 body 原点有约 2.5 cm 偏移,velocimeter 读数含 ω×r 项,与 entity 数据不等价)。预计 3 个 child PR、约 8 文件、净删约 250 行手写代码。永久维护责任:common 层约 150 行公共 terms、一条 boundary CI 规则、"新任务在 yaml 显式声明 sensor 名"的约定。需要 maintainer 决定:公共文件命名、既有 G1/T800 owner yaml func 路径变更的接受度、远期步态下沉启动条件、declared base 确认。

背景与证据

  • src/unilab/tasks/locomotion/g1/manager_terms.py:477-593track_lin_vel 等 5 个 sensor-bound 类硬编码 pelvis_local_linvel / torso_gyro / torso_upvector
  • src/unilab/assets/robots/t800/t800.xml:390-392:T800 的 IMU sensor 起名为 G1 的名字;conf/ppo/task/t800_walk_flat/base.yaml:117-267 跨任务引用 g1.manager_terms.*(含 G1GaitPhaseg1_tilt_exceeded、5 个奖励类)。
  • PR#1368 更新中:microduck 的公共部分已下沉至 common/,sensor 名走 yaml sensor_name 参数,任务内只保留 MicroDuck 特有 terms(manager_terms 由 542 行降至 373 行)。
  • common/rewards.pycommon/commands.py 仍被 legacy RewardContext 系统占用,manager-based 一代缺少按 kind 命名的文件位置。
  • common/manager_terms.py docstring 自称 quadruped,内容实为家族无关的 entity 版 terms——文件名与内容漂移是既有累积问题。

推荐方案

  1. common 层按数据源分文件,文件名与内容严格一致:
    • common/manager_terms.py:entity 数据源 terms(保留,修正 docstring 为 locomotion-wide)。
    • common/sensor_terms.py:收敛为 SensorTermBase 绑定契约(纯基类)。
    • common/sensor_reward_terms.py(新增):具名 sensor 奖励 terms,sensor_name 经 yaml 参数声明。
  2. G1 删除私有 sensor 版类;G1/T800 owner yaml 改指公共参数化实现并显式声明 sensor 名。奖励等式、sensor 名、权重均不变。
  3. tests/tasks/test_package_boundary.py 增加规则:tasks/locomotion/<robot>/ 模块与其 owner yaml 禁止 import/引用兄弟任务模块。

备选方案与取舍

  • A(推荐):参数化下沉 + 迁移 G1/T800。净删代码、解除 XML 命名耦合;代价是触动两个既有任务的 owner yaml(仅路径与显式参数,无数值变化)。
  • B:维持 G1/T800 现状,只约束新任务。改动最小,但 t800→g1 耦合与多份拷贝长期存在,boundary 规则需要永久 allowlist。
  • C:sensor 版 terms 提升到 envs/mdp/。统一度最高,但污染 community 层(mjlab-derived)渊源,并与既有 std² 核 terms 形成同名近义对;不推荐。

Child issues 与集成顺序

  • Declared base branch:dev/issue-1042-manager-based-api(G1/T800 的 manager terms 只存在于该分支;microduck 经 PR#1368 合入)。
  • Child 1(依赖 PR#1368 合入):sensor_reward_terms.py 命名拆分 + G1 迁移。约 5 文件、净删约 200 行。验证:G1 owner contract 测试数值不变 + slow env 构建。
  • Child 2(依赖 Child 1):T800 迁移,解除 t800_walk_flat/base.yamlg1.manager_terms 的全部引用。约 2 文件、30 行。T800 XML sensor 名自由化作为可选项单独评估(涉及 asset 与观测契约)。
  • Child 3(可与 Child 2 并行,建议在其后收尾):package boundary 契约测试(代码 import + yaml func 路径双侧扫描)+ 各任务 sensor_name 参数与 XML <sensor name> 一致性静态测试。约 1 个测试文件、120 行。

最终验收

  • 三个 biped 任务(G1/T800/MicroDuck)的具名 sensor 奖励 terms 全部指向 common 参数化实现,G1 私有拷贝删除。
  • CI 强制:不存在 tasks.locomotion.<robot> → 兄弟任务模块的代码 import 或 yaml func 引用。
  • 所有任务既有 contract 测试通过且奖励数值语义不变;每个 child PR 在最终 head 通过 make test-all

远期方向(记录启动条件,不属本 roadmap 交付)

  • biped 步态 terms(G1GaitPhasefeet_phasefeet_air_time 等)参数化下沉 common。启动条件:第三个 biped 任务接入,或 G1/T800 的 Motrix 移植需要共享步态实现。
  • legacy RewardContext 系统(common/rewards.pycommon/commands.py)随 Roadmap: 将 UniLab 迁移为社区通用的 Manager-Based API #1042 迁移收尾退役后,按 split-by-kind 惯例回收文件名。

需要 maintainer 决定

  1. 公共文件命名 common/sensor_reward_terms.py(vs 保留在 sensor_terms.py)。
  2. 接受 G1/T800 owner yaml 的 func 路径变更(无数值变化)。
  3. 远期步态下沉的启动条件是否认可。
  4. Declared base 确认为 dev/issue-1042-manager-based-api

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions