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-593:track_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.*(含 G1GaitPhase、g1_tilt_exceeded、5 个奖励类)。
PR#1368 更新中:microduck 的公共部分已下沉至 common/,sensor 名走 yaml sensor_name 参数,任务内只保留 MicroDuck 特有 terms(manager_terms 由 542 行降至 373 行)。
common/rewards.py、common/commands.py 仍被 legacy RewardContext 系统占用,manager-based 一代缺少按 kind 命名的文件位置。
common/manager_terms.py docstring 自称 quadruped,内容实为家族无关的 entity 版 terms——文件名与内容漂移是既有累积问题。
推荐方案
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 参数声明。
G1 删除私有 sensor 版类;G1/T800 owner yaml 改指公共参数化实现并显式声明 sensor 名。奖励等式、sensor 名、权重均不变。
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 与集成顺序
最终验收
三个 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(G1GaitPhase、feet_phase、feet_air_time 等)参数化下沉 common。启动条件:第三个 biped 任务接入,或 G1/T800 的 Motrix 移植需要共享步态实现。
legacy RewardContext 系统(common/rewards.py、common/commands.py)随 Roadmap: 将 UniLab 迁移为社区通用的 Manager-Based API #1042 迁移收尾退役后,按 split-by-kind 惯例回收文件名。
需要 maintainer 决定
公共文件命名 common/sensor_reward_terms.py(vs 保留在 sensor_terms.py)。
接受 G1/T800 owner yaml 的 func 路径变更(无数值变化)。
远期步态下沉的启动条件是否认可。
Declared base 确认为 dev/issue-1042-manager-based-api。
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-593:track_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.*(含G1GaitPhase、g1_tilt_exceeded、5 个奖励类)。common/,sensor 名走 yamlsensor_name参数,任务内只保留 MicroDuck 特有 terms(manager_terms 由 542 行降至 373 行)。common/rewards.py、common/commands.py仍被 legacy RewardContext 系统占用,manager-based 一代缺少按 kind 命名的文件位置。common/manager_terms.pydocstring 自称 quadruped,内容实为家族无关的 entity 版 terms——文件名与内容漂移是既有累积问题。推荐方案
common/manager_terms.py:entity 数据源 terms(保留,修正 docstring 为 locomotion-wide)。common/sensor_terms.py:收敛为SensorTermBase绑定契约(纯基类)。common/sensor_reward_terms.py(新增):具名 sensor 奖励 terms,sensor_name经 yaml 参数声明。tests/tasks/test_package_boundary.py增加规则:tasks/locomotion/<robot>/模块与其 owner yaml 禁止 import/引用兄弟任务模块。备选方案与取舍
envs/mdp/。统一度最高,但污染 community 层(mjlab-derived)渊源,并与既有 std² 核 terms 形成同名近义对;不推荐。Child issues 与集成顺序
dev/issue-1042-manager-based-api(G1/T800 的 manager terms 只存在于该分支;microduck 经 PR#1368 合入)。sensor_reward_terms.py命名拆分 + G1 迁移。约 5 文件、净删约 200 行。验证:G1 owner contract 测试数值不变 + slow env 构建。t800_walk_flat/base.yaml对g1.manager_terms的全部引用。约 2 文件、30 行。T800 XML sensor 名自由化作为可选项单独评估(涉及 asset 与观测契约)。sensor_name参数与 XML<sensor name>一致性静态测试。约 1 个测试文件、120 行。最终验收
tasks.locomotion.<robot>→ 兄弟任务模块的代码 import 或 yaml func 引用。make test-all。远期方向(记录启动条件,不属本 roadmap 交付)
G1GaitPhase、feet_phase、feet_air_time等)参数化下沉 common。启动条件:第三个 biped 任务接入,或 G1/T800 的 Motrix 移植需要共享步态实现。common/rewards.py、common/commands.py)随 Roadmap: 将 UniLab 迁移为社区通用的 Manager-Based API #1042 迁移收尾退役后,按 split-by-kind 惯例回收文件名。需要 maintainer 决定
common/sensor_reward_terms.py(vs 保留在sensor_terms.py)。dev/issue-1042-manager-based-api。