From b8b54d4f11177e5c7e9c462eaabeaf75b0bf325b Mon Sep 17 00:00:00 2001 From: zilch Date: Fri, 9 Oct 2026 01:12:43 +0800 Subject: [PATCH] feat(deploy): add G1 WBT task-owned physical deployment --- .gitignore | 1 - AGENTS.md | 10 + artifacts/g1-wbt-dance.deploy/manifest.json | 371 ++++++ .../g1-wbt-dance.deploy/payloads/motion.npz | 3 + .../g1-wbt-dance.deploy/policy/model.onnx | Bin 0 -> 1001323 bytes docs/source/en/user_guide/envs/index.md | 3 +- .../advanced/input_devices_and_bindings.md | 46 +- .../tutorial/advanced/motrix_deploy.md | 209 ++-- docs/source/zh_CN/user_guide/envs/index.md | 3 +- .../advanced/input_devices_and_bindings.md | 40 +- .../tutorial/advanced/motrix_deploy.md | 165 ++- examples/deploy_to_sim.py | 31 +- .../src/motrix_deploy/artifact/io.py | 35 +- .../src/motrix_deploy/artifact/schema.py | 25 +- motrix_deploy/src/motrix_deploy/cli.py | 39 +- motrix_deploy/src/motrix_deploy/contracts.py | 24 +- motrix_deploy/src/motrix_deploy/errors.py | 6 + .../src/motrix_deploy/policy/__init__.py | 10 +- .../src/motrix_deploy/policy/processing.py | 36 + motrix_deploy/src/motrix_deploy/profile.py | 6 +- .../src/motrix_deploy/runtime/__init__.py | 13 +- .../src/motrix_deploy/runtime/base.py | 131 +- .../src/motrix_deploy/runtime/context.py | 19 +- .../src/motrix_deploy/runtime/control.py | 415 +++---- .../src/motrix_deploy/runtime/hardware.py | 39 +- .../src/motrix_deploy/runtime/lifecycle.py | 36 + .../src/motrix_deploy/runtime/result.py | 10 +- motrix_deploy/src/motrix_deploy/task.py | 53 +- motrix_deploy/tests/controller_helpers.py | 139 +++ motrix_deploy/tests/fake_robot.py | 1 - motrix_deploy/tests/task_specs.py | 24 +- motrix_deploy/tests/test_artifact.py | 35 +- motrix_deploy/tests/test_policy.py | 22 +- motrix_deploy/tests/test_policy_controller.py | 104 ++ motrix_deploy/tests/test_runtime.py | 1084 +++++------------ motrix_deploy/tests/test_runtime_binding.py | 139 ++- motrix_deploy/tests/test_simulation_config.py | 70 ++ .../tests/test_simulation_runtime.py | 8 +- motrix_deploy/tests/test_task_plugins.py | 52 +- motrix_deploy_motrixsim/README.md | 49 +- .../src/motrix_deploy_motrixsim/robot.py | 22 +- .../src/motrix_deploy_motrixsim/runtime.py | 69 +- .../test_motion_state_and_native_servos.py | 165 +++ .../tests/test_native_motrixsim_runtime.py | 105 +- .../src/motrix_deploy_mujoco/robot.py | 25 +- .../src/motrix_deploy_mujoco/runtime.py | 91 +- motrix_deploy_mujoco/tests/control_helpers.py | 15 +- motrix_deploy_mujoco/tests/test_examples.py | 59 +- .../test_initial_state_and_native_servos.py | 130 ++ .../tests/test_joint_control.py | 18 + .../tests/test_mujoco_deploy_backend.py | 6 +- .../tests/test_scene_session.py | 6 +- .../tests/test_simulation_driver.py | 283 +++-- motrix_deploy_mujoco/tests/test_viewer.py | 35 +- motrix_deploy_tasks/README.md | 66 +- motrix_deploy_tasks/pyproject.toml | 3 +- .../config/task/g1-wbt-dance/sim.yaml | 26 + .../src/motrix_deploy_tasks/envs/flat.py | 18 +- .../src/motrix_deploy_tasks/envs/rough.py | 8 +- .../src/motrix_deploy_tasks/tasks/g1_wbt.py | 646 ++++++++++ .../src/motrix_deploy_tasks/tasks/go2_walk.py | 61 +- motrix_deploy_tasks/tests/test_cli.py | 65 +- motrix_deploy_tasks/tests/test_g1_wbt.py | 140 +++ .../tests/test_g1_wbt_measured_fk.py | 191 +++ motrix_deploy_tasks/tests/test_g1_wbt_task.py | 505 ++++++++ motrix_deploy_tasks/tests/test_go2_walk.py | 94 +- .../tests/test_training_parity.py | 58 +- .../src/motrix_envs/deploy/__init__.py | 2 + motrix_envs/src/motrix_envs/deploy/g1_wbt.py | 88 ++ .../src/motrix_envs/deploy/go2_walk.py | 1 - motrix_rl/src/motrix_rl/deploy/service.py | 6 +- .../src/motrix_rl/deploy/source_rollout.py | 4 +- motrix_rl/tests/test_deploy_export.py | 13 +- wiki/design/deploy-command-input.md | 58 +- wiki/design/motrix-deploy.md | 160 ++- 75 files changed, 4719 insertions(+), 2029 deletions(-) create mode 100644 artifacts/g1-wbt-dance.deploy/manifest.json create mode 100644 artifacts/g1-wbt-dance.deploy/payloads/motion.npz create mode 100644 artifacts/g1-wbt-dance.deploy/policy/model.onnx create mode 100644 motrix_deploy/src/motrix_deploy/policy/processing.py create mode 100644 motrix_deploy/src/motrix_deploy/runtime/lifecycle.py create mode 100644 motrix_deploy/tests/controller_helpers.py create mode 100644 motrix_deploy/tests/test_policy_controller.py create mode 100644 motrix_deploy/tests/test_simulation_config.py create mode 100644 motrix_deploy_motrixsim/tests/test_motion_state_and_native_servos.py create mode 100644 motrix_deploy_mujoco/tests/test_initial_state_and_native_servos.py create mode 100644 motrix_deploy_tasks/src/motrix_deploy_tasks/config/task/g1-wbt-dance/sim.yaml create mode 100644 motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/g1_wbt.py create mode 100644 motrix_deploy_tasks/tests/test_g1_wbt.py create mode 100644 motrix_deploy_tasks/tests/test_g1_wbt_measured_fk.py create mode 100644 motrix_deploy_tasks/tests/test_g1_wbt_task.py create mode 100644 motrix_envs/src/motrix_envs/deploy/g1_wbt.py diff --git a/.gitignore b/.gitignore index 9c575857..9df32a80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ __pycache__ runs outputs -/artifacts/ .pdm-python logs .idea diff --git a/AGENTS.md b/AGENTS.md index 0c29214e..4524723f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,6 +61,16 @@ Review 或修改 initializer 时: - 检查仓库使用方、文档、环境/插件注册和 import 环风险; - 清理后验证 package import 与注册行为。 +### Package README + +README 从宏观上说明 package:它提供什么能力、如何安装与使用、以及该 package 特有的契约与边界。不要把 README +写成实现文档——内部数值(增益、维度、阈值列表)、actor 数学公式、逐字段契约说明、调度器/时钟语义等应留在代码、 +设计文档(`wiki/`)或用户教程(`docs/`)中,README 最多以一两句话概括并链接过去。不要叙述修改历史、调试过程或 +对旧实现/历史报告作辩护。 + +框架级契约(Runtime/ControlSession/Controller 语义、rollout result 口径等)只在一处维护——对应框架 package 的 +README 或教程;插件与任务 package 的 README 不重复这些内容,只描述本 package 特有的部分。 + ### Manager Kernel 入口方法 Manager fused-kernel 入口方法必须用 `@dispatch` 装饰,绝不使用 `@njit`——Numba 编译、缓存和内联由 manager diff --git a/artifacts/g1-wbt-dance.deploy/manifest.json b/artifacts/g1-wbt-dance.deploy/manifest.json new file mode 100644 index 00000000..01ce7d53 --- /dev/null +++ b/artifacts/g1-wbt-dance.deploy/manifest.json @@ -0,0 +1,371 @@ +{ + "control": { + "angular_velocity_frame": "body", + "base_orientation": "body_to_world", + "mode": "joint_servo", + "period_s": 0.02, + "quaternion_order": "xyzw", + "state_timeout_s": 0.1 + }, + "payloads": [ + { + "path": "payloads/motion.npz", + "sha256": "5dec09a5d1b0e37f98ea05002eb95194750422254d2bb0558a01a25a9387725a" + } + ], + "policy": { + "component_version": "onnx/v1", + "input": { + "dtype": "float32", + "name": "obs", + "shape": [ + 1, + 154 + ] + }, + "output": { + "dtype": "float32", + "name": "actions", + "shape": [ + 1, + 29 + ] + }, + "payload_path": "policy/model.onnx", + "sha256": "47d53c5e0126c7891765ecc7c962572a4eccffc939427bf7e8be65f475f156ba" + }, + "robot": { + "base_link_name": "pelvis", + "default_joint_position": [ + -0.31200000643730164, + 0.0, + 0.0, + 0.6690000295639038, + -0.3630000054836273, + 0.0, + -0.31200000643730164, + 0.0, + 0.0, + 0.6690000295639038, + -0.3630000054836273, + 0.0, + 0.0, + 0.0, + 0.0, + 0.20000000298023224, + 0.20000000298023224, + 0.0, + 0.6000000238418579, + 0.0, + 0.0, + 0.0, + 0.20000000298023224, + -0.20000000298023224, + 0.0, + 0.6000000238418579, + 0.0, + 0.0, + 0.0 + ], + "joint_names": [ + "left_hip_pitch_joint", + "left_hip_roll_joint", + "left_hip_yaw_joint", + "left_knee_joint", + "left_ankle_pitch_joint", + "left_ankle_roll_joint", + "right_hip_pitch_joint", + "right_hip_roll_joint", + "right_hip_yaw_joint", + "right_knee_joint", + "right_ankle_pitch_joint", + "right_ankle_roll_joint", + "waist_yaw_joint", + "waist_roll_joint", + "waist_pitch_joint", + "left_shoulder_pitch_joint", + "left_shoulder_roll_joint", + "left_shoulder_yaw_joint", + "left_elbow_joint", + "left_wrist_roll_joint", + "left_wrist_pitch_joint", + "left_wrist_yaw_joint", + "right_shoulder_pitch_joint", + "right_shoulder_roll_joint", + "right_shoulder_yaw_joint", + "right_elbow_joint", + "right_wrist_roll_joint", + "right_wrist_pitch_joint", + "right_wrist_yaw_joint" + ], + "position_lower": [ + -2.5306999683380127, + -0.5235998630523682, + -2.7576000690460205, + -0.08726692199707031, + -0.87267005443573, + -0.26179999113082886, + -2.5306999683380127, + -2.967099905014038, + -2.7576000690460205, + -0.08726692199707031, + -0.87267005443573, + -0.26179999113082886, + -2.618000030517578, + -0.5199999809265137, + -0.5199999809265137, + -3.089200019836426, + -1.5881998538970947, + -2.618000030517578, + -1.0471999645233154, + -1.9722199440002441, + -1.6144299507141113, + -1.6144299507141113, + -3.089200019836426, + -2.251499891281128, + -2.618000030517578, + -1.0471999645233154, + -1.9722199440002441, + -1.6144299507141113, + -1.6144299507141113 + ], + "position_upper": [ + 2.8798000812530518, + 2.967099905014038, + 2.7576000690460205, + 2.8798000812530518, + 0.5235999822616577, + 0.26179999113082886, + 2.8798000812530518, + 0.5235998630523682, + 2.7576000690460205, + 2.8798000812530518, + 0.5235999822616577, + 0.26179999113082886, + 2.618000030517578, + 0.5199999809265137, + 0.5199999809265137, + 2.6703996658325195, + 2.251499891281128, + 2.618000030517578, + 2.094399929046631, + 1.9722199440002441, + 1.6144299507141113, + 1.6144299507141113, + 2.6703996658325195, + 1.5881998538970947, + 2.618000030517578, + 2.094399929046631, + 1.9722199440002441, + 1.6144299507141113, + 1.6144299507141113 + ], + "torque_limit": [ + 88.0, + 139.0, + 88.0, + 139.0, + 50.0, + 50.0, + 88.0, + 139.0, + 88.0, + 139.0, + 50.0, + 50.0, + 88.0, + 50.0, + 50.0, + 25.0, + 25.0, + 25.0, + 25.0, + 25.0, + 5.0, + 5.0, + 25.0, + 25.0, + 25.0, + 25.0, + 25.0, + 5.0, + 5.0 + ] + }, + "schema_version": "motrix-deploy/v1", + "source": { + "checkpoint": "checkpoints/latest.pt", + "framework": "motrix.fastsac/torch", + "run_id": "26-10-07_21-28-43-758744" + }, + "task": { + "config": { + "action_scale": [ + 0.5475465059280396, + 0.3506614565849304, + 0.5475465059280396, + 0.3506614565849304, + 0.4385773241519928, + 0.4385773241519928, + 0.5475465059280396, + 0.3506614565849304, + 0.5475465059280396, + 0.3506614565849304, + 0.4385773241519928, + 0.4385773241519928, + 0.5475465059280396, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.07450086623430252, + 0.07450086623430252, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.4385773241519928, + 0.07450086623430252, + 0.07450086623430252 + ], + "kd": [ + 2.557889699935913, + 6.308801651000977, + 2.557889699935913, + 6.308801651000977, + 1.8144457340240479, + 1.8144457340240479, + 2.557889699935913, + 6.308801651000977, + 2.557889699935913, + 6.308801651000977, + 1.8144457340240479, + 1.8144457340240479, + 2.557889699935913, + 1.8144457340240479, + 1.8144457340240479, + 0.9072228670120239, + 0.9072228670120239, + 0.9072228670120239, + 0.9072228670120239, + 0.9072228670120239, + 1.0681414604187012, + 1.0681414604187012, + 0.9072228670120239, + 0.9072228670120239, + 0.9072228670120239, + 0.9072228670120239, + 0.9072228670120239, + 1.0681414604187012, + 1.0681414604187012 + ], + "kp": [ + 40.179237365722656, + 99.09842681884766, + 40.179237365722656, + 99.09842681884766, + 28.501245498657227, + 28.501245498657227, + 40.179237365722656, + 99.09842681884766, + 40.179237365722656, + 99.09842681884766, + 28.501245498657227, + 28.501245498657227, + 40.179237365722656, + 28.501245498657227, + 28.501245498657227, + 14.250622749328613, + 14.250622749328613, + 14.250622749328613, + 14.250622749328613, + 14.250622749328613, + 16.77832794189453, + 16.77832794189453, + 14.250622749328613, + 14.250622749328613, + 14.250622749328613, + 14.250622749328613, + 14.250622749328613, + 16.77832794189453, + 16.77832794189453 + ], + "motion_frames": 999, + "period_s": 0.02, + "preparation_joint_position": null, + "preparation_kd": [ + 5.0, + 5.0, + 5.0, + 10.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 10.0, + 5.0, + 5.0, + 5.0, + 5.0, + 5.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0, + 3.0 + ], + "preparation_kp": [ + 350.0, + 200.0, + 200.0, + 300.0, + 300.0, + 150.0, + 350.0, + 200.0, + 200.0, + 300.0, + 300.0, + 150.0, + 200.0, + 200.0, + 200.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0, + 40.0 + ], + "preparation_ramp_duration_s": 2.0, + "preparation_settle_duration_s": 1.0, + "preparation_timeout_s": 5.0, + "reference_body_name": "torso_link", + "termination_joint_position_threshold": 0.5, + "termination_joint_velocity_threshold": 100.0, + "termination_ref_orientation_threshold": 0.8 + }, + "name": "g1_wbt/v1" + } +} diff --git a/artifacts/g1-wbt-dance.deploy/payloads/motion.npz b/artifacts/g1-wbt-dance.deploy/payloads/motion.npz new file mode 100644 index 00000000..bd737ef2 --- /dev/null +++ b/artifacts/g1-wbt-dance.deploy/payloads/motion.npz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dec09a5d1b0e37f98ea05002eb95194750422254d2bb0558a01a25a9387725a +size 496308 diff --git a/artifacts/g1-wbt-dance.deploy/policy/model.onnx b/artifacts/g1-wbt-dance.deploy/policy/model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..66c477afc279f27bbc1514d42fe093ce000f6c29 GIT binary patch literal 1001323 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

J#9#_6tYxwOPzQOe@k;Ri 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

S zgDm|L#etXTHUw{*#y<8Hb9*kXqSc8rX?5!sHvRH4;Y)IrogL7jxr>_le!dl)7EHic z(@^F=V8HGg*KpKiHyJ_up(k7tdKAu)<=Hw^wst!TO;R{V&l6-=wjmuhs)1XYYs$$^ zSb=R*qFL0?or0TLxm;gC66}4ahl0c{;J7pjJo7Z!y((4kDJTGiJ`L7VXo{ky1RLY8 zE1+R83Y1RC(0bc?(G3XYyhS`SSXC9B4r_2nevW~>ku%6f-v9b-{X1};f0zuA$;|z& zKG&ZzgjO_Ng=ax=WUrdKb=BS-fP-^j$+VO*k##t;v)#hpgqt(3gOV`G%oyU7liBZH z1=e@3mK51*!}X04Aa_ktcyL0ncsf%T)~}w%v~C|3WEYirYTQYimWIRB zxJFC#&}24Ue%cmJ9LmSZx&B!9zzn(!wArZ})?`lYVq&7d1T=6YiFG&*Yd8z)WAqc| zJsgLaRDeHch)AE&4*VQ5Q!u`GJ-a&Jl0{g}q4B#mF}sIGG^SWczb#21iW>`Xg7@9d2NIR29~qUyf>1v$Sxx08Jl>qBjtSbTF#y!ch#8aS}x z9VvS6%u@V#o@`tUY;@7baiU;Y`}}&T+=?&6ZjUN`^2wj{@0kG}YlktnYd6Tl(;?(k zSv-b`f8!zPXnOZzEt48Co5~*YrBO}o*jDzE90yY<3og6>lPs{m;@7g*;vC2IeJ;ociT z+^hn=OFG?o?cK;p{+svr++jyG(F>s{&PsG6SDok2tsLXWT7GGh!^t;rZ?xNo=kS6s(QGm)RRR zRas}uzEVS;zv1`WZWLNv)z}&94@}?uBYqTwurZ&Xvz~)BXf^sN-JM`fi}$P1v?q4B zE_MQSI|F!cfC`-JOxSyY6}@B|344Bh#-Wv}SQBdt&d$0hu*rkjLPt^WBwsVGbL`h^37WotIh&Cc!B*c%fFmK>*slryxT%Aqp+0Rk)f+5C^Y5o&ci#kh#E0jz zCvBhum3-HG_(Y6&<49w#r-I{@hj>=C5Kr)KL5Yt~L1?m*MyIcVr>7^esq>TJ*5xA3 z{>o+6t8))--Za4P$#Gz#d6u@m{)7jc#c-c=CG5Kf^d^T9k-O{NHku11~s=Xi{kumlB3P{ z1bR9fcGSt?Bc~I%mFE=797%>E*D8^oYXcsaM2^y_T=rQ>5E%f{jU(J=25|76qUuV_|BN~#bHp|qsUgeL_+43 zTKG7EunnrmAaC3@P9rlCmb^d7*6m8fFPg`3(&kW>9jZ(w{~XR-bROgHtl>2CaW@HY zP~$EJ%@-^7eq|kHIyBO}4BQkhiko>R z`zrD$doh^))MMeF%Hd0GF1)WCN~4x7;qFWfEUl1Pj=6VEi!PjrB+FmkCwC=I3O>BN z4Qk7FaciT8az{&gNw=FhGu_(Db0xFIGwmXT%@I=K3HQeE?3Wt!T|EgJ=RT*Mo_`^1 zs5IyEJ`{~@%E2eun(cdRMBVwf%aUoyFtYkmSyRdtcqVfJpIFVMY{Xi6dqp*d8IOTF z6EP?%_F%JTDz+q^#wVZWGb_JRES{o6m*to-BdN(Cx-LVnzDmGow6@Cxas`*e#Do5LdsOv%a_h?9T1se7^HLITb&gwXcRW@p+C(P43M5 z?`;@NvSpT^4w8ALlks4!EE_sb6GqScKvEQ5LQwHo_NRl_L~lC_0iEvzI!k_n-3gv? z5#G)XtTf`X^S2YL3*GQE^ay;CGv#V+b8*efJNWjFF-@MB%q8Z(0qF($r0~u|vLP## z-Lo@`40NBx(~2HhBFX!qeowv+Uc*1~-}7ST zf76mJ*0o_9*W1!M{{Wt6Y7g5cs#BMM2ypRw#z{_o&I15C8-Y9QCMU52}!y@9?^jl!DLP*_~^ z7-X6mk^ggo^z<7+mAel8#ONaeA zcncjC{N&8_>q)(qJ}u?veY+w>D5Fwk6E$lL`QG793=K8d?m`1*>x1U#VMN-*kouVDQ-yv%tlyO>TvQ_~J|DA(UL2N1kLB$b`=3q5 zrKKBbk%ty_br>PmPON3=CIWWP)r5{1X9y4ab=je(Uex8HHoI>tEtXR0u7!ms>Wq_dutH3&G}1`2b-~LF^E-@$Fqx*>~P+qyY%?q zdamxhEF{d>f%X-P=qz6&D*0~;MEd{ao;f^)_updRqq96WU+oe)MesY6vPGDx-hhhk z^?0MOjXO9UV3@>C=>HrCpT@g^aURbs-xdb_y;8Wo`#E0BHmAYE_2~kqnJkL$jy-Ui zEB>LMP9wJWq54JzFh4qgFBgns5u;Djb(YrzL$2ttl39mvzs)K5V7ZhXDEB8fuGP?- z3@xsH_IREH!<}Lm$X!5pa zqlPqs@8>`aIMM{eL$^~4o~>@0kOB_%k)j7$XNZ*EFchwpXD2>95-fe%!P&SjB8Ru} zyu$1>IM}{OpsN-oNc${-@0wI`-}Yi0OmHic_3h*y1r)HL^_ATHaRIQvCyed;kVlHm z`?x|)Ll)>1Lyy%l?pK5bJrhyJ<)uBxiB`M7L*)+%Z!?4b?W;uR(of_sfg?-JHOiKPYE?qniKd#ZI zhulw5okCwcFw}v`+}0p;GH{nZ+5xL|Acro5a^wF}d?Kw4jbZm;$VxdTQPRoXXc~gG z#|=ea7bW3NpV?fFvIqH|--T1^c=q0hY+}<}2_;TM~+zg0&tLwN>tm8()|>6MtAKxw#B5sYfl66vR&Vt6^D%gjlJ!9(q5`#Cwf==W^mD&QWiqxbjRI zGq+eqf2>KPqrWJKhYq^Xa4%KyIEA}(S?e$Ov`$Xk{$De5ReFbR86V+L%>e8hyMVU) zm63*;P}&=JhRIE{#uKj9V7^q7SUQ5e^;$rlN+`p>3R_qoHJa`*S}gE5 z+REM9(1x{B-ogY~-q)*r21jVlVqxibNn#NL-zELr_T?NQu8DIb(x1q4?prvrjHwm^duMJ%0=2FRH_dqRq7qi}O$V&BEp~CeP zE852J?Zsz!XU|C1`K1o)`Ai?o_N7Dj7D3op6&n8{5w6FIAS|i{rXMO^_7aKedQ_oUTg@b{>ZAg|CRYMj>gwSwmDuxIo;+Izh@6L)d2kL-DZU(O1mC3x7XAu$0;1drd^E-W(W4C{a#(3@_ z6(gcCu;d70y3D z85G{92&O3Okx*54oH}`;z~Jo#o0I+W5b1K=#>8BnQyTS*T&hhI&ER(s;=({EzWfHJ zv@XO;GrDn8t_d{|4U$>+EpTs{s~~?sh6c?@g0vee;p34=a@u$?X^hMQ+gq)W6Ie&~ z=SkD*sR4IIDme#L3i*`HqxC@36}Pt%J#s&UYf0jTlKIX4lZ@ zLm}Lq*3ry0Y%|pUNfrGQw$mqO?-)tGi%qVQ!rK{1^ugUII5GD)6&HLZGrv(haBQTw zd%HI6Dw)gVL(}oi*#fH6%lqiMj?oWe_p^7F%W0aw7VU|=M#Nx+l{cSJL*@Hur$3P@ zR@%_5m*%oUDK~t2Y!MaZd;rsj$)bHNwXkeV2qeze#;Xfn;;_tbuy0K%tXP!5TFMK+ zs^>D~whf2!z-I7}{YqX~%mO!Mk+;$h9oJWWo0KBC7}=!N~OVl&T|`-5k;ktBK2!%FH!0D{ntPDzV3CO z?|IHSpZD8W*b?^!+K;N^!YM{VV)hPi8r9;~Kl{YbUA^fC)z2jPqm(%4&!C z1>9bvO42MQg369}SR+_Qn$9nRhbM1ynQxll(l`g~NlUZ|j$K8)jSr*y1Qi%Qm>^2E zehEv&AUJn%DNJ)&1*!I{!6JME>npm=rOh`b8FO<<R3X5MXkKsDy-003LFzeEC;&^K!v5H|dGhB%+U49XkIRPn%OD7k9j3A@eNP*zP zQhF`x12)~ii&6{s(VR;kpfr97>nutmwZ+&HsQ>9nq))cd_4cJgzfk#&9aWhqT~7s{&V|@38_&~6p~8qU0z~sKt3m3ugUNJYm z|D51R>OuJOZwd|F{Dd|)gwyl?$+MW)Y|yL!hjRqOa75E7*i`OLToxSRW=?%Yx7`hf zgq&%3dOv}0-{U}`WG46dTq%xGAHn3^lwtpg5E{I#Ok^H9kyR`*;dZ|Dgazt+RynAY z#Veg6Ax=u%ODQk9tNb zoKfCl{Fr3TiJis}Pe;BNx@bDuZ~O!)`{h~NiN_fHZmlR8?xM-AA?R`OrKqr22BwZx z=AEGLFlfyYu6Or)5iRQg#c^GXI3WF`G_tBgbEaJGwc%+cXNt`(FbCUn60JhRO`vkskQ#q$hb?+smyk*w1af z5>Dcxo4~b58&fW{Lp*m7e4m|x zU&tMJy@@3SKY+ET7QvZ@d8jr}&ZIilGq=fqKv*;a*3_4?(fVTM8u6K#bUBdi*L}&m z!o#d*=YMSQ{xfpgU?a<|&18S3ED&ebxUm0P{HiSPRWYj-{G4=;GKRSuinD5w$^0HB z{JG&ieEjN;6HObqL%%K9oZTHHzp{-CS&+^$UYWD^E~*fBSdV$9ufQKG%ve(1O>DiH z#h&M-LZ{<*oZ9?AuzW%e_uN8`YdaXn&gyECsd+Bgm3WWar22}ccpl;Q{2htQlf@V~ z?gpR+5;NY9;dRS_Xch22mMPs>;;K&c^92}x@2(Sc$z?ph1m7a|a9y$T`chA&|8z8kP&=5>%|uSoa&bT)J5 zET-mth4>|yiZ>XguzL@T$poq{nq_;1t#8yLT>+g;LpuQ1_|GKQYR>>&nTmbYwcPG9 zS#G-5GV*ZC0c@dJMDlGoq*`T@zKUpoFlqA5$($_Obr=4o@4*dMZTK9fGq>yAMfklg zla}Q_tva}6KetP&lZq_W@xE*tXiwB+s%P6k-rI-kCJQ-g-z2hF(L>GM;$czS32ZPd zq>_rsg2Bj0xN&U--61&<&qbxvxF4ltn%Z_~-1VGuws}etALVei{p+fXS1cf=xyDQ` z(i3A!s;T9YM(|NRincK?K;F^-LrzAB?1~pdW^6uF9Xk@|1j;f^y@T}r@m9R@>LBTq zSLX~(F42GN*&Be{>7s)hsjhlCREZgA6_u|jqg7GW!@yVU3?C0*Cq_5GLNI$H`F3T)Yg#}}Y z)$`b@L?n}}oQc(qtDqJyWH%N^Fr}TbaCMR`sTh8Uy2Kb^DH(+o>MdAfYR2uqagMV= zCD!j2gmMd8ApThx)B9q~<_dGc2`cE5XYM50T#hW6HWu{6sr0qf3(Sz=P_F(QO+Hf# z?oUea%EO^#ugW8wR%68C3w)r)jDg}{CJJQVLQVWNs_VqFzPEiNrY+-H@Snq+#)N2+ z7`ROMud{Y!@q3UmS#xD1)4jM1 ztQwV>a9SB%$w@PDPXd{rtqS%p93Xk98i@|>LB-BxaKrI};4)|vUvo3m7(SLX{yHYI zyEO?y8xv{Yi$pveTZ_6au{h>=25Kouv6(@cB))W+c>h)>vNtOcZx&Y(+C7C__>jx? zOr9v5yJ|CgC!WWK{76Onj~Cd2am$J4MpJ&rV7Tz**-SFRPExp)*5RIYuFUiM23*v) zm-#v*64TxbB(Oo3&Gr+qthA%V|E4Va{PTin)x%E4?}oBZxA+~D8NAEzQ6~9y`xRsg zm%ye@YjQ=pijL7}!}>CJocZ=HDt2vz%y26b@`BGG)K0_O{Or-c`#ttcax6JZj#cGO zfE)aNgvRyJMDcMFiKd9h`A< zEj8J9ky-YqGQ)?-c(EuLEtd2XldVzs)W%$#^EH|*eiy`&mpVaCj+giX&(q6ui^TiQ zisG1p1gy0)AniK^!j;oXM5nLBlBUUVEaIyRc|7|A{A_h#!~cBX<}Vw?l+T+nm)O7P zbmlgx52ZBCcPGS;8qS=y_TpX7B{aMt2I>R({Y&0CH)?Pr{eF|7Y(WNBU73QV%iOty z#gWwAr$FSlYzb(3SHQ#hnjqix8YYAf(&whrQTEMc4BsD1?@g6vcW(QGc>63I{P0C| zHtYy0q^01}aS7CoM9`Zfjk)7lY2bQW4!1rjAO~;n!-TDsSiSlz893KPa)~*5WO}j# z@-MM&?QGT2qYiIe``VrjqH*yck%{M|K{d30xz zfo4rIG+)TvZ%UBAoom@rolT@d(~?A4ti-!!t(e=H$b2^F5{tQ%{2CpG5%CMj54kw9 zm9HN+d-ZTyX{X4b{5kY#U5PKQ%8EBXf5=?!Hi28{1YuU?7BWUBhbew=<@xO^iTMY8 z$bU7KsH$|~rG#=&u1P`jr<$y1A@3BO|BI@g`Ny3Z`4WfE`2~wpce44G3_>2=p;|NI zK=w;3T`s}bpT#P8CE)>a>*m<3vEDf5R6k_cCt~8^X3@oor@*IVF_?YaN{Xj{hDNJx zOmp`u?y!0e$X_>Sx+ZF*Sotd1Z?H~SqoyS`i9bR#>o*G{zn73JnoaonhLzZO_Fmzy z+0|6*YAo|~Fe8n7JiuV_FP0&}&t5)#Ve=<_6a37pr>p9AlU0>AqJED&Zp$xea<=X~ z=Dl0PHqUE^K=~6~UG-PdqyNHyUsi*$+X#gIo(yj$-^O{T=a4lU)TnsJF-R_Sr9V1S z;r)&VxVq`5K-c*NPObS#BQ=CnC15g<-m1o&R^An@t%{;|mR_fy9_kYI&6$(P;4~!*l-%@Z|Og!C87PG2t8;ISn zAzY)xZm3xw3hq<*9*bxq7xdVhwMeE{y_)3#H;zZrqE9+_%hQ@XSrp1J#kl>RcF9hN+4T?k*;I zHu)^Zd@ivKE`>eO$y8mkfG($s?&mN*Zw0BD*2B-a;$V~U3ThQ- zP~~RXRrPt|R7i4`V`?ik$o8Po%w_s>aM^p2L?ljR)=^uSWbmuw^?194Ek<2({6~2-QgCU_qg@f?}U>&)gJbJ7`QuzH8>*?R=lslSi^!rqN z$GbWt+bL7N6@>cHpFwf<3Y6ZJhgF}v@rsEqGn;k~L`QFfMd?J&zpa2hI=3G0P54G5 z=ee*_?Z0-OpU1GAVcjS=F@vjLFqs>S@!}NO7_u|Wi}p?3MT49V!{?z-K(yvDF5CKm zi)@nST`0fN*}eofeH=pl_PT)rE#TH&-o@z){RD?|OyEl<&!9_cwp*+87H8I3lM^lv z*iIuW7T>Hv-j}x7CchGpS;scvg~P4HRC+zRaoHC_H#oD;XvFQ8P-R#42C+{@lTc&r zQ~1}X%B;F|@#okj{8`}vUS*1G;p|l`*U*{t&X>iXUv}b~p#>zy_dVUUY$>sL_eT^l zSDI*iNP@D@H|f`xcH)D6AK1M+r^)!NOqL|s!yfENCZ;?q*Mb`-tUamCCi_;fzaeF? zcCr*v)mw}iHA~o;Yc(iYd>pS7t24#FlgNaDJK$@2h^$cjh~B3xNsx0RxM&AJUdIQh z%v59>`CfPU?o9f^xrdV~b^xV{WN^POV4vet`SW)HuATQEt&Et@R?W~uiAH`eSIY_Z zZmb2FDS@J2yGrr;QweSxae%$s&T(O0 zE8#yIE4IqR2!lHq=QZ#ieqS?#xzXWdKuMA48HAJOTNzAy_F8uIYA#WJCW{K;!7&pZV^ zNd#b+1Pzud!}uR2+)TwMbn)ktf~vw>oZWG0@GqR7(e-1An zv=)c?D2j6}T1AGPHtfNgFg!409b0?)K0C7J8wozm_arynp@$+zz`kf>S~vU_tlY1{ z!s4qTa@KR4P`QN(yfyiv#S>VuERc472IbigUKuIfVI0T-ZoZYPmK99rZ1AM>I`N5 zpCa(aurj*#WgCb;$78iZ6}M>`gA01Iz+ZF(k6pP>v)7iwgp`#S;H=3sgO$m$BW846 z$1c&6uo!mJZzVmuF@_#*Ok=8_W7r7QJLKWUbn+(eB5_|{A#Qu|gNVO)3vVzD;e?3S zEK=tnd)c2u9%LV4>x=AI3!giY{izCCbDh~o%dON#N~da8U<1Dgyn;NGa>NiT88UOa z5cDSJ5{rN(RC{VGe*bwKugVob(`$Z*sJj;rR4K90f^_EGm`B>%TX37791hD2V5P7m!o*#~Saen9OSrh?KBo^2%>gD;m2BehRAVbU}c zq0A9Wi18vM;Lk_c@LP#_4JjhKWkh6N#5|#W>^SEAU+eQ3dg?lhg6n~|DTgq9^#N(t?>k#Zs7)Cr^HNZul?+j&ufOu2NB;EO=`VtW!D4<00YJA6n;bt=UEIm$YHwz6_4@DegeI2T$P5=2sa0-xRi|T@Umh7Q+von_+QsIQbAT z$jM2$5nbZNMx_$wT(8R6%hrK7>K$xUcYQ8QD*UfoZBd#m-9~x zJTIvdpV_m}yU>W0uUZW?ckc0XkWTJVcDZ1SPcr#9b1OSMK@(T=dj^-b2C(vCf6OlZ zj&uJM@yJiz_hJAplLbbwb%AV|Ge^ zIIR^s;l&&Nh|XnD_bUn1N{-^kyPYT`8hB#DL2@{)7cyct;N!DHU`ePxTIy_s*KN8` zt5L=+(;k6o1~;g(egww1hLUkVJy2Ou5o}r?f^o4YXx?t%mVbIfT<^+*+D?A|AvlWc zu|5nt$VkHW4I%n@vsmHtdrUafn&|R1#R&K1&~mDXZB#741$7$afx|eV-n=~M?UZNH zZVj05%LLXQxXCoRm*h;-GVuh3EV07}AEDEqF1GPs5sP>6W=i4#_V`*mw_4@`Zs~Ah zHm&Q4mi}mA@+K9W+Z2UtO(jzoJ^%}kOXRAQEwq>KM5*;Nh+Jh8>=S8-7lvFC*!OKB z#_s<(tJCpBPI@c)!j_Ow$l)aZ}UT|R6 zjS1}Tod!5Ge-1mi<{nJ#ZN?wJX+=1P(FTnl)6yPV4P4}le4 zH+aU|d9tZs7A(Be1zt0UGUtE#!r$ffq(7mKME#H>qay?1cBhGG&lVLnVlWMIf8PUb z-N|IspIDY8qfEb4AH@p&pESgT;pJ&+#7R>Z%VOGK%Je&!RWui(HKR!TykGddZyx9U zK*W*~ySOFcPn6k2twiW9bTCVJ0bOjc;1v zSic^7`)C_EmYL0J&A!3wDM2K6{RNa%5JKh&)l|y`ipW_}TkKu0NoNH0^y1o%_wP zZj35(znmy+dT@_;UOmB}D@546u!nqk^qlT$e#4DCA!ct!>xt_Q=i$;3mGsy)2~OF% z5zby84~qj$*^p)@2E|r*&*>UVTw8$$5_nHV7(WYMd<{RAd$Ws$_T;j4A>66Eg<&5@ z(TBZqIKHS^5Clhw(l=Rn5$S;!uO5Q=ulqsbuMDO=h^4OoOl*3do`f*ZL)_teMxtO3 z8&OL~JDs0899-TlpnNifOV^)*3PJH$>HmnTI_AN`8w#*XDTA(Bu#S3tQDocfY_KFp z7j^`cV%E=m(ehvAG%&VPWcQd_yKdh=ZVq|P)#W*W-(WF3s=I@|GrHhkB!3b#RN@)8 z5>av50OxzB0(R*%aT>3Zq5Pkisw|D=$~KQ;r_GPRQe!Q4>PIA=>WId7zrrEN-<$q- zb|*6}$!FJGV#xJIOOPF?BYm>w!oHi0%(n6n%c@(;yghQ*7r$|&a#1(_q1V=hcyJ(e1-GMOW9?^ zd|dCA0r{nfe#Jrj_w4{0m(AcrD4#t7O;GX*WzD~0I3jH%-2Ltpx$i6@Hc!X0nCSo5 zmr=t6p5txVLg6m_ovp#~Q*4oPl?o}eZN;c-;q1ZcyZGSScUJ0`gofQF)cC_oEJ&*X zWAkR1dFQjpa;7^OUTVd33WC`tdjUi^%ptA&5^(&?^IYTPTR76<2b)UgB=f!;Rxp`CYBeV@>-%aJrT^!-!kL~1@NP@h( zu80%&U4Z5VCt-I&9Npa4MtuyzakioqoKE3=!pn8&hn57Ycwu&xne?DYWGN{Y{K`SE z>RPIAV=p{wGF#XcU`i&zEk1jCfMs0%PU6&a(Zr#W%zIxCB~lA{AFL_kZ&z$h{1r0l z{sjI`w+KvY#59`c07g#rh4G$>>{`oTvN|pd#{XW(v@+uH%(x=nNp%vJrp{ur>XS%z zXDvJ2t;9NnhIqDjI!bB-pS^KnIhDU)q{S7{$GZxwYnFs?d_poiq9ut>YJRi#B3Cl6 zrw_c+?Kn%H6~r<99*v3|$zEuhF@6J?ET2A6e0)x;M} zZTB6vYUDvSJFx-Yb#i3V$J<=ThXi;U6vbv57h{2=3;I;YGdqqYL^;Wglufb3$tEK};d?2~ z@cm2mUMhj5+HgEr^&Yjww%mIyZPDbmGB$R?anSj2iZS_oGPvdf8HoBq)O$L(Z%0py zJ;#^`&DVCoZ>2IeP^?Yf-8N?T0v(CnzA*At;wKp0UPBY9i_j&gh#Z|ZnvCZ?R@oK2 zugr5l@whae7^V4=v99XkG7lH_;M*+n?T;mU@4bdqOO!&z*R!y*ZV%~;ZX>O4ji}`B z>9}+ZzYn}H98NC^AbFqfuyIp_glEj6M}IZjnzVp?xLJvQormcwjUV*Lh z@%1>_vtNqH;d7GTvyPFhX=2qiisIVSQta+y{;#~ZTUX-`UEQfbG};nL;;N&#DR~^T zoEb?Ri|=#m>Y5-cmhxGedw3#RNJ7u0l7;1;VZkj^vdC>SzWukCjEcC#$-LtcVLQ$< z{Y9?q^wkK#ow~84fA1&^Q`<&bSGkc$rXt)?T*CM4OW@uKF=>#=VR90~g_GV46PFzN z&dior3b*`QK=~*ExjeF)jR`G;kuQ_EOj!%D=f7Umj}Vh#eaga(YlB5H;^!p(juvb7 zPi6$Zon&nK?v^hpBN4IRY8GU05L$dtI>`wx5!&Bc2RMzeo& z((t$D3)XRbEDOA*gF&Y>gw?}dqMT70@7eeSNAB@#^J{a+ivRfY=fqHQ{ni$?cK2BE z7Cu{l=geZFy5v3+OuCFRF#)WvwGYx;z{Iv$QDl z72gX!6+{cnW|9e3X-s}XC^lWwA*XxQAVPEy)Y_JFar#rpxo^sFMWD*0vQh-<{?p-X z^-}s4V}U-8!%XVNR0h-0=8h_vGgx2S#s za$d_0GW+&8vYp>EdA#5z`zIeN`06u*eLI#zrf;7rUIL?q7pDf2!;_Zb#e+Lh?PIfG zW!FXWXv}5i={S*`cecgtXKtdzI7xQx^}eaUPe|AIMxkFlq7`XOg_ zD*og7ao1-V6L{nWYbJQeP znOk5k;-rI*(C<~J=@Q-fJiDwEbyvxfgWvOD>h&m~j{C{kmG8i3_%CW7!S_F^b%g0L ztAv^}l*LV5N~mZoP?RZa4oU zr_95d^sNH=wnLgMw;D?B3_POmc1FMzpLSfZ*PIv}nu}hmZ{jchy&f%4MYnh@;P~AU zx5I_pt*eSyoPQaHJzB#(Au6b{{s!I=)KRb2Y*>~d!mkMnI7R&*{Qkui8oM}~mMjoJ zbfv5yJ@g7S`#Fz(8)glP^7W$b{)bfiOCw!*&5rXIN79W8dbw#+HgKzsEav&-qXqjP zu7U9hlpga9;9Yq$*eh{7I%k)_y6FpHQ{gYTVXO!~xfyi0a~MsWe3V&+J%>vs9o%v6 z3~I<{7Ii%~Ve{#05G=3B~VbEYbQ~kP;Z4erZjpwys-}28S^RARQWL6KSF@J&R>K}da(offz zUG)-i+siK~@O33;mU+O!n%7mwpA99yD=i?~^fLK)Oo2r7@YzeVyO8U>k~wWRW4E)u z(%0LLu~UjB!m@37K-3Q~1?d`c>Ecgl961dykLTwtiYd77)*|BnVGyIO7IWzz9kH7= z3qm(J!K{?UF#K67lxeEb1b+5WzmLOfg8_oM1Il3Smye$`(z)eFPVjuIxv)<4xuCoI zG^h0MIDM2n8K%BF$>vEY2tQ|2^1e$KQ>{+04zMDjoBaq$OvC(A7j`#r2kGFs3*CRx zAvEG59&ML|&v$*eJ2H!jq`xj3a!(#UKYGEf?JmMUIU>C7V!$3>;dugTN@QHnBd*Y} z3q=V(xP&?Dq0=ssBt89!51MPpl;QI5ckdi_m2Sft*I-yacR2VFH$mXhUr?1QLf3)u zP%-EY)9eqiIqN*=&IK7vvtA9J54(upay&TsQBut7rVPV>b#$4_C!RHvMSPD-k$_?G zg8DV3P`7d+o8Q$>Q!`w7zvW%1{yu_J^=+W$4dEzt>McHJ+eBw{l}N9m2$slZ)a3(n# zRVIny$Is=kG$sRejI2oPW}a1g`V{xv(F*!?)!FHrk(ho&0nTJ3k;})ViOba{@@xMg zsx~5%d0*&eBaPCD`dKsfaZ z4LA56*FXo)dJjOG9u!&FhcTT?KWLY!Hk&tih^$=kt!mev3UqahAk(d1fy@#G)?<~1 zQ9Y@+d-osFn&+x)pKzh5&}|M8Og|`?v-c=H*E^An@$;n}yMnp9FAu=SQE7PN*hW0R zOu)O7Okq2xPrA075yNy2BqAiMlv7+l#bOos&a9)aQlxMP|5>GX^w7xxg(x=LObymH zaPBYN;mxJXu%ze-sE3?}P=_zh+FYk z=54OYQdB(I4a1Ax9V24v=dn$Xt!n{DEOY2g|>h+{E+2 z{f~23*Q${4E`H};@jDxsYasMKVNW(>gfQnH4Okzg%MKm20P$B7XiRm&2@8SL1|;Fn zjeb?q#?Gwqy(H67dJbxz(%8`aaM1g=181C`M9!S8BEtL&a7Is=EU-~wuNS_Dvwglc zm2*ae*MX0M5t;k&^`dOp{;!CN+848gP4cX^-IMX%Dk>>B1p5!KftH!?xI@qSxp;qh z@VB`|FT^WyOYaUL={ve<#GhDv(J3l8iJj}1Y-kO!E^9|c-2tEz)P#Cf4a}wn=@>&5w)topDZhJ`{{B5* zDDk=6Qu^rtd(~+wu94LyfBpF*VQ(JhtO*DhS6cG^ z78lnL!})pM<_bbmIlWiu%&tY^=+Q;oosPK8XbzESuG*|Sak?XV@%N-soNdhK^(WkfaaMklR zLH+Tu@HoE=652lr{;L>8**LzQo#BYG=hlHhXOM0=PysuhZ$SHfz7Y3t8S13VamTch zsbhUBt`D)IzE_5$!|qM=S`z>I7pCK~o^q~fZ7fK{ub|&mqxt#%JX{ym&F$Q;!Bcie z(=W?yIOo>~1#gXwxLc(|ZN{gZ6TC^D1mkyH!sj85Tt)0Sn*X&GHgrUT<5*+Cvp?;k zqF<+I)>(hiOxt;QXs!m%ue>0-;;x2Yrz*nbOSv@7^FQu`zbO~!+%M4i5kxOM|H!S| zkOcSNe&s&@juDKOMW`2WoYn`PC#4+8WiKs*4o5XoW6(`cY#NF>+W%lqKm(0*O%RR$ zlf@aWIKk1OmGoOg9^G+8+E(svuAQUzRLuX+9YR-0V9mKgfyt$LEOm1uhYlZNNVDY^)2o*1kn8%# zZsiUasBQ}5w$&-o{&T}&u>3gp$9^i`Q;p|7&99_9GXGIyc+~&!9;jWDv zbA8lKk6uZENoU4_#r7lDRz=HV$fZO6JRm zs>FAsCW$S+o8p@nT5RdVI#$5!SbIt{s^*G?dObEmpNA1J&h!b4iMsA0Ze2X0me+U(So0F=tdvGW5VY{O<-GLNejeQZr7bIUBm zh1ar~p(VddIjx!hEq*|Ee@k-1JdFrF&u}%h+ew1CD+YF_(apsnM9#PjP8ue$*LEqa ze%dm&?(0@;)CprQc3YWL*)CiIXYjyT2lCy>AC_*2WqN;dn1$6m7Bjw;^=?TfU29E* zPp;InxQx@VCpeDjU4D#iyMA&*9gtbe%X7!qSHV1?927U4Va-FdSz&j$K>A7@4jRV5 zi>aj`$<}bjG1{Fgc6#Ltova+$#*<`$*7VdN-T~%)M+_5739B;xqR9281=ME8nhlR|cpoR>!IZ38Y8NuFtn#fkK?nQ!=cJEwl1C(PC#{EAzw=!Ah6CI#k1%dpgDYwHn~z>rvzTk!1CU;O3*WMI z@R%$GtM;g{qh;Nk>ajRhSRO`3e>_DZS9iiOSp#l$z8#o_#PIXtWY~64Qg|gIR{U>l z7wrC=PQ-Tg@T)GA)clvomh?}k{62I!(|Y=ij^|ESwZ;$Q-G9GDJw4aSwzrW;nK5fy zzlU_3N#riC`A72SU1!bl);RRnO>~0SoLzemURhPi^H((Juy${<;^%mX{@P2%mFDBa zt7Yt#K{>0KZo`~Km6)mIOU3Wb6FT0KIONTQr%|r#@8tXNNN*K+w!xRy=ulW{9tP9) zR^fvTPSE1B77rB*@rmtd;;Il!x5+z#`Q;`|c@EfUWew>q?x<<^0bD0u;4&;qKs0I} zt{!uhXV+ckp3V(~)Z3jCwHX3t6ZQc?(SdUfzB?8WEN zW8to3H1DH6CR)G#Cp|XB0N!oPVAe{^;lW|t8E+0NUoWG- zCh&JKX+PpS%^%Mh@^?bQalR{*=(?C8Xn3d&=FLu`e+)dh+&3Ydz1mA^vwR%384l&r zWOmUPVfl8_f9FCAZKK9nHMnPI65X{qg0G3}U}^bT!L>;Z=rvc0wGO1ihP1219zJR&>tAb~&oR$8o<8)+(60_t_bocqUbaY`lUO8h2K94*}|B|=VC3zm* zG&}`7gzogHbqUo9TuwtIm*AYSpYi@hU3hY+pDu6KMcHrhoD6Fw%9o{K-OC7aW^yKm zhIg=Hk1epwz6Gn>Pr#w6yn|S}jEqc*6)n_n1M}m<#L3GE`M%VEOkRA987QZa3v>67 z;Em5fcGqTNHoKkQ(<=v;seidW$D8rgg0W;$#A;?sma!4DUU4#`D{*;lpFsM@(aO5- zN$}*r5mrzk!)kgJSWajFOxx26AA@<0M8{d$W#uNAnB`a%aVdr^+aZ9>@rRlFWChYb zRF>%UNkd|09@XyuMe84Ea|w$i_)gM7mXI4w+Lb~`cKHIf-rto;-9N_E)(Js#l_n$# zUAb9)o!9bJ&G|c3aaG%a;VkxLE$Xy5k=ap0K+0w~(VVuIP0E#H-)cqOOp2f zz>|KOB;O&DZC@Nta%Wc)ue2FNu|*GdFCR;i_}qSdb2%ZuVp##tQR%@}8vW!Z?w+!Q zotV=@vKJ-8^86RX@ziYyJE{zUDQe=Patk)xFq@IB1h6*%_fR3TeY z(a%aoyTFAKH&Pt*55GAY!?gP8@P4`!C%AQubD0#%^4_WQ4jl$JzVI^ysR=}x&&O^3 zumG<5S#Zm>q*-9cY-$~Lh%?jm;He?TY?$m265!Gfp81BtxM4ou zy36qC?lpY-WHg)CB?DbcCa~7PljNh-Fw*wE97@EY0?rk2qYUrCIg*93?$6kXtGC5{ z4g6doJd&*Yb62d!a}uU5mBzZVV|)Pb4~9=esrbSH2*dwBPz#{`h@j}XNBmf;?L zw@H1{WK>)0hgMBRG+5D*1`TAuqN?L)CGive+7cme^I6UpHMx{$zIbB39rj*|#N@e( z`1$e{$b9TfeZni5T5=ATc*YIJbrB}?-iG7;j3zeDh1~DtMxo2QG}h2I9#3w&COj%p zPbM4|qJHlh_Gqyovx`ZB%k!hzkDcz=GCeulIR>AwYtArI!tZCSc1=d}uAk^_camL=BxKm%Ho9rGJ~R{t z6QdhZ+#-j!w7qCN&E5}a@KKRl(X32WXW!t$jTh3!AYIW98A;f9&WUpBGa)ftRis*S z-|o}TQD^`{+B!~_uGAPq+vjJ%o}M!zlT~LRug6a$*lt1x{M1DzA(@yAYc4s7Mytop=LaOnQLNdon$~on}Qk-?6(r$`& zAY7TK0oL>sop0Vb;!!F7{*F4Ai#TsO<1+8q*j`q4?8d6gr6FG~gQn!4~) z-7C&c_Ydrhm<|`BYVcpfBvG1*0yKx*rNhiBNo-F%^U@u`b!JHlotFIvI`@=l9qV8n zk(xrscdxmqf6~IU1Nvn7ECtplkP;s5m0HsnuIV3$?G@a^nE?(-%Y z@nRokI{i`xX@OJR|!pQu~i0v*09;W^Lacx>Tb^cdyK7QGdTm|Q3d&ufV# z-t4BU=XlV_R~v-=TZV`ucWIHrONk63`vlwGgma6}treO{e`3!*^RuzV>g?oJBh=hu z%MzrrP^=OG_YcsjNBs-FmGFN!oVKuq< zdXI3##(Y-t;stRM?O?><9$3^4lDT$TOcW?DOdsXSa#f?NQk_-V>*;UF`K>F-Z$oPg z+_jaBbiT+b2RtQ_OZa}&{Ezg5MgXgS^aO_;Nx^Ng7s-uOKGP(BwMxOypQ%?VF!xGT zGH}3{{09l_Ko~#&etS)Dc8fjPX|jcQ^ZQzdHt*mvBrb}kja~rr2FyWm)mEnFtb!Zm zPD6IhNZPX5lR2E8NFvH!Vv<_{T1x4$({US-cYTA)M+qk7XoL&==W%*k3-G>BpI9e7 z<0KDE;QqU;g4O*Ac-&(Jj2=8Ia=%vwp_K~QzGgM7UXg{)V|6%N_1$5L?sFr@&z5?TiNRmqLBVg8biEQlB!6|cuU`u^bDUY8+7fmOIHO&~EasWFcr!gbZ zHEv-yU)$RS&9n*g(?y+cLgQ=k@Z!R<)jfyXy#yJYj1RpFepNf>uvQf@N(Ta<|5jb-CtjuB{Y_Y$}H__jv!zgTqWVq6VI5`V+sm z7NpF3CRr_~#~yxFW=FQgV`!p<=$&0XE|1_nJR&~Nc~BajtJ=c7bW=EX{s>E!%3xtS zX9@n!BX`X&vuEduNk)N;c>myJmJ#Gky`0^N{Iy*2!Ercq-fjpbR!hkE9X{for75g! zjz9apE|y7L8jfcJzfpO@jM{)krYiCZ>ZI!adb zb(#d6kG@H>`TkRtg$)~*e%We+|vSHkt#Pd6sujy?TMedakP`N2YRxcmT4 zE^KGlO`H!ZYB^wNe}m~!DMlKVimT29!u-oMxb>1DJLcUqjP$w4wAu(*1w#+~eXWu$ zR6m0s4DV5g{>!kt=_W5kJcd}Dxd5s2ib&h+=~(gCoE|UG^)E1UnBvb1tO0?>TJO+|F{Csgc z=!7-ki-=%yC+{DwSy+J|#nq|G$+yt*d=nZEw=y!1wa6z?EB2~P7-MtcE<4{U1t&Bf zV{c~Hurqv55vlIy5cw<~PrTVl@+&99B6%xzUN;X*BX`1TQ3pubWWl%#_c3X&;_Qwu zC-CFBGAui2gfKM#m)G?RjCGyB(Z&&+=|$LK(aL5`v}ID)tY<2H#mMQMD!BS*B;#V2 z%r0Is4J~&M10#0^7Pan$nlmCqB&i-e`9;vw;{&f}ionNe4Isx&u{5|HkETteeNCqY zB2%BRUpCaDQ*!~TuZy4>E$4XNRvvii_dnd`Ih6_IvJ5BI+u;rsJsPr~bBDcIL9>mQ z(2!edDA&7Gcv~VI_N8eGXI+sbyT9eogI`mrvdDAtd3l>a({47|ysHVvR}7Qjx%cRJ zyAis=hx2Q%t*8GC(}}iMHaRRdQE0GAO?Y?g7uxjnJI7U45^j0BmfUxh6YdF*AiBTi z6RGVx$l11RlwW$BT9}@NV}ZXhMRXpi{F=h#b90bn+f%U7^C~7=?Z8V?wrs(^Z6sKI z7mWE`#a1%GB>QYNtDcZVvZnmNF_~u}**20n*3EU+UR}aRayf7+G!o~hDZx=yN#ZzB zkIAT1g_CnR?xp`99J(V2mj7G>iVaAT1ozD4i zkCDTtZP6!wCo?;1BMg3(q7JDGpm5|0Z<6jmyd8a+ap5xQbAz|SBA11**;9h33|)fU z=KJu*;1?`#vEi97O$7fw7v{Z~IJqvZN34D!?VrRjC=*EkAZv8mePfvOAZG;h3GZSl=B8 z@16V5)HI6vgD6S4Y{1)eX%BoqCW$@PdZ1RH0e#6C@J~GwtRIU(_Pqjjf1M_dfbJEvbF@K43Osf zSfN#T2-!KPB=q#oVIof*#9f2gbVG^@Uv>63(yyP5##IOD=_UJN&GK{_f1rj9`gos_ z9K-pcW47V@Pd9kieW#;NmN~_5e{i?eYo@qiJUkfJgN2O&m?NeKN^2#-U;8UOU$h&= z;!b0GUJyArBFRo7ad;wV8#{1M0K%)sND0RgvHCZ~uHpI^!Zbf7qLo=h!FG@|mu#U= zj18$~`gLa8Q8{LH=m;;?bCjueGU0W|6oJ?K78qVBg;nvg@N2>~Hle+U%`})t&9sKF zQC^C$=91KDZ71CnFv4El0l03CCcV4A49_cx3sXKj3(f0;X@UVTx#2Dt@z$MIFCK)c z1@B?owj;!J^dkhr;ppTXmUdV` z&{Cl4HR7BLrAeTXX--tEW(ayYChnHJZnEe{3^97SGz$(#It$=$C0PKU)dk7(Zr@2BE-4jD33XHpy|<=i^c*y65Ufns)j-7`Vst-N$+g>uT!o-K$%4 zcbpQr3OaOM*L<*6m`68oPG$bJyQsZ$1|FVUNPUV6K)6JdP8rE2Jzp1dS!oLhGbKby zC7!w@o`q-or?RRc`!L35Hq~7H7G6i2(mk6U8OJj>nL|~Xtnvm!I;$W7?k#zUe#`za z6CVok?bg`fHU=K{kHfYlL(HEgvoOZB0=IVl zLdio%*e#AHAVPG2J$-GM=2wl!;h^0#{#+KL+QRiPE{zp_`2HU**zrcNYp{T0*5u%X z%W5=7zKaQI9l;|Z_0S|Yi#o)*(onZ_x_i7S8^6yDWF8#n&AE76uz!~lUHDoZzC8%S zpcyG(msO*Il651heal>+o=8p2wy zKTv*-&lD_bgA3g!pz?7RZ{V&a)G=q7Ljg0`Z|?axQ!fRN39AGVM>r?>?l@*r&~?Vt zeHQjVTVGv6)Y~O`A2+}+ZCh^Ls(l?I$`lCwcg{qL#6HkNv z)KpwKdDL$CpaD#me#;mriQ1`)4uXl*6y{Q+H0P3$;yNF98N1(?@s?yce(}}Awl%}> zumEvda0Tjas>W~k&a#VUZDAc9*J77vI(x*c6umg-<)XcoSiImL({OD-59952CFJ6^MH5<1LH zhZ=Ur6HRoPqJV>15pdG-8E>DoIy%@|qmuVMfnW4(IJqI4edxHC=d&%7c}QRIc5PoN zIQnxUxs);iH)!^PgM%0u-y=t8=uO5gVj@x5dmH;NE(aI=?X1^;4OzWKlw+!D0`_c% zwTm_(`?(Q(M(W8S#)O)5d}43xTSfziHVa4cPw{)X`@}%AtnhBU3DK#N=09@%!R(yxW)Al40ZuVb} zy5s9$zSvT-F?}n|3y5C+3>-^Y{Hxu}q+21I_d7cMs z#P~UBYUJLvQZiXq8`kR_Wv-^HGG=>hNtt*#FH_e}Kn`Xyn{?meizl1N5gN$GZjGlE z;;)#|lW(ZKS{_yL&!QCxhrwt1FF~qHHOF%sfkSdPAlY9?rUve2K3|d~bapTe^v%VN zelDjRx{jpfj0Nq9-qd7ZEDX<#qJ@Ry$%2PG+&}9FqxoY2^Rp!J{b&RL+a3R@sqm8{&q)Yd9 zwSsY~IF@pIqJ5h#Vz)l$a(!P5eq(>brx|wz`2k{J)S$}_3W8|Nx(m$HIi?)D-xb}> zmkHdCW`f+dhd6DABG(;eXirlfo%(7mYF@fP%sVd<%^4>Ag3bt`l3^uScUBUcXf>)R zY9h?f@)y>2df*bAi1(6?Qd^@~YOGjEzu0uq_=!4n^DGnU(g;FxE?fC3?Jk9;Drz$B zCfQvwfSSuvh{*DAT4wfxoL&78qYQaCX7>|{(=15A^vlfEWs{~tF zCEpO}IN3zjgw;{C2bWR)6lLzDtI+7K2GW_WMuX1Dk>2rf#MjJ0!P^KDn? zBmaB!MSllQ-epDDz9JIjmxIq6ufiIc9t`bwVv8(NsN>OtG}xZ=TxBW3PRDed|MC^@ zy>2b8^Wc1h+`LKjgCEBw(*{SyV5T-o5+Xw{fc;gpE6r|TvTmHglK-lh;a$og`C}Be zaIsGB1N)g?IicO6t~YG*I39)#Al}Z2V~zCx3Z9#-XHA#NU{01aQ`6=EU|i4qTA++^ zpA8{ITa$VJ(i_JZgfdHY{;_)D-I%=SI?iYmvzxx80JlUbG20(rK-=q8cs*BvOgYsI(<%(`9*lUCP3S~JO##{OqVVtfE~PL)Em$$chani%of5=UG=1H;D0K;f=j z()!^I9B~^G9Gtj}4vrr~Kld)BE)LDmcTAGJ+80Tm9Z(_n9ksAgO`7cL(gu$@F`*vB zGSa8iQL6O=+!ZLI$n^;9x0T0}D*EuRL^n1x>-07}O-rrwOSDu-KAsfU|wQCr+tA)Xwr>WSooMCU&a%E+sNLI_p1Lcg0 zaD8VWX*qcVq#qHwOK=vws1%AFNMPa8mFfxN)_7p61^g(BAQM*lG4^44xb~Y8<`&M! z*BxlG zJ)vWV4c(u(l$H;7)w|^jVEM$$VQy*Buuj;Y-I*Vm-pRdw&7{9(^1Wj9fms z0sel_Ath_{X}fL&i99A`PQ5ON=%%OeaR{;4wF`H6?nl!fxy+?@9HCH6yy0<4;M8kdV} zVw(PTZdTe4kq2*JS&|KutouL4;TimKs>bti6L4ek5VJ-Pi7WSeIf+_i?CT`5wNXUq z_$!R=ZO$h>zmKB3r4hd1dL$C>)}m|hBl=llm^4Uy!Y`G5uq;iK9vBtnf86njpD`tj z-#@;L=*<#B%gu2_V?`PH;}OYxm=q7kr>F_CRMSxJ&Kyd8WzlYD1%zZK@J3X}5Y0m-{A}vA$XlN@t3hdm%hKr|;?{#Y-G(?!v-c@mw6C4fU-*H2mAxEYnnf#JU2?HAZ!L7svBGmp z&+wcljEBbHdA0|B1z7&Fyb`YR$>< zb}Q-`A&Istukwy;zXxM0%u%8<9kwMScOD6Z>!K;}B5EaOP929~=ZN6j_3dy+Zw#G2 zYC;^=m!b;S<=k#{5zLr6(z4(z=~BDRzC6dW_s_Ht>yIbM>GOWV(uar1xzA(C$LO6T zSGbnyKBn=dZ~=N3issOu9x`Fa`x*S~|3-yC<^p^Yv{Rj0=FZ*Ylb3@R4A;TR*fjOzL4 ztYZzQ#ZH_-la2GymcvXix5wIb*l&-opTo6<}n!eM;br8t%7r8 z17v>a!*5Ox*huko+8xG&MFw|4Zry#X<7R5>uGR4JV~cRbC0VLBaGJ4pS%h?c1`6RA z`$zL06FvVhywY4n4?epAnU5{W*gaYF?x-Cp4y?6{3W=g0Tbzk?OFhlV{zvK+B5CDa zXO#X`34aT;$O)s%*wp{H+D1&3PCBs(i_A)xlK1*tj(Y}u^RyDqnhvzTJ8on?D?aHZyy6@3J%F55d*9aE?sF>zq@-@s zUoDep^`?3BW!MgS=kXw1ZOEqcRK>~6l?R!8-9b1j7EHyZuF?0mH#5dh^VmVtJX~oy z$XZr;k@)&xa>=^^FDIBX$Gvxw<5O0`xk*xlo57GNt?J;htXeRgeFvM)}QlWW^@<7RICUfDiDKR>x#yO(Afp_B+yT$7%dOaz?uPOdy?Jrk!G(Lgt zWu7FqbOe>HrKo$mnC%toHE_SZfH-0>~(M#kmJbxZa6{2Dw^sPC^ zOm;^b1wZ_5tV}Me2{|UkAZ-tJC$)2qVZ3lL-kUlLqr%eB{o?^v%I+k1%ITBtkQOYQ z>_L{9#E$Jjd`fMm?O&`ByZv}N?Y%A>lklN^GgO5$u?tqn(MlS?7u&rEHiVVVNp$} zRq&OF?&fmOKedF;H~ffVz%z!OZAi@Cc3?_U5L*5&#@S-BLIa@~&8bV_d>;=Xsn3z@ z*j5Ey;qv_aZ7lU4BPt9Lnv>Y+3M7wX=uF~ip>|$j5QC&g236 zJ6a95pV`aHA3k1vuV05c=e&aHb=t)AXd#pJFAz;UteL@@MVR}_0p5MEAJ>?IDAj-uloC+ad9 zgvtGrs9tR`)Kq)Zj8+HwV&OHSo?%7ohkUhJf%8|cBXeaZ;~R5-xVEeerI%diEvwKZw`KHMd(dGm z927|B9!26gi}GIkO3{fi%NT8YXA~~~fJe6!;|Jd-PCN5{%CQjHh6`HPp}oBDKg z$s^eGd;=Jo>w}}-AUiN+9MLLEhu5o|G3CNIm{@rfPDHq3ZQF7DkB$Ycv;KJU%tE%$ zIl;EVyMgywH=He=^-w?NBom>2mN+F5V$WM `HvEkj9I4(f~Q$FQ1 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

wbeNdQPWjGda#ym+?WctKXKjkdTH96 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�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≶Qg$EpG(e4sKYrEmGDkv2_rdA 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�~cFZmB!4mjrnJ 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�%9&*#Hu)_xSR4ZW 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 G7HDRU`E+ucMo5U8r$gAbgrQ5vC>XBl%C- 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 literal 0 HcmV?d00001 diff --git a/docs/source/en/user_guide/envs/index.md b/docs/source/en/user_guide/envs/index.md index 5c9887cf..9885bbc4 100644 --- a/docs/source/en/user_guide/envs/index.md +++ b/docs/source/en/user_guide/envs/index.md @@ -58,7 +58,8 @@ python scripts/view.py env= | g1-29dof-wbt-largebox | `g1-29dof-wbt-largebox` | Track a large-box carrying reference motion with Unitree G1. | `motrix.fastsac` | | g1-walk-flat | `g1-walk-flat` | Track walking commands with Unitree G1 on flat ground. | `motrix.fastsac` | | g1-walk-rough | `g1-walk-rough` | Track walking commands with Unitree G1 over uneven terrain. | `motrix.fastsac` | -| g1-wbt-dance | `g1-wbt-dance` | Track the bundled G1 dance motion with the manager-based environment. | `motrix.fastsac` | +| g1-wbt-backflip | `g1-wbt-backflip` | Track the bundled G1 backflip reference motion. | `motrix.fastsac` | +| g1-wbt-dance | `g1-wbt-dance` | Track the G1 dance motion corpus with the manager-based environment. | `motrix.fastsac` | | go1-stairs-terrain-walk | `go1-stairs-terrain-walk` | Control Unitree Go1 to walk over stair terrain. | `rslrl.ppo`, `skrl.ppo` | | go1-walk-flat | `go1-walk-flat` | Track walking commands with Unitree Go1 on flat ground. | `rslrl.ppo`, `skrl.ppo` | | go1-walk-rough | `go1-walk-rough` | Track walking commands with Unitree Go1 on a procedural rough height field. | `rslrl.ppo`, `skrl.ppo` | diff --git a/docs/source/en/user_guide/tutorial/advanced/input_devices_and_bindings.md b/docs/source/en/user_guide/tutorial/advanced/input_devices_and_bindings.md index cff16bf1..0d2f36d8 100644 --- a/docs/source/en/user_guide/tutorial/advanced/input_devices_and_bindings.md +++ b/docs/source/en/user_guide/tutorial/advanced/input_devices_and_bindings.md @@ -29,9 +29,20 @@ input_devices_and_bindings/extending Backend-neutral InputDevice, binding, and task-command pipeline ``` -`ControlSession` combines a binding, task, policy, and `RobotInterface`. It reads the command, builds the task observation, -runs the policy, and writes a `RobotCommand`. A simulation runtime advances physics and manages the viewer; a hardware -runtime schedules control against live robot state. Both use the same task-command semantics. +Policy means observation → action: `Policy` runs the model. Controller means robot +state plus control input → `RobotCommand`. `DeployTask` is the complete task Controller; +the execution hierarchy is Runtime → ControlSession → DeployTask → phase controllers. + +ControlSession reads an optional binding (or uses `None` for autonomous operation), constructs +`ControlContext`, then calls `task.step(state, context)`. The task owns preparation, model +execution and normal-stop behavior as required by that task. Its `PolicyController` uses a +`PolicyProcessor` adapter for observation processing, inference and action conversion, without +robot/backend handles or a reference back to the complete task. ControlSession writes +`ControllerStep.command` and owns open/enable, state validation, health checks, cleanup +and statistics. Runtime owns session scheduling and host lifecycle; only SimulationRuntime +owns physics/viewer and simulation world resources. Hardware uses the same control path +against live state; neither ControlSession nor Runtime interprets task phases. Faults bypass +normal task stopping and invoke the backend fallback immediately. A simulation and a physical robot can select different concrete devices. For example, simulation can use a GLFW keyboard while a physical robot uses a remote controller or network input; both reuse the same binding and task-command semantics. @@ -54,29 +65,12 @@ A high-level task command also has the opposite direction from `RobotCommand`: ## How a Binding Reaches the Task -The runtime obtains a typed task command through `CommandBinding`: - -```python -from motrix_deploy.runtime.context import PolicyContext - -command = command_binding.read_command(batch_size=1) -context = PolicyContext( - step=step, - elapsed_time_s=elapsed_time_s, - command=command, -) -task.validate_command(context.command) -observation = task.build_observation(state, context) -``` - -Deployment's robot I/O boundary `RobotInterface` and optional `KeyboardDeviceProvider` / `GamePadDeviceProvider` -capability protocols are defined in `motrix_deploy.robot.interface`; import them from that module. The providers expose -input devices whose lifecycle they own, rather than discovering runtime plugins. Runtime discovery remains in -`motrix_deploy.runtime.factory` through `motrix_deploy.backends`, and recipes still select plugins with `runtime.backend`. -The prepared `runtime.robot` is available before opening. The application constructs -`ControlSession(robot=runtime.robot, command_binding=binding, ...)` explicitly, -binds it with `runtime.bind_control_session(control)`, and runs it inside `with runtime`. -The factory does not construct bindings or controllers through callbacks. +In a training environment, the environment reads one command batch through the binding before +each step and hands it to the task to build observations. In deployment, the `ControlSession` +holds the same optional `CommandBinding` (`None` for autonomous tasks) and passes the read +command to the task inside `ControlContext.command` — both sides consume the same typed +command. See the {doc}`deployment tutorial ` for the complete session and +runtime assembly. For example, MuJoCo deployment obtains a `MujocoKeyboardDevice` from the runtime's `KeyboardDeviceProvider` and constructs a `KeyboardPlanarVelocityBinding`. Training can use a random binding for the same `PlanarVelocityCommand`. Both paths end at the diff --git a/docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md b/docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md index 96f74b0b..20d2824b 100644 --- a/docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md +++ b/docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md @@ -32,14 +32,22 @@ Export selects the latest run and creates `artifacts/go2-walk-flat.deploy/`. To `run=` instead of `env`; `output=` changes the destination. Existing artifact directories are not overwritten. Confirm that inspection reports `valid: true`. -The artifact contains the ONNX policy, robot/control settings, and task specification. Deployment also needs the installed -`motrix_deploy_tasks` plugin, which supplies the walking implementation, deployment scenes, and Hydra recipes, plus the -runtime plugin for the target. The recipes work outside the repository without a workspace config path. -Task defaults select the Hydra runtime group (`sim` or `hardware`); you do not need a separate runtime override. -Common top-level settings are `artifact`, `duration_s`, and `command`. All target-specific settings live directly under -`runtime`. `runtime.kind` selects the simulation or hardware path; `runtime.backend` selects the plugin (`mujoco` -or `motrixsim` for simulation, or `unitree_go2` for hardware). `runtime.backend` is a scalar string selector, not a nested configuration -mapping or Hydra group. +The artifact directory is self-contained: + +```text +go2-walk-flat.deploy/ +├── manifest.json # robot/control/task settings, payload checksums +├── policy/model.onnx # exported actor with input normalization +└── task/ # task-owned payloads (e.g. the G1 motion NPZ) +``` + +Deployment also needs the installed `motrix_deploy_tasks` plugin, which supplies the walking implementation, deployment +scenes, and Hydra recipes, plus the runtime plugin for the target. The recipes work outside the repository without a +workspace config path. Task defaults select the Hydra runtime group (`sim` or `hardware`); you do not need a separate +runtime override. Common top-level settings are `artifact`, `duration_s`, and `command`. All target-specific settings +live directly under `runtime`. `runtime.kind` selects the simulation or hardware path; `runtime.backend` selects the +plugin (`mujoco` or `motrixsim` for simulation, or `unitree_go2` for hardware). `runtime.backend` is a scalar string +selector, not a nested configuration mapping or Hydra group. ## 3. Check in MuJoCo @@ -67,10 +75,10 @@ The complete `examples/deploy_to_sim.py` example composes a scene, walking task, python examples/deploy_to_sim.py --headless --steps 100 ``` -It creates a MuJoCo runtime with `create_simulation_runtime`, attaches a `ControlSession` using -`runtime.bind_control_session(control)`, and runs inside `with runtime:`. The control session handles input, observations, -inference, and robot commands; the runtime handles physics, timing, and the viewer. A raw ONNX file needs explicit task -preprocessing and action settings, whereas the artifact carries those settings for the CLI. +The example loads the model externally and injects it into the task; the task computes commands, the control session +owns robot I/O and execution statistics, and the runtime owns physics, scheduling and the viewer. The +[advanced assembly](#assemble-the-runtime-and-task-explicitly) section shows the same composition step by step. +Raw ONNX use requires explicit task preprocessing and action settings; the artifact supplies those settings for the CLI. ### Select native MotrixSim @@ -123,13 +131,44 @@ motrix-deploy-unitree joint-control enp5s0 FL_thigh_joint 0.9 \ This helper uses the artifact's robot, gain, timing, and limit settings. It waits for Start and A, moves the joint, holds, returns to the default pose, and closes with damping. -## Advanced usage +## Deploy the G1 WBT dance + +The G1 whole-body-tracking dance task uses the same export → artifact → `motrix-deploy` pipeline. The artifact embeds +the servo gains, action scales, preparation gains and timing, safety thresholds, and the motion clip itself (as a +`payloads/motion.npz` payload with its checksum in the manifest), so deployment needs neither Torch nor an RL environment. +Export needs the training provider and task environment packages, but does **not** train: + +```bash +source .venv/bin/activate +RUN=runs/g1-wbt-dance/motrix/torch/fastsac/ +python scripts/export_deploy.py run="$RUN" \ + output=artifacts/g1-wbt-dance-software-pd.deploy validation.atol=3e-5 + +motrix-deploy task=g1-wbt-dance/sim artifact=artifacts/g1-wbt-dance.deploy +``` + +Headless validation and artifact inspection: + +```bash +motrix-deploy task=g1-wbt-dance/sim artifact=artifacts/g1-wbt-dance.deploy \ + runtime.viewer=false +motrix-deploy inspect artifact=artifacts/g1-wbt-dance.deploy +``` + +The default duration comes from the embedded motion clip; shorter runs use `duration_s`, longer durations are rejected +before opening the backend instead of looping or holding. No velocity command is needed: the motion is artifact-owned. +The same artifact runs on MuJoCo and MotrixSim (`runtime.backend=motrixsim`, with +`runtime.physics.solver_iterations=3` matching the training budget). It is not a hardware deployment recipe: the current +Unitree transport is Go2-specific, and sim2sim success is not evidence of hardware safety. -Artifact inspection resolves the versioned task class through `motrix_deploy.tasks` and validates its Pydantic -`spec_type`, without constructing a task or importing training environments or simulator backends. -The JSON wire format remains `{name, config}`. Python uses direct spec attributes such as `spec.kp` and -`spec.action_scale`; action scale and bounds are joint vectors in canonical order. Policy action bounds apply -before scaling and adding the default pose; robot position limits apply to the resulting targets. +The task mirrors real deployment practice with four phases: `prepare` (ramp measured joints to the default standing +pose, gated on continuously measured readiness), `policy_hold`, `playback`, and `damping`. Takeover after readiness is +automatic by default; programmatic applications can stage it manually with `automatic_start=False`, the request +methods, or an attached keyboard (`p` start policy, `m` start motion, `o` stop). Note that the dance ends in a +deliberately leaned pose that only the tracking policy can balance: after the playback budget the task enters measured +damping directly, and ending upright requires the motion clip itself to finish at the standing pose. + +## Advanced usage ### Load a task spec from YAML @@ -148,40 +187,17 @@ spec = Go2WalkTaskSpec.model_validate(OmegaConf.to_container(cfg, resolve=True)) `Go2WalkTaskSpec` uses field constraints and a model validator for joint-vector lengths and ordered bounds. No separate `validate()` call is needed. Use the artifact reader for a full deployment manifest. -### Startup and array validation - -`RobotInterface.enable()` takes no initial command. Unitree owns the transition to -`RobotSpec.default_joint_position`, using zero target velocity/feedforward torque -and the resolved startup gains. `runtime.kp` / `runtime.kd` override artifact gains; -`null` retains the artifact gains. Startup does not call task `process_action()` -with a zero action. Initial-state safety and task-termination checks still run before -enable, and fresh-state checks run afterward; Start/A gating remains unchanged. - -`DeployTask` declares neither `observation_size` nor `action_size`. The policy -input boundary validates actual observations, and the task action-conversion -boundary validates actual policy outputs. CLI assembly does not precheck task -dimensions. Manifest tensor specs remain model metadata; `DeploymentProfile` -dimensions remain export-only checks against the compiled environment. - ### Hardware sensor and motor wiring `motrix_deploy_unitree.hardware.UnitreeGo2HardwareCfg` owns asset-free hardware poses and wiring. `HardwareSensorBinding` maps SDK IMU fields, including `wxyz` quaternion conversion to canonical `xyzw`; -`UnitreeMotorBinding` maps canonical joint names to SDK motor indices. These definitions live in the -hardware plugin's `sensor` and `actuation` modules, not in simulation robot models. -The artifact still owns the policy joint order, default pose, and limits. Hardware configuration imports -neither model assets nor a simulator or SDK eagerly, and does not fabricate base position or linear velocity. +`UnitreeMotorBinding` maps canonical joint names to SDK motor indices. The artifact still owns the policy joint +order, default pose, and limits. ### Select a deployment world -Select a world with `runtime.deploy_env_id` and a robot with the existing registry ID `runtime.robot_id`. -The CLI calls `motrix_deploy.env.assemble_deploy_scene(deploy_env_id, robot_id)`: it creates the robot-free world, -fills `scene.objs.robot` using `motrix_env_core.registry.make_robot_config(robot_id)`. -The core registry lazily discovers installed `motrix_env_core.robots` entry points, shared by training and deployment. -The deployment worlds `flat` and `rough` live in independent `motrix_deploy_tasks.envs` modules. They use core -floor/height-field configuration without importing a training task, robot model, or training contact setup. - -To keep the same Go2 recipe and artifact but switch its world: +Select a world with `runtime.deploy_env_id` and a robot with `runtime.robot_id`. To keep the same Go2 recipe and +artifact but switch its world: ```bash motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy \ @@ -190,6 +206,9 @@ motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy \ A world-only override leaves robot attachment placement unchanged. Adjust `runtime.robot_translation` if the terrain needs different clearance; the complete `task=go2-walk-rough/sim` recipe supplies its own attachment defaults. +`RobotCfg.translation`/`rotation` are attachment transforms composed once with the model's intrinsic base pose: +Go2's intrinsic base height is 0.445 m, so the flat recipe's -0.114 m offset gives 0.331 m and the rough recipe's +-0.025 m offset gives 0.42 m. The installed flat recipe selects the world and robot by ID: @@ -203,34 +222,15 @@ runtime: robot_rotation: [0.0, 0.0, 0.0, 1.0] ``` -`runtime.physics` and `runtime.sensor_bindings` remain separate settings. MuJoCo accepts only the completed `SceneCfg`; -it neither selects an environment/robot pair nor assembles the scene or queries a training registry. -Programmatic `SimulationRuntimeConfig.scene` receives the same complete scene with the robot declared only in `scene.objs.robot`. - -Placement has one source: `RobotCfg.translation` (Vec3) and `rotation` (xyzw) are attachment transforms that compose once -with the model's intrinsic base pose, not absolute world root poses. Go2's intrinsic base height is 0.445 m; the flat -recipe's -0.114 m offset gives 0.331 m, and the rough recipe's -0.025 m offset gives 0.42 m with identity rotation. -The runtime preserves these transforms on its copied scene. `mj_resetData` restores the compiled `model.qpos0`, including -the composed root placement; initialization overrides only articulation joints with the bound `RobotSpec` key pose. - -For an external world plugin, declare a zero-argument `SceneCfg` factory in the `motrix_deploy.envs` entry-point group. -`motrix_deploy.env.available_deploy_envs()` lists installed IDs without loading factories; -`create_deploy_env(id)` loads only the selected factory and requires `scene.objs.robot` to be empty. -The core assembly helper inserts the robot selected by the existing robot registry; no generic scene-factory registry -or Hydra scene instantiation is involved. The CLI consumes `deploy_env_id`, `robot_id`, and optional -`robot_translation` / `robot_rotation`, applying attachment overrides to `scene.objs.robot.translation` / `.rotation` -before passing the ready scene to the simulation plugin. These application options are not runtime backend fields. - -`SimulationRuntimeConfig` owns scene, rendering, realtime pacing, and state-source settings. -Its `physics` field uses the shared `motrix_env_core.config.sim.SimCfg` for `dt`, -`solver_iterations`, `solver_tolerance`, and `gravity`, defaulting to -`SimCfg(dt=0.002, solver_iterations=100)`. Both backend compilers consume this field directly: -optional solver/gravity fields set to `None` preserve model-source values; explicit values override them. -The YAML layout remains `runtime.physics`, independent of scene and state sensors. -Set physics values before runtime construction: the runtime reads the shared `SimCfg` used for -compilation; changing `dt` after compilation is not a supported runtime retuning workflow. - -Programmatic applications use the same helper and pass its result to `SimulationRuntimeConfig`: +`runtime.physics` uses the shared `SimCfg` (`dt`, `solver_iterations`, `solver_tolerance`, `gravity`, defaulting to +`dt=0.002, solver_iterations=100`); optional fields set to `None` preserve model-source values. Set physics values +before runtime construction — changing `dt` after compilation is not supported. + +`runtime.sensor_bindings` maps state roles to model-local sensor names and supports only `base_angular_velocity`, +`base_linear_acceleration`, and `base_linear_velocity` (`str | None`). MuJoCo requires the angular-velocity and +acceleration bindings; the optional `base_linear_velocity` remains `None` when unbound. + +Programmatic applications assemble the same scene and pass it to `SimulationRuntimeConfig`: ```python from motrix_deploy.env import assemble_deploy_scene @@ -251,54 +251,44 @@ config = SimulationRuntimeConfig( ) ``` -`SimulationRuntimeConfig.sensor_bindings` uses the frozen `SensorBindings` dataclass, -not a Python dictionary. It supports only `base_angular_velocity`, -`base_linear_acceleration`, and `base_linear_velocity`, each `str | None` with a -`None` default. Names must be nonempty and contain a nonwhitespace character; -unknown roles and non-string values are rejected. YAML `runtime.sensor_bindings` -keeps the same mapping keys and is converted with `SensorBindings(**mapping)` -at the configuration boundary. An absent field or explicit `None` means no binding; -MuJoCo rejects either for its three required roles when opening the robot. -The backend still checks sensor existence, type, dimension, and frame; it does not -synthesize state for other roles or bind every `RobotState` field to a sensor. +Additional worlds come from installed plugins: declare a zero-argument `SceneCfg` factory in the +`motrix_deploy.envs` entry-point group, and `motrix_deploy.env.available_deploy_envs()` lists the installed IDs. -### Assemble the runtime and controller explicitly +### Assemble the runtime and task explicitly -The runtime factory selects the backend and prepares `runtime.robot`; its bound -`RobotSpec` is available before `open()`. The application creates the task, policy, -and command binding, then constructs and binds the control session. Using the -`config` above and your application-owned `task`, `policy`, and `command_binding`: +The runtime factory selects the backend and prepares `runtime.robot`; its `RobotSpec` is available before `open()`. +Load the model externally, then construct and bind the session. Using the `config` above and your application-owned +`task_spec`, `model`, and Go2 `command_binding`: ```python from motrix_deploy.runtime.control import ControlSession from motrix_deploy.runtime.factory import create_simulation_runtime +from motrix_deploy.task import create_task runtime = create_simulation_runtime("mujoco", config) robot = runtime.robot -control = ControlSession( +task = create_task(task_spec, robot.spec, model, steps=50) +session = ControlSession( robot=robot, - task=task, - policy=policy, + controller=task, command_binding=command_binding, period_s=0.02, + state_timeout_s=0.1, ) -runtime.bind_control_session(control) +runtime.bind_session(session) with runtime: - result = runtime.run(steps=50) + result = runtime.run() ``` -Construct a robot-dependent task from `robot.spec` after runtime creation. Simulation -runtimes derive `RobotSpec` only from the scene; they do not accept an external spec. -For artifact deployment, the CLI validates the artifact's robot contract against -`runtime.robot.spec` before assembling control. -`ControlSession.period_s` is the single control-period setting; `SimulationRuntimeConfig` -does not duplicate it. The simulation runtime validates it against the physics timestep -when binding or resolving the session. Runtime creation does not accept controller-building callbacks. The runtime context owns -world resources and simulation advancement; `ControlSession` owns shared control -execution, and `RobotInterface` owns robot I/O without advancing or closing the world. -Hardware applications use `create_hardware_runtime(name, config, context)` followed -by the same explicit construction and binding. Direct callers can also supply a -session to `runtime.run(control, steps=...)`. +`create_task(spec, robot, policy, steps=None)` resolves the concrete task class from the spec's task name; tasks that +reference artifact payloads (such as the G1 motion NPZ) receive the artifact through the same call. The control period +must be an integer multiple of the physics timestep. `command_binding` defaults to `None`: autonomous tasks like the +G1 dance omit it, while Go2 walking requires an externally assembled velocity binding whose values the task validates +against its velocity bounds. Hardware applications use `create_hardware_runtime(name, config, context)` and the same +session assembly. + +`runtime.run()` returns a rollout result with the success flag, exit reason, completed model steps, wall time, and +latency statistics; simulation runs additionally report `real_time_factor`. ### Select native MotrixSim deployment @@ -312,19 +302,16 @@ motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy \ The same override works for `task=go2-walk-rough/sim`; no duplicated task recipe is needed. Programmatic applications call `create_simulation_runtime("motrixsim", config)` -and follow the explicit session-binding sequence above. The Go2 state mappings remain +and follow the explicit session-assembly sequence above. The Go2 state mappings remain `gyro`, `accelerometer`, and `global_linvel`: native sensors validate local angular -velocity/acceleration and world-frame linear velocity. The runtime owns native MSD -compilation, model/data, reset, physics, and optional SDK `RenderApp` rendering, -not a MuJoCo runtime or training environment. Removing `runtime.viewer=false` enables the +velocity/acceleration and world-frame linear velocity. Removing `runtime.viewer=false` enables the native viewer and its keyboard provider in a working graphical environment. For the programmatic ONNX example, run `python examples/deploy_to_sim.py --backend motrixsim --headless --steps 50` with a matching ONNX policy; see the example's policy-file options. This path loads raw ONNX, not a `.deploy` manifest: task preprocessing, tensor specs, and control settings are explicit -in the Python example and must match the model. Its scene and controller are shared -with the default MuJoCo path. Headless uses a zero-velocity command; windowed mode uses +in the Python example and must match the model. Headless uses a zero-velocity command; windowed mode uses the viewer keyboard provider when available. ### Use an external Hydra config diff --git a/docs/source/zh_CN/user_guide/envs/index.md b/docs/source/zh_CN/user_guide/envs/index.md index 65ed6f0f..146fc909 100644 --- a/docs/source/zh_CN/user_guide/envs/index.md +++ b/docs/source/zh_CN/user_guide/envs/index.md @@ -58,7 +58,8 @@ python scripts/view.py env= | g1-29dof-wbt-largebox | `g1-29dof-wbt-largebox` | 让 Unitree G1 跟踪搬运大箱子的参考动作。 | `motrix.fastsac` | | g1-walk-flat | `g1-walk-flat` | 控制 Unitree G1 在平地上跟踪行走指令。 | `motrix.fastsac` | | g1-walk-rough | `g1-walk-rough` | 控制 Unitree G1 在起伏地形上跟踪行走指令。 | `motrix.fastsac` | -| g1-wbt-dance | `g1-wbt-dance` | 让 Unitree G1 跟踪内置舞蹈参考动作。 | `motrix.fastsac` | +| g1-wbt-backflip | `g1-wbt-backflip` | 让 Unitree G1 跟踪内置后空翻参考动作。 | `motrix.fastsac` | +| g1-wbt-dance | `g1-wbt-dance` | 让 Unitree G1 在 dance 语料目录上做全身跟踪;目录内一个 clip | `motrix.fastsac` | | go1-stairs-terrain-walk | `go1-stairs-terrain-walk` | 控制 Unitree Go1 在台阶地形上行走。 | `rslrl.ppo`, `skrl.ppo` | | go1-walk-flat | `go1-walk-flat` | 控制 Unitree Go1 在平地上跟踪行走指令。 | `rslrl.ppo`, `skrl.ppo` | | go1-walk-rough | `go1-walk-rough` | 控制 Unitree Go1 在程序化粗糙高度场上跟踪行走指令。 | `rslrl.ppo`, `skrl.ppo` | diff --git a/docs/source/zh_CN/user_guide/tutorial/advanced/input_devices_and_bindings.md b/docs/source/zh_CN/user_guide/tutorial/advanced/input_devices_and_bindings.md index 615fac54..52b230b3 100644 --- a/docs/source/zh_CN/user_guide/tutorial/advanced/input_devices_and_bindings.md +++ b/docs/source/zh_CN/user_guide/tutorial/advanced/input_devices_and_bindings.md @@ -27,9 +27,16 @@ input_devices_and_bindings/extending InputDevice、Binding 与 backend-neutral task command 控制链路 ``` -`ControlSession` 组合 binding、任务、策略和 `RobotInterface`,读取指令、构造任务观察、运行策略,并写入 -`RobotCommand`。仿真运行时推进物理并管理 viewer;硬件运行时根据实时机器人状态调度控制。 -两者使用相同的任务指令语义。 +Policy 表示 observation → action:`Policy` 执行模型。Controller 表示机器人状态与控制输入 +→ `RobotCommand`。`DeployTask` 是完整任务 Controller,执行层级为 Runtime → ControlSession → DeployTask → phase controllers。 + +ControlSession 读取可选 binding(自主运行时直接使用 `None`),构造 `ControlContext`,再调用 +`task.step(state, context)`。Task 按自身需求编排准备、模型执行与正常停止;其 `PolicyController` +使用 `PolicyProcessor` 适配器进行 observation 处理、推理与动作转换,不持有机器人/backend handle, +也不反向引用完整 task。ControlSession 写入 `ControllerStep.command`,负责 open/enable、状态校验、 +health、清理和统计;Runtime 负责会话调度与宿主生命周期,只有 SimulationRuntime 负责 physics/viewer +与仿真世界资源。硬件沿同一路径处理实测状态;ControlSession 与 Runtime 均不解释 task 阶段。 +故障绕过正常 task 停止阶段,立即执行 backend fallback。 仿真和真机可以选择各自合适的具体 device。例如,仿真使用 GLFW keyboard,真机使用遥控器或网络输入;两端 复用同一个 binding 和任务指令语义。 @@ -51,29 +58,10 @@ InputDevice、Binding 与 backend-neutral task command 控制链路 ## Binding 如何进入 Task -运行时通过 `CommandBinding` 获取强类型任务指令: - -```python -from motrix_deploy.runtime.context import PolicyContext - -command = command_binding.read_command(batch_size=1) -context = PolicyContext( - step=step, - elapsed_time_s=elapsed_time_s, - command=command, -) -task.validate_command(context.command) -observation = task.build_observation(state, context) -``` - -部署的机器人 I/O 边界 `RobotInterface` 与可选的 `KeyboardDeviceProvider` / `GamePadDeviceProvider` -capability protocol 定义在 `motrix_deploy.robot.interface`,使用方从该模块导入。provider 提供由自身管理生命周期的 -输入设备,不负责 runtime 插件发现。runtime discovery 仍由 `motrix_deploy.runtime.factory` 通过 -`motrix_deploy.backends` 完成,recipe 仍用 `runtime.backend` 选择插件。 -准备好的 `runtime.robot` 在打开前即可使用。应用显式构造 -`ControlSession(robot=runtime.robot, command_binding=binding, ...)`, -通过 `runtime.bind_control_session(control)` 绑定,再在 `with runtime` 内运行。 -Factory 不通过回调构造 binding 或控制器。 +训练环境中,环境在每个 step 前通过 binding 读取一个指令 batch,交给任务构造观察。部署时,`ControlSession` +持有同一个可选的 `CommandBinding`(自主任务直接传 `None`),把读到的指令放入 `ControlContext.command` +传给任务——两侧消费的是同一种强类型指令。session 与 runtime 的完整组装见 +{doc}`部署教程 `。 例如 MuJoCo deployment 从 runtime 的 `KeyboardDeviceProvider` 取得 `MujocoKeyboardDevice`,再创建 `KeyboardPlanarVelocityBinding`。训练环境则可以为同一个 `PlanarVelocityCommand` 使用 random binding。两条路径最终 diff --git a/docs/source/zh_CN/user_guide/tutorial/advanced/motrix_deploy.md b/docs/source/zh_CN/user_guide/tutorial/advanced/motrix_deploy.md index e9723ec7..523f1b2a 100644 --- a/docs/source/zh_CN/user_guide/tutorial/advanced/motrix_deploy.md +++ b/docs/source/zh_CN/user_guide/tutorial/advanced/motrix_deploy.md @@ -30,7 +30,16 @@ motrix-deploy inspect artifact=artifacts/go2-walk-flat.deploy 导出会选择最近一次 run,并创建 `artifacts/go2-walk-flat.deploy/`。用 `run=` 替代 `env` 可选择指定 run, `output=` 可更改输出位置。已有 artifact 目录不会被覆盖。确认检查结果为 `valid: true`。 -artifact 包含 ONNX 策略、机器人与控制设置,以及任务规格。部署还需要安装 `motrix_deploy_tasks` 插件,提供行走任务实现、 +artifact 目录自包含: + +```text +go2-walk-flat.deploy/ +├── manifest.json # 机器人/控制/任务设置与 payload 校验和 +├── policy/model.onnx # 导出的 actor(含输入归一化) +└── task/ # 任务自有 payload(例如 G1 的 motion NPZ) +``` + +部署还需要安装 `motrix_deploy_tasks` 插件,提供行走任务实现、 部署场景和 Hydra 配方,以及目标对应的运行时插件。配方安装在插件中,在仓库外运行也不需要 workspace 配置路径。 任务 defaults 选择 Hydra 运行时组(`sim` 或 `hardware`),无需另行覆盖运行时组。 顶层公共设置为 `artifact`、`duration_s` 和 `command`。所有目标专用设置直接位于 `runtime` 下; @@ -63,9 +72,9 @@ motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy python examples/deploy_to_sim.py --headless --steps 100 ``` -它通过 `create_simulation_runtime` 创建 MuJoCo 运行时,用 `runtime.bind_control_session(control)` 连接 -`ControlSession`,并在 `with runtime:` 中运行。控制会话负责输入、观察、推理和机器人指令;运行时负责物理推进、 -调度和 viewer。直接使用 ONNX 文件时需要显式指定任务预处理和动作设置;artifact 则为 CLI 携带这些设置。 +示例在外部加载模型并注入 task;task 计算机器人命令,control session 负责机器人 I/O 与执行统计, +runtime 负责物理推进、调度与 viewer。[进阶的显式组装](#显式组装-runtime-与任务)一节逐步展示同样的组合方式。 +直接使用 ONNX 文件时需要显式指定任务预处理和动作设置;artifact 则为 CLI 携带这些设置。 ### 选择原生 MotrixSim @@ -116,12 +125,41 @@ motrix-deploy-unitree joint-control enp5s0 FL_thigh_joint 0.9 \ 该工具使用 artifact 中的机器人、增益、时序和限位设置。等待 Start 和 A 后,移动关节、保持、返回默认姿态, 最后以阻尼模式关闭。 -## 进阶说明 +## 部署 G1 WBT 舞蹈 + +G1 全身跟踪舞蹈任务使用同样的导出 → artifact → `motrix-deploy` 流程。artifact 内嵌伺服增益、action scale、 +preparation 增益与时序、安全阈值以及完整的 motion 片段(以 `payloads/motion.npz` payload 形式,校验和记录在 +manifest 中),部署既不需要 Torch 也不需要 RL 环境。导出需要训练 provider 与任务环境包,但**不**执行训练: + +```bash +source .venv/bin/activate +RUN=runs/g1-wbt-dance/motrix/torch/fastsac/ +python scripts/export_deploy.py run="$RUN" \ + output=artifacts/g1-wbt-dance-software-pd.deploy validation.atol=3e-5 + +motrix-deploy task=g1-wbt-dance/sim artifact=artifacts/g1-wbt-dance.deploy +``` + +无窗口验证与 artifact 检查: + +```bash +motrix-deploy task=g1-wbt-dance/sim artifact=artifacts/g1-wbt-dance.deploy \ + runtime.viewer=false +motrix-deploy inspect artifact=artifacts/g1-wbt-dance.deploy +``` + +默认时长来自内嵌的 motion 片段;更短的运行用 `duration_s` 缩短,超长时长会在打开 backend 前被拒绝, +不会循环或保持。无需速度指令:motion 由 artifact 持有。同一 artifact 可运行在 MuJoCo 与 MotrixSim +(`runtime.backend=motrixsim`,配合训练预算使用 `runtime.physics.solver_iterations=3`)。 +它不是真机部署 recipe:当前 Unitree 传输仅支持 Go2,且 sim2sim 成功不代表真机安全。 -Artifact 检查通过 `motrix_deploy.tasks` 解析版本化 task 类并校验其 Pydantic `spec_type`, -不构造 task,也不 import 训练环境或仿真后端。JSON wire format 保持 `{name, config}`。 -Python 使用 `spec.kp`、`spec.action_scale` 等直接属性;action scale 与上下界是规范关节顺序的向量。 -Policy action 上下界先于缩放和默认姿态偏移生效;机器人 position limits 约束最终关节目标。 +任务按真实部署实践编排四个阶段:`prepare`(实测关节 ramp 到默认站立位,就绪门连续满足)、`policy_hold`、 +`playback` 与 `damping`。默认就绪后自动接管;程序化应用可用 `automatic_start=False`、请求方法或附加键盘 +(`p` 启动 policy、`m` 提前启动 motion、`o` 停止)手动分步。注意舞蹈以后倾姿态结束,该姿态只有跟踪中的 +policy 能维持平衡:播放预算完成后 task 直接进入实测 damping 收尾,若要以站立收场,应让 motion 本身以 +站立姿态结束。 + +## 进阶说明 ### 从 YAML 加载 task spec @@ -139,33 +177,15 @@ spec = Go2WalkTaskSpec.model_validate(OmegaConf.to_container(cfg, resolve=True)) `Go2WalkTaskSpec` 使用字段约束和 model validator 校验关节向量长度及上下界顺序,无需单独调用 `validate()`。 完整 deployment manifest 应通过 artifact reader 读取。 -### 启动与数组校验 - -`RobotInterface.enable()` 不接收初始命令。Unitree 自行过渡到 `RobotSpec.default_joint_position`, -目标速度和 feedforward torque 为零,使用解析后的启动增益。`runtime.kp` / `runtime.kd` 覆盖 artifact 增益; -`null` 保留 artifact 增益。启动不通过 task `process_action()` 转换零动作。 -初始状态 safety 与 task termination 检查仍先于 enable,之后重新检查新状态;Start/A 门控不变。 - -`DeployTask` 不声明 `observation_size` 或 `action_size`。policy 输入边界校验实际 observation, -task action 转换边界校验实际 policy 输出。CLI 组装不提前比较 task 维度。manifest tensor specs -保持模型元数据;`DeploymentProfile` 维度仅用于导出时与编译环境交叉校验。 - ### 真机传感器与电机接线 `motrix_deploy_unitree.hardware.UnitreeGo2HardwareCfg` 独立持有不依赖资产的硬件姿态与接线。 `HardwareSensorBinding` 映射 SDK IMU 字段,包括将 `wxyz` 四元数转换为规范 `xyzw`; -`UnitreeMotorBinding` 将规范关节名映射到 SDK 电机索引。这些定义属于硬件插件的 `sensor` 和 -`actuation` 模块,而不是仿真机器人模型。artifact 仍拥有策略关节顺序、默认姿态和限幅。 -导入硬件配置不会提前加载模型资产、仿真器或 SDK,也不伪造 base position 或 linear velocity。 +`UnitreeMotorBinding` 将规范关节名映射到 SDK 电机索引。artifact 仍拥有策略关节顺序、默认姿态和限幅。 ### 选择部署世界 通过 `runtime.deploy_env_id` 选择世界,通过现有 registry ID `runtime.robot_id` 选择机器人。 -CLI 调用 `motrix_deploy.env.assemble_deploy_scene(deploy_env_id, robot_id)`:创建无机器人世界, -通过 `motrix_env_core.registry.make_robot_config(robot_id)` 填入 `scene.objs.robot`。 -core registry 惰性发现已安装的 `motrix_env_core.robots` entry points,训练与部署复用同一机制。部署世界 `flat` 和 `rough` 位于独立的 -`motrix_deploy_tasks.envs` 模块,使用 core 地面/高度场配置,不 import 训练任务、机器人模型或训练 contact 配置。 - 保留同一 Go2 recipe 和 artifact,仅切换世界: ```bash @@ -175,6 +195,9 @@ motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy \ 仅覆写世界不会改变机器人 attachment placement。新地形需要不同净空时应调整 `runtime.robot_translation`; 完整的 `task=go2-walk-rough/sim` recipe 自带对应的 attachment 默认值。 +`RobotCfg.translation`/`rotation` 是与模型固有 base pose 组合一次的 attachment transform: +Go2 固有 base 高度为 0.445 m,identity rotation 下,平地 recipe 的 -0.114 m 偏移得到 0.331 m, +粗糙地形 recipe 的 -0.025 m 偏移得到 0.42 m。 已安装的平地 recipe 使用 ID 选择世界和机器人: @@ -188,32 +211,15 @@ runtime: robot_rotation: [0.0, 0.0, 0.0, 1.0] ``` -`runtime.physics` 与 `runtime.sensor_bindings` 仍是独立设置。MuJoCo 只接收完整 `SceneCfg`, -不选择环境/机器人组合,不组装场景,也不查询训练 registry。程序化 `SimulationRuntimeConfig.scene` 接收同一个完整场景, -机器人只在 `scene.objs.robot` 中声明一次。 - -Placement 只有一个来源:`RobotCfg.translation`(Vec3)与 `rotation`(xyzw)是 attachment transform, -与模型固有 base pose 组合一次,并非绝对世界 root 位姿。Go2 固有 base 高度为 0.445 m;identity rotation 下, -平地 recipe 的 -0.114 m 偏移得到 0.331 m,粗糙地形 recipe 的 -0.025 m 偏移得到 0.42 m。 -runtime 在复制的场景中保留这些变换。`mj_resetData` 恢复编译后的 `model.qpos0`,包括组合后的 root placement; -初始化只用绑定 `RobotSpec` 的关键姿态覆写 articulation 关节。 - -外部世界插件在 `motrix_deploy.envs` entry-point group 中声明零参数 `SceneCfg` factory。 -`motrix_deploy.env.available_deploy_envs()` 无需加载 factory 即可列出已安装 ID; -`create_deploy_env(id)` 只加载选中的 factory,并要求 `scene.objs.robot` 为空。 -core 组装 helper 添加由现有 robot registry 选择的机器人;不引入通用 scene-factory registry,也不通过 -Hydra 实例化场景。CLI 消费 `deploy_env_id`、`robot_id` 与可选 `robot_translation` / `robot_rotation`, -把 attachment overrides 写入 `scene.objs.robot.translation` / `.rotation` 后,再把完整场景传给仿真插件。 -这些应用层选项不是 runtime backend 字段。 - -`SimulationRuntimeConfig` 负责场景、渲染、实时节奏与状态来源设置;其 `physics` 字段使用共享的 -`motrix_env_core.config.sim.SimCfg` 配置 `dt`、`solver_iterations`、`solver_tolerance` 与 `gravity`, -默认值为 `SimCfg(dt=0.002, solver_iterations=100)`。两个 backend compiler 直接消费该字段: -可选 solver/gravity 字段为 `None` 时保留模型来源中的值,显式配置则覆盖。 -YAML 仍使用 `runtime.physics`,与场景、state sensors 保持独立。 -物理参数应在 runtime 构造前设置:runtime 读取编译使用的共享 `SimCfg`;不支持编译后修改 `dt` 来动态调参。 - -程序化应用使用同一 helper,并把结果传给 `SimulationRuntimeConfig`: +`runtime.physics` 使用共享的 `SimCfg`(`dt`、`solver_iterations`、`solver_tolerance`、`gravity`, +默认 `dt=0.002, solver_iterations=100`);可选字段设为 `None` 时保留模型来源中的值。 +物理参数应在 runtime 构造前设置——不支持编译后修改 `dt` 动态调参。 + +`runtime.sensor_bindings` 把状态角色映射到模型内 sensor 名称,只支持 `base_angular_velocity`、 +`base_linear_acceleration` 与 `base_linear_velocity`(`str | None`)。MuJoCo 要求绑定角速度和加速度; +可选的 `base_linear_velocity` 未绑定时保持 `None`。 + +程序化应用组装同一场景并传给 `SimulationRuntimeConfig`: ```python from motrix_deploy.env import assemble_deploy_scene @@ -234,48 +240,42 @@ config = SimulationRuntimeConfig( ) ``` -`SimulationRuntimeConfig.sensor_bindings` 使用 frozen dataclass `SensorBindings`, -而非 Python 字典。它只支持 `base_angular_velocity`、`base_linear_acceleration` 与 -`base_linear_velocity`,类型均为 `str | None`,默认为 `None`。名称必须非空且至少包含 -一个非空白字符;未知角色与非字符串值均被拒绝。YAML `runtime.sensor_bindings` 保留同样的 -映射键,在配置边界通过 `SensorBindings(**mapping)` 转换。字段缺省或显式 `None` 表示 -没有绑定;MuJoCo 在打开机器人时会拒绝这三个必需角色的任一种未绑定状态。 -Backend 仍校验 sensor 是否存在、类型、维度与坐标系;不会为其他角色合成状态, -也不是每个 `RobotState` 字段都通过 sensor 绑定。 +更多世界来自已安装的插件:在 `motrix_deploy.envs` entry-point group 中声明零参数 `SceneCfg` factory, +`motrix_deploy.env.available_deploy_envs()` 可列出已安装 ID。 -### 显式组装 runtime 与控制器 +### 显式组装 runtime 与任务 -Runtime factory 选择 backend 并准备 `runtime.robot`;绑定的 `RobotSpec` 在 `open()` 之前即可读取。 -应用自行创建 task、policy 与 command binding,再显式构造并绑定 control session。 -沿用上面的 `config` 以及应用持有的 `task`、`policy`、`command_binding`: +Runtime factory 选择 backend 并准备 `runtime.robot`;`RobotSpec` 在 `open()` 前即可读取。 +在外部加载模型,然后构造并绑定 session。沿用上面的 `config` 以及应用持有的 +`task_spec`、`model` 与 Go2 `command_binding`: ```python from motrix_deploy.runtime.control import ControlSession from motrix_deploy.runtime.factory import create_simulation_runtime +from motrix_deploy.task import create_task runtime = create_simulation_runtime("mujoco", config) robot = runtime.robot -control = ControlSession( +task = create_task(task_spec, robot.spec, model, steps=50) +session = ControlSession( robot=robot, - task=task, - policy=policy, + controller=task, command_binding=command_binding, period_s=0.02, + state_timeout_s=0.1, ) -runtime.bind_control_session(control) +runtime.bind_session(session) with runtime: - result = runtime.run(steps=50) + result = runtime.run() ``` -依赖机器人契约的 task 应在 runtime 创建后从 `robot.spec` 构造。仿真 runtime 只从 scene 派生 -`RobotSpec`,不接收外部 spec。Artifact 部署由 CLI 在组装 control 前,将 artifact 的机器人契约 -与 `runtime.robot.spec` 对照校验。 -`ControlSession.period_s` 是控制周期的 -唯一配置位置,`SimulationRuntimeConfig` 不重复声明;仿真 runtime 在绑定或解析 session 时校验该周期与 physics timestep -的关系。Runtime 创建不接收控制器构造回调。 -Runtime context 持有世界资源并推进仿真;`ControlSession` 执行共享控制逻辑;`RobotInterface` -负责机器人 I/O,不推进或关闭世界。硬件应用先调用 `create_hardware_runtime(name, config, context)`, -再使用同样的显式构造与绑定流程。直接调用方也可向 `runtime.run(control, steps=...)` 传入 session。 +`create_task(spec, robot, policy, steps=None)` 根据 spec 的任务名解析具体 task class;引用 artifact payload 的 +任务(例如 G1 的 motion NPZ)也通过同一调用获得 artifact。控制周期必须是 physics timestep 的整数倍。 +`command_binding` 默认值为 `None`:G1 舞蹈这类自主任务可省略,Go2 行走则需要外部组装速度 binding, +其值由 task 按速度上下界校验。硬件应用使用 `create_hardware_runtime(name, config, context)` 并按同样方式组装 session。 + +`runtime.run()` 返回 rollout 结果,包含成功标志、退出原因、模型完成步数、墙钟耗时与延迟统计; +仿真运行额外报告 `real_time_factor`。 ### 选择原生 MotrixSim 部署 @@ -288,10 +288,9 @@ motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy \ ``` 同样的 override 适用于 `task=go2-walk-rough/sim`,无需复制 task recipe。程序化应用调用 -`create_simulation_runtime("motrixsim", config)`,然后沿用上面的显式 session 绑定流程。 +`create_simulation_runtime("motrixsim", config)`,然后沿用上面的显式 session 组装流程。 Go2 state mappings 仍为 `gyro`、`accelerometer` 与 `global_linvel`:原生 sensor 校验 local angular -velocity/acceleration 与 world-frame linear velocity。Runtime 持有原生 MSD 编译、model/data、reset、physics -与可选 SDK `RenderApp` 渲染,不创建 MuJoCo runtime 或训练环境。在可用的图形环境中移除 `runtime.viewer=false` +velocity/acceleration 与 world-frame linear velocity。在可用的图形环境中移除 `runtime.viewer=false` 即可启用原生 viewer 与其 keyboard provider。 程序化 ONNX 示例可运行 diff --git a/examples/deploy_to_sim.py b/examples/deploy_to_sim.py index 4ad990ca..0f92627c 100644 --- a/examples/deploy_to_sim.py +++ b/examples/deploy_to_sim.py @@ -1,7 +1,7 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Programmatically assemble a Go2 scene, walking task, ONNX policy and control session.""" +"""Programmatically assemble a Go2 scene, walking task, ONNX model and robot controller.""" import argparse import json @@ -10,12 +10,12 @@ from motrix_robots.unitree import UnitreeGo2Robot from motrix_deploy.contracts import TensorSpec -from motrix_deploy.policy import OnnxPolicyRuntime +from motrix_deploy.policy import OnnxPolicy from motrix_deploy.robot.interface import KeyboardDeviceProvider from motrix_deploy.runtime.config import SensorBindings, SimulationRuntimeConfig from motrix_deploy.runtime.control import ControlSession from motrix_deploy.runtime.factory import create_simulation_runtime -from motrix_deploy_tasks.tasks.go2_walk import Go2WalkDeployTaskV1, Go2WalkTaskSpec +from motrix_deploy_tasks.tasks.go2_walk import Go2WalkDeployTask, Go2WalkTaskSpec from motrix_env_core.config import configclass from motrix_env_core.config.scene import FlatTerrainCfg, SceneCfg, SceneObjsCfg, SceneVisualCfg, SystemCameraCfg from motrix_env_core.config.scene.light import LightCfg @@ -39,14 +39,14 @@ def main() -> int: "--backend", choices=("mujoco", "motrixsim"), default="mujoco", help="Simulation runtime plugin" ) parser.add_argument("--headless", action="store_true", help="No window; run fixed-step without wall-clock pacing") - parser.add_argument("--steps", type=int, help="Headless control ticks; GUI mode runs until the window closes") + parser.add_argument("--steps", type=int, help="Headless session ticks; GUI mode runs until the window closes") args = parser.parse_args() if args.headless and (args.steps is None or args.steps <= 0): parser.error("--steps must be a positive integer in --headless mode") if not args.headless and args.steps is not None: parser.error("--steps is only valid in --headless mode; GUI mode runs until the window closes") - policy = OnnxPolicyRuntime( + model = OnnxPolicy( POLICY_PATH, input_spec=TensorSpec(name="obs", shape=(1, 49)), output_spec=TensorSpec(name="actions", shape=(1, 12)), @@ -82,10 +82,10 @@ def main() -> int: runtime = create_simulation_runtime(args.backend, config) robot = runtime.robot - # Explicit preprocessing/action semantics for this walking policy. These must + # Explicit preprocessing/action semantics for this walking controller. These must # match its training configuration; a raw ONNX file does not describe them. action_scale = 0.25 - task = Go2WalkDeployTaskV1( + task = Go2WalkDeployTask( Go2WalkTaskSpec( action_scale=[action_scale] * robot.spec.joint_count, kp=[35.0] * robot.spec.joint_count, @@ -99,9 +99,10 @@ def main() -> int: gait_frequency_hz=2.0, standing_threshold=0.05, termination_min_up_z=0.5, - termination_min_base_height=None, ), robot.spec, + model, + steps=args.steps, ) if not args.headless and isinstance(runtime, KeyboardDeviceProvider): command_binding = KeyboardPlanarVelocityBinding( @@ -112,17 +113,13 @@ def main() -> int: else: command_binding = ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)) task.validate_command(command_binding.read_command()) - control = ControlSession( - robot=robot, - task=task, - policy=policy, - command_binding=command_binding, - period_s=0.02, - state_timeout_s=0.1, + period_s = 0.02 + session = ControlSession( + controller=task, robot=robot, command_binding=command_binding, period_s=period_s, state_timeout_s=0.1 ) - runtime.bind_control_session(control) + runtime.bind_session(session) with runtime: - result = runtime.run(steps=args.steps) + result = runtime.run() print(json.dumps(result.to_dict(), indent=2, sort_keys=True)) return 0 if result.success else 1 diff --git a/motrix_deploy/src/motrix_deploy/artifact/io.py b/motrix_deploy/src/motrix_deploy/artifact/io.py index d06500bf..83d00e03 100644 --- a/motrix_deploy/src/motrix_deploy/artifact/io.py +++ b/motrix_deploy/src/motrix_deploy/artifact/io.py @@ -72,20 +72,25 @@ def write_artifact( parent = target.parent parent.mkdir(parents=True, exist_ok=True) expected_path = _safe_relative_path(manifest.policy.payload_path, field_path="policy.payload_path") - if set(payloads) != {str(expected_path)}: - raise ArtifactError(f"payload keys must be exactly [{str(expected_path)!r}], got {sorted(payloads)!r}") - payload = payloads[str(expected_path)] - if not isinstance(payload, bytes): - raise ArtifactError(f"payload {expected_path} must be bytes") - digest = sha256_bytes(payload) - if digest != manifest.policy.sha256: - raise ArtifactError(f"policy.sha256 mismatch while writing: expected {manifest.policy.sha256}, got {digest}") + expected_payloads = {str(expected_path): manifest.policy.sha256} + for payload in manifest.payloads: + relative = _safe_relative_path(payload.path, field_path="payloads.path") + expected_payloads[str(relative)] = payload.sha256 + if set(payloads) != set(expected_payloads): + raise ArtifactError(f"payload keys must be exactly {sorted(expected_payloads)}, got {sorted(payloads)!r}") + for relative, expected_sha in expected_payloads.items(): + if not isinstance(payloads[relative], bytes): + raise ArtifactError(f"payload {relative} must be bytes") + digest = sha256_bytes(payloads[relative]) + if digest != expected_sha: + raise ArtifactError(f"sha256 mismatch for payload {relative}: expected {expected_sha}, got {digest}") staging = Path(tempfile.mkdtemp(prefix=f".{target.name}.staging-", dir=parent)) try: - payload_path = _payload_path(staging, expected_path) - payload_path.parent.mkdir(parents=True, exist_ok=True) - payload_path.write_bytes(payload) + for relative in sorted(expected_payloads): + payload_path = _payload_path(staging, PurePosixPath(relative)) + payload_path.parent.mkdir(parents=True, exist_ok=True) + payload_path.write_bytes(payloads[relative]) manifest_path = staging / MANIFEST_NAME manifest_path.write_text( json.dumps(manifest.to_dict(), indent=2, sort_keys=True, allow_nan=False) + "\n", @@ -111,6 +116,14 @@ def read_artifact(root: str | Path) -> Artifact: except (OSError, UnicodeError, json.JSONDecodeError) as error: raise ArtifactError(f"cannot parse artifact manifest {manifest_path}: {error}") from error manifest = DeploymentManifest.from_dict(raw_manifest) + for payload in manifest.payloads: + relative = _safe_relative_path(payload.path, field_path="payloads.path") + payload_file = _payload_path(artifact_root, relative) + if not payload_file.is_file(): + raise ArtifactError(f"artifact payload is missing: {relative}") + digest = hashlib.sha256(payload_file.read_bytes()).hexdigest() + if digest != payload.sha256: + raise ArtifactError(f"payload sha256 mismatch for {relative}: expected {payload.sha256}, got {digest}") relative = _safe_relative_path(manifest.policy.payload_path, field_path="policy.payload_path") policy_path = _payload_path(artifact_root, relative) if not policy_path.is_file(): diff --git a/motrix_deploy/src/motrix_deploy/artifact/schema.py b/motrix_deploy/src/motrix_deploy/artifact/schema.py index 3f64c6ef..6c5c52f1 100644 --- a/motrix_deploy/src/motrix_deploy/artifact/schema.py +++ b/motrix_deploy/src/motrix_deploy/artifact/schema.py @@ -27,13 +27,14 @@ def _mapping(value: object, path: str) -> Mapping[str, Any]: return value -def _keys(value: Mapping[str, Any], *, path: str, required: set[str]) -> None: +def _keys(value: Mapping[str, Any], *, path: str, required: set[str], optional: set[str] | None = None) -> None: missing = sorted(required - value.keys()) if missing: raise ValidationError(path, f"required fields {sorted(required)}", f"missing {missing}") - unknown = sorted(value.keys() - required) + allowed = required | (optional or set()) + unknown = sorted(value.keys() - allowed) if unknown: - raise ValidationError(path, f"only fields {sorted(required)}", f"unknown {unknown}") + raise ValidationError(path, f"only fields {sorted(allowed)}", f"unknown {unknown}") def _string(value: object, path: str) -> str: @@ -279,6 +280,14 @@ def from_dict(cls, value: object) -> "ControlSpec": return cls(**data) +@dataclass(frozen=True) +class PayloadSpec: + """A task-owned binary payload (e.g. a motion-clip NPZ) with its checksum.""" + + path: str + sha256: str + + @dataclass(frozen=True) class DeploymentManifest: """Top-level deployment manifest with strict v1 component versions.""" @@ -289,6 +298,7 @@ class DeploymentManifest: robot: RobotSpec task: TaskSpec control: ControlSpec + payloads: tuple[PayloadSpec, ...] = () def __post_init__(self) -> None: if self.schema_version != SCHEMA_VERSION: @@ -306,13 +316,19 @@ def to_dict(self) -> dict[str, Any]: "robot": _robot_to_dict(self.robot), "task": self.task.to_dict(), "control": self.control.to_dict(), + "payloads": [payload.__dict__ for payload in self.payloads], } @classmethod def from_dict(cls, value: object) -> "DeploymentManifest": data = _mapping(value, "manifest") required = {"schema_version", "source", "policy", "robot", "task", "control"} - _keys(data, path="manifest", required=required) + _keys(data, path="manifest", required=required, optional={"payloads"}) + payloads = [] + for entry in data.get("payloads", ()): + payload = _mapping(entry, "manifest.payloads") + _keys(payload, path="manifest.payloads", required={"path", "sha256"}) + payloads.append(PayloadSpec(path=payload["path"], sha256=payload["sha256"])) return cls( schema_version=data["schema_version"], source=SourceSpec.from_dict(data["source"]), @@ -320,4 +336,5 @@ def from_dict(cls, value: object) -> "DeploymentManifest": robot=_robot_from_dict(data["robot"]), task=TaskSpec.from_dict(data["task"]), control=ControlSpec.from_dict(data["control"]), + payloads=tuple(payloads), ) diff --git a/motrix_deploy/src/motrix_deploy/cli.py b/motrix_deploy/src/motrix_deploy/cli.py index f1e1bd39..dd054cf3 100644 --- a/motrix_deploy/src/motrix_deploy/cli.py +++ b/motrix_deploy/src/motrix_deploy/cli.py @@ -20,14 +20,14 @@ from motrix_deploy.errors import ArtifactError, ValidationError from motrix_deploy.robot.interface import GamePadDeviceProvider, KeyboardDeviceProvider from motrix_deploy.runtime.config import SimulationRuntimeConfig +from motrix_deploy.runtime.control import ControlSession from motrix_deploy.runtime.factory import RuntimeCreateContext, create_hardware_runtime, create_simulation_runtime -from motrix_deploy.task import create_task +from motrix_deploy.task import create_task, load_task_type def run(cfg: DeployRunConfig) -> int: """Run one deployment rollout from typed application configuration.""" - from motrix_deploy.policy import OnnxPolicyRuntime - from motrix_deploy.runtime.control import ControlSession + from motrix_deploy.policy import OnnxPolicy from motrix_env_core.input import ( BoundedGamePadPlanarVelocityBinding, ConstantPlanarVelocityBinding, @@ -36,8 +36,17 @@ def run(cfg: DeployRunConfig) -> int: artifact = read_artifact(Path(cfg.artifact)) manifest = artifact.manifest - steps = _duration_steps(cfg.duration_s, manifest.control.period_s) - task = create_task(manifest.task, manifest.robot) + task_type = load_task_type(manifest.task.name) + default_duration_s = task_type.default_duration_s(manifest.task) + duration_s = cfg.duration_s if cfg.duration_s is not None else default_duration_s + steps = _duration_steps(duration_s, manifest.control.period_s) + if default_duration_s is not None and duration_s > default_duration_s + 1e-9: + raise ValueError("duration_s exceeds the task's finite playback budget") + task_period = getattr(manifest.task, "period_s", manifest.control.period_s) + if not math.isclose(task_period, manifest.control.period_s, rel_tol=0, abs_tol=1e-9): + raise ValueError("task period_s must equal control.period_s") + policy = OnnxPolicy(artifact.policy_path, manifest.policy.input, manifest.policy.output) + task = create_task(manifest.task, manifest.robot, policy, steps=steps, artifact=artifact) simulation = cfg.runtime["kind"] == "simulation" viewer = cfg.runtime["viewer"] if simulation else False realtime = cfg.runtime["realtime"] if simulation else True @@ -76,13 +85,18 @@ def run(cfg: DeployRunConfig) -> int: except ValidationError: runtime.close() raise + command_binding = None command_lower = getattr(task, "command_lower", None) command_upper = getattr(task, "command_upper", None) - if command_lower is None or command_upper is None: - raise ValueError(f"Task {manifest.task.name!r} does not provide planar velocity command bounds") command_config = cfg.command or {} command_source = command_config.get("source", "constant") - if viewer and isinstance(runtime, KeyboardDeviceProvider): + if command_lower is None and command_upper is None: + if command_config: + raise ValueError("Autonomous task playback does not accept planar velocity commands") + task.validate_command(None) + elif command_lower is None or command_upper is None: + raise ValueError(f"Task {manifest.task.name!r} must provide both velocity bounds") + elif viewer and isinstance(runtime, KeyboardDeviceProvider): command_binding = KeyboardPlanarVelocityBinding( runtime.get_keyboard_device(), command_lower=command_lower, @@ -113,17 +127,16 @@ def run(cfg: DeployRunConfig) -> int: task.validate_command(command_binding.read_command()) else: raise ValueError(f"Unsupported command source {command_source!r}; use gamepad or configure command.velocity") - control = ControlSession( + session = ControlSession( + controller=task, robot=backend, - task=task, - policy=OnnxPolicyRuntime(artifact.policy_path, manifest.policy.input, manifest.policy.output), command_binding=command_binding, period_s=manifest.control.period_s, state_timeout_s=manifest.control.state_timeout_s, ) - runtime.bind_control_session(control) + runtime.bind_session(session) with runtime: - result = runtime.run(steps=steps) + result = runtime.run() print(json.dumps(result.to_dict(), indent=2, sort_keys=True)) return 0 if result.success else 1 diff --git a/motrix_deploy/src/motrix_deploy/contracts.py b/motrix_deploy/src/motrix_deploy/contracts.py index 708a836f..8aabd6a4 100644 --- a/motrix_deploy/src/motrix_deploy/contracts.py +++ b/motrix_deploy/src/motrix_deploy/contracts.py @@ -3,8 +3,7 @@ """Framework-independent deployment data contracts.""" -from collections.abc import Mapping -from dataclasses import dataclass, field +from dataclasses import dataclass from enum import Enum from typing import TypeAlias @@ -130,9 +129,8 @@ class RobotState: base_orientation_xyzw: FloatArray base_angular_velocity: FloatArray base_linear_acceleration: FloatArray - base_position: FloatArray | None = None + # Optional world-frame sensor/estimator output; unavailable backends leave it unset. base_linear_velocity: FloatArray | None = None - extras: Mapping[str, FloatArray] = field(default_factory=dict) def __post_init__(self) -> None: if self.sample_time_ns < 0: @@ -166,8 +164,6 @@ def __post_init__(self) -> None: path="state.base_linear_acceleration", shape=(3,), ) - if self.base_position is not None: - _validate_float32_array(self.base_position, path="state.base_position", shape=(3,)) if self.base_linear_velocity is not None: _validate_float32_array( self.base_linear_velocity, @@ -177,12 +173,6 @@ def __post_init__(self) -> None: norm = np.linalg.norm(self.base_orientation_xyzw) if not np.isclose(norm, 1.0, atol=1e-4): raise ValidationError("state.base_orientation_xyzw", "unit quaternion", norm) - for name, value in self.extras.items(): - if not isinstance(name, str) or not name: - raise ValidationError("state.extras", "non-empty string keys", name) - if not isinstance(value, np.ndarray): - raise ValidationError(f"state.extras.{name}", "a numpy array", type(value).__name__) - _validate_float32_array(value, path=f"state.extras.{name}", shape=value.shape) class JointControlMode(str, Enum): @@ -256,8 +246,8 @@ class RobotCapabilities: Attributes: control_modes: Canonical joint command modes accepted by the backend. - state_fields: ``RobotState`` fields populated by every state sample. - extra_sensors: Additional entries available in ``RobotState.extras``, mapped to their fixed shapes. + state_fields: ``RobotState`` fields supported by the backend, independently of sensor bindings. + Optional fields can be ``None`` in samples when their sensor is not bound. supports_rendering: Whether the backend can present a live viewer. max_command_rate_hz: Highest command update rate accepted by the backend, or ``None`` when unconstrained. requires_enable: Whether ``RobotInterface.enable()`` must complete before policy commands are accepted. @@ -266,7 +256,6 @@ class RobotCapabilities: control_modes: tuple[JointControlMode, ...] state_fields: frozenset[str] - extra_sensors: Mapping[str, tuple[int, ...]] = field(default_factory=dict) supports_rendering: bool = False max_command_rate_hz: float | None = None requires_enable: bool = False @@ -289,11 +278,6 @@ def __post_init__(self) -> None: raise ValidationError("capabilities.max_command_rate_hz", "a positive value", self.max_command_rate_hz) if not self.stop_semantics: raise ValidationError("capabilities.stop_semantics", "a non-empty string", self.stop_semantics) - for name, shape in self.extra_sensors.items(): - if not isinstance(name, str) or not name: - raise ValidationError("capabilities.extra_sensors", "non-empty string keys", name) - if not isinstance(shape, tuple) or any(not isinstance(size, int) or size <= 0 for size in shape): - raise ValidationError(f"capabilities.extra_sensors.{name}", "a tuple of positive dimensions", shape) @dataclass(frozen=True) diff --git a/motrix_deploy/src/motrix_deploy/errors.py b/motrix_deploy/src/motrix_deploy/errors.py index 4ca001b7..74e10987 100644 --- a/motrix_deploy/src/motrix_deploy/errors.py +++ b/motrix_deploy/src/motrix_deploy/errors.py @@ -24,3 +24,9 @@ class EmergencyStopError(RuntimeError): class LieDownRequestedError(RuntimeError): """A physical input requested the backend's configured lie-down shutdown.""" + + +class ControlFailure(RuntimeError): + def __init__(self, reason: str, message: str) -> None: + self.reason = reason + super().__init__(message) diff --git a/motrix_deploy/src/motrix_deploy/policy/__init__.py b/motrix_deploy/src/motrix_deploy/policy/__init__.py index 7d91d05a..58f6ba1c 100644 --- a/motrix_deploy/src/motrix_deploy/policy/__init__.py +++ b/motrix_deploy/src/motrix_deploy/policy/__init__.py @@ -13,7 +13,7 @@ from motrix_deploy.errors import ValidationError -class PolicyRuntime(ABC): +class Policy(ABC): """Decision runtime for a task's vector observation/action interface. Implementations may use networks, planners, or fixed decisions. Tensor names @@ -28,7 +28,7 @@ def infer(self, observation: FloatArray) -> FloatArray: """Infer one unbatched action.""" -class NoOpPolicyRuntime(PolicyRuntime): +class NoOpPolicy(Policy): """Ignore observations and return zero actions; the task defines their meaning. A zero action does not imply zero torque or skipping a command. For example, @@ -36,8 +36,6 @@ class NoOpPolicyRuntime(PolicyRuntime): """ def __init__(self, action_size: int) -> None: - if isinstance(action_size, bool) or not isinstance(action_size, int) or action_size < 0: - raise ValidationError("policy.noop.action_size", "a non-negative integer", action_size) self._action = np.zeros(action_size, dtype=np.float32) def infer(self, observation: FloatArray) -> FloatArray: @@ -45,7 +43,7 @@ def infer(self, observation: FloatArray) -> FloatArray: return self._action.copy() -class OnnxPolicyRuntime(PolicyRuntime): +class OnnxPolicy(Policy): """Single-input, single-output ONNX Runtime policy.""" def __init__( @@ -111,4 +109,4 @@ def infer(self, observation: FloatArray) -> FloatArray: return float32_array(output[0], path="policy.output", shape=(self.output_spec.shape[1],)) -__all__ = ["NoOpPolicyRuntime", "OnnxPolicyRuntime", "PolicyRuntime"] +__all__ = ["NoOpPolicy", "OnnxPolicy", "Policy"] diff --git a/motrix_deploy/src/motrix_deploy/policy/processing.py b/motrix_deploy/src/motrix_deploy/policy/processing.py new file mode 100644 index 00000000..c32dae45 --- /dev/null +++ b/motrix_deploy/src/motrix_deploy/policy/processing.py @@ -0,0 +1,36 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Task-specific preprocessing surrounding observation-to-action inference.""" + +from __future__ import annotations + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Generic, TypeVar + +from motrix_deploy.contracts import FloatArray, RobotCommand, RobotState + +if TYPE_CHECKING: + from motrix_deploy.runtime.context import ControlContext + +CommandT = TypeVar("CommandT") + + +class PolicyProcessor(ABC, Generic[CommandT]): + """Own observation/action history and policy input validity, not task phases.""" + + @abstractmethod + def reset(self, state: RobotState, context: ControlContext[CommandT]) -> None: ... + + @abstractmethod + def build_observation(self, state: RobotState, context: ControlContext[CommandT]) -> FloatArray: ... + + @abstractmethod + def process_action(self, action: FloatArray) -> RobotCommand: ... + + @abstractmethod + def validate_command(self, command: CommandT | None) -> None: ... + + def check_termination(self, state: RobotState) -> str | None: + """Return a policy termination reason, or None when no check is required.""" + return None diff --git a/motrix_deploy/src/motrix_deploy/profile.py b/motrix_deploy/src/motrix_deploy/profile.py index df68d774..7788015e 100644 --- a/motrix_deploy/src/motrix_deploy/profile.py +++ b/motrix_deploy/src/motrix_deploy/profile.py @@ -3,8 +3,8 @@ """Task-agnostic result of compiling one training environment for deployment.""" -from collections.abc import Callable -from dataclasses import dataclass +from collections.abc import Callable, Mapping +from dataclasses import dataclass, field from motrix_deploy.artifact.schema import ControlSpec, TaskSpec from motrix_deploy.contracts import RobotSpec @@ -20,6 +20,8 @@ class DeploymentProfile: # Training-space dimensions used only to validate ONNX export, not serialized in TaskSpec. observation_size: int action_size: int + # Task-owned binary payloads (path -> bytes) written into the artifact next to the policy. + payloads: Mapping[str, bytes] = field(default_factory=dict) ProfileCompiler = Callable[[str], DeploymentProfile] diff --git a/motrix_deploy/src/motrix_deploy/runtime/__init__.py b/motrix_deploy/src/motrix_deploy/runtime/__init__.py index 560dddbf..fcb8e6e0 100644 --- a/motrix_deploy/src/motrix_deploy/runtime/__init__.py +++ b/motrix_deploy/src/motrix_deploy/runtime/__init__.py @@ -5,8 +5,8 @@ from motrix_deploy.runtime.base import DeploymentRuntime, SimulationRuntime from motrix_deploy.runtime.config import SensorBindings, SimulationRuntimeConfig -from motrix_deploy.runtime.context import PolicyContext -from motrix_deploy.runtime.control import ControlSession +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import ControlSession, PolicyController from motrix_deploy.runtime.factory import ( RuntimeCreateContext, create_hardware_runtime, @@ -14,18 +14,23 @@ registered_runtimes, ) from motrix_deploy.runtime.hardware import HardwareRuntime -from motrix_deploy.runtime.result import RolloutResult +from motrix_deploy.runtime.lifecycle import Controller, ControllerStep +from motrix_deploy.runtime.result import RolloutResult, SimulationRolloutResult from motrix_deploy.runtime.scheduler import FixedStepScheduler, LoopScheduler, RealtimeScheduler __all__ = [ "ControlSession", + "PolicyController", + "ControllerStep", + "Controller", "DeploymentRuntime", "FixedStepScheduler", "HardwareRuntime", "LoopScheduler", - "PolicyContext", + "ControlContext", "RealtimeScheduler", "RolloutResult", + "SimulationRolloutResult", "SensorBindings", "SimulationRuntimeConfig", "SimulationRuntime", diff --git a/motrix_deploy/src/motrix_deploy/runtime/base.py b/motrix_deploy/src/motrix_deploy/runtime/base.py index 3fafaef4..3e326d4d 100644 --- a/motrix_deploy/src/motrix_deploy/runtime/base.py +++ b/motrix_deploy/src/motrix_deploy/runtime/base.py @@ -1,66 +1,48 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Deployment runtime lifecycle contracts.""" +"""Runtime resources, scheduling and physics advancement of a bound control session.""" from abc import ABC, abstractmethod +from dataclasses import fields from typing import TYPE_CHECKING from motrix_deploy.errors import ValidationError +from motrix_deploy.runtime.control import ControlSession +from motrix_deploy.runtime.result import RolloutResult, SimulationRolloutResult +from motrix_deploy.runtime.scheduler import LoopScheduler if TYPE_CHECKING: from motrix_deploy.robot.interface import RobotInterface - from motrix_deploy.runtime.control import ControlSession - from motrix_deploy.runtime.result import RolloutResult class DeploymentRuntime(ABC): - """Own runtime resources while a control session owns the robot backend.""" + """Own world resources and scheduling, independent of controller semantics.""" def __init__(self) -> None: self._opened = False - self._control: ControlSession | None = None + self.session: ControlSession | None = None + self._used = False - @property - def control(self) -> "ControlSession | None": - """Control session bound to this runtime, if any.""" - return self._control - - def bind_control_session(self, control: "ControlSession") -> None: - """Bind one control session, rejecting conflicting robot ownership.""" - if control.robot is not self.robot: - raise ValidationError("runtime.control.robot", self.robot, control.robot) - if self._control is not None and self._control is not control: - raise ValidationError("runtime.control", "the already bound control session", control) - self._control = control - - def _resolve_control(self, control: "ControlSession | None") -> "ControlSession": - if control is not None and self.control is not None and control is not self.control: - raise ValidationError("runtime.control", "the already bound control session", control) - resolved = control if control is not None else self.control - if resolved is None: - raise ValidationError("runtime.control", "a supplied or bound control session", None) - if resolved.robot is not self.robot: - raise ValidationError("runtime.robot", "the control session robot", resolved.robot) - return resolved + def bind_session(self, session: ControlSession) -> None: + if self.session is not None and self.session is not session: + raise ValidationError("runtime.session", "the already bound control session", session) + if session.robot is not self.robot: + raise ValidationError("runtime.session.robot", self.robot, session.robot) + self.session = session @property @abstractmethod - def robot(self) -> "RobotInterface": - """Robot interface associated with this runtime.""" - raise NotImplementedError + def robot(self) -> "RobotInterface": ... @property def opened(self) -> bool: - """Whether this runtime lifecycle is open.""" return self._opened def open(self) -> None: - """Open runtime resources; safe to call repeatedly.""" self._opened = True def close(self) -> None: - """Close runtime resources; safe to call repeatedly.""" self._opened = False def __enter__(self) -> "DeploymentRuntime": @@ -68,16 +50,91 @@ def __enter__(self) -> "DeploymentRuntime": return self def __exit__(self, exc_type, exc_value, traceback) -> None: - del exc_type, exc_value, traceback self.close() + def _advance_interval(self) -> None: + """Apply host-specific execution after an accepted command.""" + + def _check_running(self) -> None: + """Check whether the host permits another control interval.""" + + def _run_session(self, scheduler: LoopScheduler) -> RolloutResult: + if self.session is None: + raise ValidationError("runtime.session", "a bound control session", None) + if self._used: + raise ValidationError("runtime.session", "a single-use execution", "already executed") + self._used = True + session = self.session + try: + if session.start(): + scheduler.reset() + interval_step = 0 + while session.active: + self._check_running() + if not session.tick(elapsed_time_s=scheduler.elapsed_time_s(interval_step)): + break + self._advance_interval() + interval_step += 1 + scheduler.wait(interval_step) + except (Exception, KeyboardInterrupt) as error: + session.fail(error) + finally: + session.stop() + return session.result(overrun_count=scheduler.overrun_count) + @abstractmethod - def run(self, control: "ControlSession | None" = None, *, steps: int | None = None) -> "RolloutResult": - """Run a control session and return its structured result.""" + def run(self) -> RolloutResult: ... class SimulationRuntime(DeploymentRuntime, ABC): - """Base for runtimes that own simulation advancement and robot creation.""" + """Runtime that additionally owns simulation advancement and viewer resources.""" + + def __init__(self) -> None: + super().__init__() + self._policy_simulation_time_s = 0.0 + + def bind_session(self, session: ControlSession) -> None: + if self.session is not None and self.session is not session: + raise ValidationError("runtime.session", "the already bound control session", session) + if session.robot is not self.robot: + raise ValidationError("runtime.session.robot", self.robot, session.robot) + self._configure_session_period(session.period_s) + super().bind_session(session) + + def _configure_session_period(self, period_s: float) -> None: + """Configure simulation substeps for the control interval.""" + + @abstractmethod + def advance_control_period(self) -> None: + """Advance physics through one control interval.""" + + @abstractmethod + def _physics_time_s(self) -> float: + """Read the physical simulation clock.""" + + def _advance_interval(self) -> None: + assert self.session is not None + before = self._physics_time_s() + try: + self.advance_control_period() + finally: + if self.session.policy_tick: + self._policy_simulation_time_s += self._physics_time_s() - before + + def _run_session(self, scheduler: LoopScheduler) -> SimulationRolloutResult: + self._policy_simulation_time_s = 0.0 + result = super()._run_session(scheduler) + return SimulationRolloutResult( + **{item.name: getattr(result, item.name) for item in fields(RolloutResult)}, + policy_simulation_time_s=self._policy_simulation_time_s, + real_time_factor=self._policy_simulation_time_s / result.wall_time_s if result.wall_time_s > 0 else 0.0, + ) + + def _check_running(self) -> None: + self.check_viewer_running() + + def check_viewer_running(self) -> None: + """Reject viewer shutdown; headless simulation hosts need no check.""" __all__ = ["DeploymentRuntime", "SimulationRuntime"] diff --git a/motrix_deploy/src/motrix_deploy/runtime/context.py b/motrix_deploy/src/motrix_deploy/runtime/context.py index bff09f86..cf384396 100644 --- a/motrix_deploy/src/motrix_deploy/runtime/context.py +++ b/motrix_deploy/src/motrix_deploy/runtime/context.py @@ -1,31 +1,22 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Task-typed per-tick policy context.""" +"""Task-typed per-tick controller inputs.""" from dataclasses import dataclass from typing import Generic, TypeVar -import numpy as np - -from motrix_deploy.errors import ValidationError - CommandT = TypeVar("CommandT") @dataclass(frozen=True) -class PolicyContext(Generic[CommandT]): +class ControlContext(Generic[CommandT]): """Deterministic per-tick inputs that do not come from robot state.""" step: int elapsed_time_s: float - command: CommandT - - def __post_init__(self) -> None: - if not isinstance(self.step, int) or isinstance(self.step, bool) or self.step < 0: - raise ValidationError("context.step", "a non-negative integer", self.step) - if not np.isfinite(self.elapsed_time_s) or self.elapsed_time_s < 0: - raise ValidationError("context.elapsed_time_s", "a non-negative finite value", self.elapsed_time_s) + command: CommandT | None + dt_s: float -__all__ = ["PolicyContext"] +__all__ = ["ControlContext"] diff --git a/motrix_deploy/src/motrix_deploy/runtime/control.py b/motrix_deploy/src/motrix_deploy/runtime/control.py index 0b113e92..e2148e06 100644 --- a/motrix_deploy/src/motrix_deploy/runtime/control.py +++ b/motrix_deploy/src/motrix_deploy/runtime/control.py @@ -1,294 +1,301 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Backend-neutral control executor, independent of scheduling and physics.""" +"""Control sessions and policy-driven robot command generation.""" import hashlib import time -from typing import TYPE_CHECKING, Generic, TypeVar +from typing import Generic, TypeVar -from motrix_deploy.contracts import JointServoCommand, RobotCommand, RobotState -from motrix_deploy.errors import EmergencyStopError, LieDownRequestedError, ValidationError -from motrix_deploy.policy import PolicyRuntime +from motrix_deploy.contracts import JointServoCommand, RobotState +from motrix_deploy.errors import ControlFailure, EmergencyStopError, LieDownRequestedError, ValidationError +from motrix_deploy.policy import Policy +from motrix_deploy.policy.processing import PolicyProcessor from motrix_deploy.robot.interface import RobotInterface -from motrix_deploy.runtime.context import PolicyContext +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.lifecycle import Controller, ControllerStep from motrix_deploy.runtime.result import LatencyRecorder, RolloutResult from motrix_env_core.input import CommandBinding -if TYPE_CHECKING: - from motrix_deploy.task import DeployTask - CommandT = TypeVar("CommandT") -class _LoopFailure(RuntimeError): - def __init__(self, reason: str, message: str) -> None: - self.reason = reason - super().__init__(message) +class PolicyController(Generic[CommandT]): + """Map state and command input to robot commands through an observation-to-action policy. + Policy I/O preprocessing and action conversion surround pure policy inference; no + robot handles, I/O or physical timing are owned here. + """ -class ControlSession(Generic[CommandT]): - """Own one control lifecycle; callers own scheduling and simulation advancement. + def __init__(self, policy_io: PolicyProcessor[CommandT], policy: Policy, steps: int | None = None): + self.policy_io = policy_io + self.policy = policy + self.steps = steps + self.completed_steps = 0 + self._initial_state: RobotState | None = None + self._initialized = False + self._stop_requested = False + self._time_origin_s: float | None = None - A completed tick means a healthy command write, not a completed physics step. - Errors are recorded by start/tick/fail; only stop performs backend cleanup. - Sessions are single-use, and repeated start/stop calls are idempotent. - Each command selects its mode, which must be supported by the robot backend. - """ + def _check_termination(self, state: RobotState) -> None: + try: + reason = self.policy_io.check_termination(state) + except Exception as error: + raise ControlFailure("task_termination_error", str(error)) from error + if reason is not None: + raise ControlFailure("task_terminated", reason) + + def reset(self, state: RobotState) -> None: + self._check_termination(state) + self.policy.reset() + self._initial_state = state + self._initialized = False + self._stop_requested = False + self.completed_steps = 0 + self._time_origin_s = None + + def request_stop(self) -> None: + self._stop_requested = True + + def step(self, state: RobotState, context: ControlContext[CommandT]) -> ControllerStep: + # Check the measured result of the last interval before finite completion. + self._check_termination(state) + if self._stop_requested or (self.steps is not None and self.completed_steps >= self.steps): + return ControllerStep( + complete=True, + success=not self._stop_requested or self.steps is not None and self.completed_steps >= self.steps, + ) + try: + self.policy_io.validate_command(context.command) + except Exception as error: + raise ControlFailure("input_error", str(error)) from error + if self._time_origin_s is None: + self._time_origin_s = context.elapsed_time_s + local = ControlContext( + self.completed_steps, context.elapsed_time_s - self._time_origin_s, context.command, context.dt_s + ) + if not self._initialized: + assert self._initial_state is not None + self.policy_io.reset(self._initial_state, local) + self._initialized = True + latency_ns = {} + phase_start = time.monotonic_ns() + try: + observation = self.policy_io.build_observation(state, local) + except Exception as error: + raise ControlFailure("invalid_observation", str(error)) from error + latency_ns["observation"] = time.monotonic_ns() - phase_start + phase_start = time.monotonic_ns() + try: + raw_action = self.policy.infer(observation) + except Exception as error: + raise ControlFailure("policy_error", str(error)) from error + latency_ns["inference"] = time.monotonic_ns() - phase_start + phase_start = time.monotonic_ns() + try: + command = self.policy_io.process_action(raw_action) + except Exception as error: + raise ControlFailure("invalid_action", str(error)) from error + latency_ns["action"] = time.monotonic_ns() - phase_start + trace = self.completed_steps.to_bytes(8, byteorder="little", signed=False) + for value in ( + state.joint_position, + state.joint_velocity, + state.base_orientation_xyzw, + observation, + raw_action, + command.joint_position if isinstance(command, JointServoCommand) else command.torque, + ): + trace += value.tobytes(order="C") + self.completed_steps += 1 + return ControllerStep(command=command, policy_tick=True, trace_bytes=trace, latency_ns=latency_ns) + + +class ControlSession(Generic[CommandT]): + """Execute a bound robot controller without interpreting its internal states.""" def __init__( self, *, robot: RobotInterface, - task: "DeployTask[CommandT]", - policy: PolicyRuntime, - command_binding: CommandBinding[CommandT], + controller: Controller[CommandT], + command_binding: CommandBinding[CommandT] | None = None, period_s: float, state_timeout_s: float, ) -> None: if period_s <= 0 or state_timeout_s <= 0: - raise ValidationError("control.timing", "positive period and timeout", (period_s, state_timeout_s)) + raise ValidationError("session.timing", "positive period and timeout", (period_s, state_timeout_s)) self.robot = robot - self.task = task - self.policy = policy self.command_binding = command_binding self.period_s = period_s self.state_timeout_s = state_timeout_s + self.controller = controller self._started = False self._stopped = False - self._completed_steps = 0 - self._initial_state: RobotState | None = None - self._previous_sample_time: int | None = None - self._recorder = LatencyRecorder() + self._finished = False + self._success = False + self._previous: int | None = None + self._interval_step = 0 + self.completed_steps = 0 + self.policy_tick = False self._trace = hashlib.sha256() + self._latency = LatencyRecorder() self._start_ns: int | None = None self._stop_ns: int | None = None - self._exit_reason = "completed" - self._error_message: str | None = None - - @property - def completed_steps(self) -> int: - return self._completed_steps + self._reason = "completed" + self._message: str | None = None @property def active(self) -> bool: - return self._started and not self._stopped and self._exit_reason == "completed" + return self._started and not self._stopped and not self._finished and self._reason == "completed" def start(self) -> bool: - """Open, validate and optionally enable the backend without scheduling.""" - if self._started or self._stopped or self._exit_reason != "completed": + if self._started or self._stopped or self._reason != "completed": return self.active self._start_ns = time.monotonic_ns() try: self.robot.open() - self._validate_capabilities() - initial_state = self._read_and_validate_state(None) - self._previous_sample_time = initial_state.sample_time_ns - self._check_task_termination(initial_state) - self.policy.reset() + rate = self.robot.capabilities.max_command_rate_hz + if rate is not None and 1 / self.period_s > rate + 1e-9: + raise ValidationError("session.command_rate_hz", f"<= {rate}", 1 / self.period_s) + state = self._read_state(None) + self._previous = state.sample_time_ns + self.controller.reset(state) if self.robot.capabilities.requires_enable: - initial_context = self._read_context(0, 0.0) - self.task.reset(initial_state, initial_context) try: self.robot.enable() except (EmergencyStopError, LieDownRequestedError, ValidationError): raise except Exception as error: - raise _LoopFailure("backend_enable_error", str(error)) from error - initial_state = self._read_and_validate_state(self._previous_sample_time) - self._previous_sample_time = initial_state.sample_time_ns - self._check_task_termination(initial_state) - self.task.reset(initial_state, initial_context) - self.policy.reset() - self._initial_state = initial_state + raise ControlFailure("backend_enable_error", str(error)) from error + state = self._read_state(self._previous) + self._previous = state.sample_time_ns + self.controller.reset(state) self._started = True except (Exception, KeyboardInterrupt) as error: self.fail(error) return self.active + def _read_state(self, previous: int | None) -> "RobotState": + try: + state = self.robot.read_state(self.state_timeout_s) + except TimeoutError as error: + raise ControlFailure("state_timeout", str(error)) from error + except (EmergencyStopError, LieDownRequestedError): + raise + except Exception as error: + raise ControlFailure("backend_read_error", str(error)) from error + try: + expected = (self.robot.spec.joint_count,) + if state.joint_position.shape != expected or state.joint_velocity.shape != expected: + raise ControlFailure("invalid_state", f"joint shape must be {expected}") + if previous is not None and state.sample_time_ns < previous: + raise ControlFailure("invalid_state", "state sample timestamp moved backwards") + age_s = (time.monotonic_ns() - state.receive_time_ns) / 1e9 + if age_s > self.state_timeout_s: + raise ControlFailure("state_timeout", f"state age {age_s:.6f}s exceeds {self.state_timeout_s:.6f}s") + except ControlFailure: + raise + except Exception as error: + raise ControlFailure("invalid_state", str(error)) from error + self._check_health() + return state + + def _check_health(self) -> None: + health = self.robot.health() + if not health.healthy: + raise ControlFailure("backend_unhealthy", health.reason) + def tick(self, *, elapsed_time_s: float) -> bool: - """Execute one control tick using caller-supplied relative elapsed time.""" if not self.active: return False - step = self.completed_steps + self.policy_tick = False loop_start = time.monotonic_ns() try: - phase_start = time.monotonic_ns() - context = self._read_context(step, elapsed_time_s) - self._recorder.add("input", time.monotonic_ns() - phase_start) - if step == 0: - self.task.reset(self._initial_state, context) - phase_start = time.monotonic_ns() - state = self._read_and_validate_state(self._previous_sample_time) - self._recorder.add("read", time.monotonic_ns() - phase_start) - self._previous_sample_time = state.sample_time_ns - self._check_task_termination(state) - - phase_start = time.monotonic_ns() - try: - observation = self.task.build_observation(state, context) - except Exception as error: - raise _LoopFailure("invalid_observation", str(error)) from error - self._recorder.add("observation", time.monotonic_ns() - phase_start) - - phase_start = time.monotonic_ns() + phase = time.monotonic_ns() + state = self._read_state(self._previous) + self._previous = state.sample_time_ns + self._latency.add("read", time.monotonic_ns() - phase) + phase = time.monotonic_ns() try: - raw_action = self.policy.infer(observation) + command = self.command_binding.read_command(batch_size=1) if self.command_binding is not None else None except Exception as error: - raise _LoopFailure("policy_error", str(error)) from error - self._recorder.add("inference", time.monotonic_ns() - phase_start) - - phase_start = time.monotonic_ns() - try: - command = self.task.process_action(raw_action) - self._validate_command_mode(command) - except Exception as error: - raise _LoopFailure("invalid_action", str(error)) from error - self._recorder.add("action", time.monotonic_ns() - phase_start) - - phase_start = time.monotonic_ns() - try: - self.robot.write_command(command) - except (EmergencyStopError, LieDownRequestedError): - raise - except Exception as error: - raise _LoopFailure("backend_write_error", str(error)) from error - self._recorder.add("write", time.monotonic_ns() - phase_start) - health = self.robot.health() - if not health.healthy: - raise _LoopFailure("backend_unhealthy", health.reason) - self._trace.update(step.to_bytes(8, byteorder="little", signed=False)) - for value in ( - state.joint_position, - state.joint_velocity, - state.base_orientation_xyzw, - observation, - raw_action, - command.joint_position if isinstance(command, JointServoCommand) else command.torque, - ): - self._trace.update(value.tobytes(order="C")) - self._completed_steps += 1 - self._recorder.add("loop", time.monotonic_ns() - loop_start) + raise ControlFailure("input_error", str(error)) from error + context = ControlContext(self._interval_step, elapsed_time_s, command, self.period_s) + self._latency.add("input", time.monotonic_ns() - phase) + decision = self.controller.step(state, context) + if decision.error is not None: + raise ControlFailure("controller_error", decision.error) + if decision.complete: + self._finished = True + self._success = decision.success + return False + if decision.command is not None: + if decision.command.mode not in self.robot.capabilities.control_modes: + raise ControlFailure("invalid_action", f"unsupported control mode {decision.command.mode}") + phase = time.monotonic_ns() + try: + self.robot.write_command(decision.command) + except (EmergencyStopError, LieDownRequestedError): + raise + except Exception as error: + raise ControlFailure("backend_write_error", str(error)) from error + self._latency.add("write", time.monotonic_ns() - phase) + self._check_health() + self.policy_tick = decision.policy_tick + if self.policy_tick: + self.completed_steps += 1 + self._trace.update(decision.trace_bytes) + for name, value in decision.latency_ns.items(): + self._latency.add(name, value) + self._interval_step += 1 + self._latency.add("loop", time.monotonic_ns() - loop_start) except (Exception, KeyboardInterrupt) as error: self.fail(error) return False return True + def request_stop(self) -> None: + self.controller.request_stop() + def fail(self, error: BaseException) -> None: - """Record the first failure, including errors from an external driver.""" - if not isinstance(error, (Exception, KeyboardInterrupt)): - raise error - if self._exit_reason != "completed": + if self._reason != "completed": return if isinstance(error, KeyboardInterrupt): - self._exit_reason = "interrupted" - self._error_message = "rollout interrupted by user" - return - if isinstance(error, EmergencyStopError): - self._exit_reason = "emergency_stop" + self._reason, self._message = "interrupted", "rollout interrupted by user" + elif isinstance(error, EmergencyStopError): + self._reason, self._message = "emergency_stop", str(error) elif isinstance(error, LieDownRequestedError): - self._exit_reason = "lie_down" - elif isinstance(error, _LoopFailure): - self._exit_reason = error.reason + self._reason, self._message = "lie_down", str(error) + elif isinstance(error, ControlFailure): + self._reason, self._message = error.reason, str(error) elif isinstance(error, ValidationError): - self._exit_reason = "validation_error" + self._reason, self._message = "validation_error", str(error) else: - self._exit_reason = "backend_error" - self._error_message = str(error) + self._reason, self._message = "backend_error", str(error) def stop(self) -> None: - """Stop and close once, preserving any earlier failure over cleanup errors.""" if self._stopped: return self._stopped = True - cleanup_error: BaseException | None = None for cleanup in (self.robot.stop, self.robot.close): try: cleanup() except (Exception, KeyboardInterrupt) as error: - cleanup_error = cleanup_error or error - if cleanup_error is not None and self._exit_reason == "completed": - self._exit_reason = "cleanup_error" - self._error_message = str(cleanup_error) + if self._reason == "completed": + self._reason, self._message = "cleanup_error", str(error) self._stop_ns = time.monotonic_ns() - def result(self, *, steps: int | None, overrun_count: int = 0) -> RolloutResult: - """Summarize completed control ticks; finite success requires the target count.""" + def result(self, *, overrun_count: int = 0) -> RolloutResult: end_ns = self._stop_ns if self._stop_ns is not None else time.monotonic_ns() - wall_time_s = (end_ns - self._start_ns) / 1e9 if self._start_ns is not None else 0.0 - simulation_time_s = self.completed_steps * self.period_s + wall_s = (end_ns - self._start_ns) / 1e9 if self._start_ns is not None else 0.0 return RolloutResult( - success=self._exit_reason == "completed" and steps is not None and self.completed_steps == steps, - exit_reason=self._exit_reason, + success=self._reason == "completed" and self._finished and self._success, + exit_reason=self._reason, completed_steps=self.completed_steps, - simulation_time_s=simulation_time_s, - wall_time_s=wall_time_s, - real_time_factor=simulation_time_s / wall_time_s if wall_time_s > 0 else 0.0, + wall_time_s=wall_s, overrun_count=overrun_count, trace_sha256=self._trace.hexdigest(), - error=self._error_message, - latency=self._recorder.summarize(), + error=self._message, + latency=self._latency.summarize(), ) - - def _check_task_termination(self, state: RobotState) -> None: - try: - reason = self.task.check_termination(state) - except Exception as error: - raise _LoopFailure("task_termination_error", str(error)) from error - if reason is not None: - raise _LoopFailure("task_terminated", reason) - - def _read_context(self, step: int, elapsed_time_s: float) -> PolicyContext[CommandT]: - try: - command = self.command_binding.read_command(batch_size=1) - self.task.validate_command(command) - return PolicyContext(step=step, elapsed_time_s=elapsed_time_s, command=command) - except Exception as error: - raise _LoopFailure("input_error", str(error)) from error - - def _validate_command_mode(self, command: RobotCommand) -> None: - modes = self.robot.capabilities.control_modes - if command.mode not in modes: - raise ValidationError("backend.control_modes", command.mode.value, modes) - - def _validate_capabilities(self) -> None: - capabilities = self.robot.capabilities - if capabilities.max_command_rate_hz is not None: - requested_rate = 1.0 / self.period_s - if requested_rate > capabilities.max_command_rate_hz + 1e-9: - raise ValidationError( - "control.command_rate_hz", f"<= {capabilities.max_command_rate_hz}", requested_rate - ) - - def _read_and_validate_state(self, previous_sample_time: int | None) -> RobotState: - try: - state = self.robot.read_state(self.state_timeout_s) - except TimeoutError as error: - raise _LoopFailure("state_timeout", str(error)) from error - except (EmergencyStopError, LieDownRequestedError): - raise - except Exception as error: - raise _LoopFailure("backend_read_error", str(error)) from error - try: - self._validate_state(state, previous_sample_time) - except _LoopFailure: - raise - except Exception as error: - raise _LoopFailure("invalid_state", str(error)) from error - health = self.robot.health() - if not health.healthy: - raise _LoopFailure("backend_unhealthy", health.reason) - return state - - def _validate_state(self, state: RobotState, previous_sample_time: int | None) -> None: - expected = (self.robot.spec.joint_count,) - if state.joint_position.shape != expected or state.joint_velocity.shape != expected: - raise _LoopFailure("invalid_state", f"joint shape must be {expected}") - if previous_sample_time is not None and state.sample_time_ns < previous_sample_time: - raise _LoopFailure( - "invalid_state", - f"state sample timestamp moved backwards: {state.sample_time_ns} < {previous_sample_time}", - ) - age_s = (time.monotonic_ns() - state.receive_time_ns) / 1e9 - if age_s > self.state_timeout_s: - raise _LoopFailure("state_timeout", f"state age {age_s:.6f}s exceeds {self.state_timeout_s:.6f}s") diff --git a/motrix_deploy/src/motrix_deploy/runtime/hardware.py b/motrix_deploy/src/motrix_deploy/runtime/hardware.py index ff2d0a82..ddd3b0f3 100644 --- a/motrix_deploy/src/motrix_deploy/runtime/hardware.py +++ b/motrix_deploy/src/motrix_deploy/runtime/hardware.py @@ -6,17 +6,12 @@ from motrix_deploy.errors import ValidationError from motrix_deploy.robot.interface import RobotInterface from motrix_deploy.runtime.base import DeploymentRuntime -from motrix_deploy.runtime.control import ControlSession from motrix_deploy.runtime.result import RolloutResult from motrix_deploy.runtime.scheduler import FixedStepScheduler, LoopScheduler, RealtimeScheduler class HardwareRuntime(DeploymentRuntime): - """Drive a control session without owning or advancing robot physics. - - The control session owns robot open/stop/close. This runtime only owns the - scheduler and ensures an active session is stopped when its lifecycle closes. - """ + """Own the hardware host and pace bound control session without advancing physics.""" def __init__( self, @@ -34,35 +29,21 @@ def __init__( def robot(self) -> RobotInterface: return self._robot - def close(self) -> None: - control = self.control - if control is not None and control.active: - control.stop() - super().close() - - def run(self, control: ControlSession | None = None, *, steps: int | None = None) -> RolloutResult: - control = self._resolve_control(control) - if steps is not None and (not isinstance(steps, int) or isinstance(steps, bool) or steps <= 0): - raise ValidationError("steps", "a positive integer", steps) + def run(self) -> RolloutResult: + if self.session is None: + raise ValidationError("runtime.session", "a bound control session", None) scheduler = self.scheduler if scheduler is None: - scheduler = RealtimeScheduler(control.period_s) if self.realtime else FixedStepScheduler(control.period_s) - elif scheduler.period_s != control.period_s: - raise ValidationError("runtime.scheduler.period_s", control.period_s, scheduler.period_s) + scheduler = ( + RealtimeScheduler(self.session.period_s) if self.realtime else FixedStepScheduler(self.session.period_s) + ) + elif scheduler.period_s != self.session.period_s: + raise ValidationError("runtime.scheduler.period_s", self.session.period_s, scheduler.period_s) self.open() try: - if control.start(): - scheduler.reset() - while control.active and (steps is None or control.completed_steps < steps): - step = control.completed_steps - scheduler.wait(step) - control.tick(elapsed_time_s=scheduler.elapsed_time_s(step)) - except (Exception, KeyboardInterrupt) as error: - control.fail(error) + return self._run_session(scheduler) finally: - control.stop() self.close() - return control.result(steps=steps, overrun_count=scheduler.overrun_count) __all__ = ["HardwareRuntime"] diff --git a/motrix_deploy/src/motrix_deploy/runtime/lifecycle.py b/motrix_deploy/src/motrix_deploy/runtime/lifecycle.py new file mode 100644 index 00000000..8990d5b3 --- /dev/null +++ b/motrix_deploy/src/motrix_deploy/runtime/lifecycle.py @@ -0,0 +1,36 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Robot-level controller decisions, independent of backend resources and scheduling.""" + +from dataclasses import dataclass, field +from typing import Protocol, TypeVar + +from motrix_deploy.contracts import RobotCommand, RobotState +from motrix_deploy.runtime.context import ControlContext + +CommandT = TypeVar("CommandT", contravariant=True) + + +@dataclass(frozen=True) +class ControllerStep: + """One robot decision; completion consumes no physical interval.""" + + command: RobotCommand | None = None + complete: bool = False + metrics: dict[str, float] = field(default_factory=dict) + error: str | None = None + policy_tick: bool = False + trace_bytes: bytes = b"" + latency_ns: dict[str, int] = field(default_factory=dict) + success: bool = True + + +class Controller(Protocol[CommandT]): + """Map robot state and command input to robot commands, including composite stages.""" + + def reset(self, state: RobotState) -> None: ... + + def step(self, state: RobotState, context: ControlContext[CommandT]) -> ControllerStep: ... + + def request_stop(self) -> None: ... diff --git a/motrix_deploy/src/motrix_deploy/runtime/result.py b/motrix_deploy/src/motrix_deploy/runtime/result.py index 7afd4fce..197f76c4 100644 --- a/motrix_deploy/src/motrix_deploy/runtime/result.py +++ b/motrix_deploy/src/motrix_deploy/runtime/result.py @@ -25,9 +25,7 @@ class RolloutResult: success: bool exit_reason: str completed_steps: int - simulation_time_s: float wall_time_s: float - real_time_factor: float overrun_count: int trace_sha256: str error: str | None = None @@ -37,6 +35,14 @@ def to_dict(self) -> dict[str, Any]: return asdict(self) +@dataclass(frozen=True, kw_only=True) +class SimulationRolloutResult(RolloutResult): + """Simulation outcome with model-only physical time, excluding readiness and damping.""" + + policy_simulation_time_s: float + real_time_factor: float + + class LatencyRecorder: """Collect latency samples and produce stable summaries.""" diff --git a/motrix_deploy/src/motrix_deploy/task.py b/motrix_deploy/src/motrix_deploy/task.py index a6576402..230756fa 100644 --- a/motrix_deploy/src/motrix_deploy/task.py +++ b/motrix_deploy/src/motrix_deploy/task.py @@ -1,61 +1,54 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Runtime contract implemented by concrete deployment-task packages.""" +"""Complete task control entry point and installed task discovery.""" from abc import ABC, abstractmethod from importlib import metadata from typing import Any, ClassVar, Generic, TypeVar from motrix_deploy.artifact.schema import TaskSpec -from motrix_deploy.contracts import FloatArray, RobotCommand, RobotSpec, RobotState -from motrix_deploy.runtime.context import PolicyContext +from motrix_deploy.contracts import RobotSpec, RobotState +from motrix_deploy.policy import Policy +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.lifecycle import ControllerStep CommandT = TypeVar("CommandT") class DeployTask(ABC, Generic[CommandT]): - """Own task-specific observation, action, command, and termination semantics. - - ControlSession checks backend state and calls validate_command before passing - inputs to reset and build_observation. Tasks check optional state fields at - their usage sites when a feature needs them. Backend capabilities describe - which fields are privileged ground truth. - """ + """Implement Controller and own task phases, without robot handles or scheduling.""" spec_type: ClassVar[type[TaskSpec]] - def check_termination(self, state: RobotState) -> str | None: - """Return a task termination reason, or None to continue, without side effects.""" + @classmethod + def default_duration_s(cls, spec: TaskSpec) -> float | None: + """Artifact-owned playback budget, if no CLI duration is supplied.""" return None @abstractmethod - def reset(self, state: RobotState, context: PolicyContext[CommandT]) -> None: - """Reset episode-local preprocessing and action state.""" + def reset(self, state: RobotState) -> None: ... @abstractmethod - def build_observation(self, state: RobotState, context: PolicyContext[CommandT]) -> FloatArray: - """Build one flat policy observation.""" + def step(self, state: RobotState, context: ControlContext[CommandT]) -> ControllerStep: ... @abstractmethod - def process_action(self, action: FloatArray) -> RobotCommand: - """Convert a policy action into a servo or torque command supported by the backend.""" + def request_stop(self) -> None: ... @abstractmethod - def validate_command(self, command: CommandT) -> None: - """Validate one external high-level command before using it.""" + def validate_command(self, command: CommandT | None) -> None: + """Validate external input at the application assembly boundary.""" TASK_ENTRY_POINT_GROUP = "motrix_deploy.tasks" def available_tasks() -> tuple[str, ...]: - """List installed task plugins without importing their implementations.""" + """List installed tasks without importing their implementations.""" return tuple(sorted({entry.name for entry in metadata.entry_points(group=TASK_ENTRY_POINT_GROUP)})) def load_task_type(name: str) -> type[DeployTask[Any]]: - """Load only the selected installed task class, shared by codec and runtime.""" entries = tuple(metadata.entry_points(group=TASK_ENTRY_POINT_GROUP)) matches = [entry for entry in entries if entry.name == name] if not matches: @@ -65,13 +58,19 @@ def load_task_type(name: str) -> type[DeployTask[Any]]: raise ValueError(f"Multiple deployment task plugins provide {name}") task_type = matches[0].load() if not isinstance(task_type, type) or not issubclass(task_type, DeployTask): - raise TypeError(f"Deployment task plugin {name} must provide a DeployTask class") + raise TypeError(f"Deployment task plugin {name} must provide a DeployTask type") return task_type -def create_task(spec: TaskSpec, robot: RobotSpec) -> DeployTask[Any]: - """Instantiate the installed task class selected by an artifact.""" - return load_task_type(spec.name)(spec, robot) +def create_task( + spec: TaskSpec, + robot: RobotSpec, + policy: Policy, + steps: int | None = None, + artifact: Any | None = None, +) -> DeployTask[Any]: + """Construct a task; ``artifact`` supplies file payloads for tasks that reference them.""" + return load_task_type(spec.name)(spec, robot, policy, steps=steps, artifact=artifact) -__all__ = ["DeployTask", "create_task", "available_tasks"] +__all__ = ["DeployTask", "create_task", "available_tasks", "load_task_type"] diff --git a/motrix_deploy/tests/controller_helpers.py b/motrix_deploy/tests/controller_helpers.py new file mode 100644 index 00000000..4a8d24a5 --- /dev/null +++ b/motrix_deploy/tests/controller_helpers.py @@ -0,0 +1,139 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Reusable policy, policy I/O and bound hardware runtime helpers for tests.""" + +import numpy as np + +from motrix_deploy.artifact import DeploymentManifest +from motrix_deploy.contracts import ( + FloatArray, + JointControlMode, + JointServoCommand, + JointTorqueCommand, + RobotCommand, + RobotState, + float32_array, +) +from motrix_deploy.policy import Policy +from motrix_deploy.policy.processing import PolicyProcessor +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import ControlSession, PolicyController +from motrix_deploy.runtime.hardware import HardwareRuntime +from motrix_deploy.runtime.scheduler import FixedStepScheduler +from motrix_env_core.input import ConstantPlanarVelocityBinding, PlanarVelocityCommand + + +class ConstantPolicy(Policy): + def __init__(self, input_size: int, action: FloatArray) -> None: + self._input_size = input_size + self._action = float32_array(action, path="test.action", shape=(action.size,)) + self.observations: list[FloatArray] = [] + + def infer(self, observation: FloatArray) -> FloatArray: + value = float32_array(observation, path="test.observation", shape=(self._input_size,)) + self.observations.append(value) + return self._action + + +class _TestPolicyProcessor(PolicyProcessor[PlanarVelocityCommand]): + def __init__(self, manifest: DeploymentManifest) -> None: + self.robot = manifest.robot + self._previous_action = np.zeros(self.robot.joint_count, dtype=np.float32) + + def reset(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> None: + del state, context + self._previous_action = np.zeros(2, dtype=np.float32) + + def build_observation(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> FloatArray: + del context + return np.concatenate((state.joint_position - self.robot.default_joint_position, state.joint_velocity)).astype( + np.float32 + ) + + def process_action(self, action: FloatArray) -> RobotCommand: + executed = np.clip(action, -1.0, 1.0).astype(np.float32) + self._previous_action = executed + zeros = np.zeros(2, dtype=np.float32) + return JointServoCommand( + joint_position=self.robot.default_joint_position + np.float32(0.25) * executed, + joint_velocity=zeros, + feedforward_torque=zeros, + kp=np.full(2, 35.0, dtype=np.float32), + kd=np.full(2, 0.5, dtype=np.float32), + ) + + def check_termination(self, state: RobotState) -> str | None: + return None + + def validate_command(self, command: PlanarVelocityCommand | None) -> None: + if not isinstance(command, PlanarVelocityCommand) or command.batch_size != 1: + raise ValueError("expected one planar velocity command") + + +class _TorquePolicyProcessor(_TestPolicyProcessor): + def process_action(self, action: FloatArray) -> JointTorqueCommand: + return JointTorqueCommand(np.array(action, dtype=np.float32, copy=True)) + + +class _AlternatingPolicyProcessor(_TestPolicyProcessor): + def __init__(self, manifest: DeploymentManifest) -> None: + super().__init__(manifest) + self._next_mode = JointControlMode.SERVO + + def process_action(self, action: FloatArray) -> RobotCommand: + if self._next_mode is JointControlMode.SERVO: + self._next_mode = JointControlMode.TORQUE + return super().process_action(action) + self._next_mode = JointControlMode.SERVO + return JointTorqueCommand(np.array(action, dtype=np.float32, copy=True)) + + +class _StatefulPolicyProcessor(_TestPolicyProcessor): + def __init__(self, manifest: DeploymentManifest) -> None: + super().__init__(manifest) + self.contexts: list[ControlContext[PlanarVelocityCommand]] = [] + self.reset_contexts: list[ControlContext[PlanarVelocityCommand]] = [] + + def reset(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> None: + super().reset(state, context) + self.reset_contexts.append(context) + + def build_observation(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> FloatArray: + self.contexts.append(context) + observation = super().build_observation(state, context) + observation[:2] += self._previous_action + observation[2:] += np.float32(context.elapsed_time_s) + return observation + + +class _StatefulPolicy(ConstantPolicy): + def __init__(self) -> None: + super().__init__(4, np.zeros(2, dtype=np.float32)) + self.reset_count = 0 + self.counter = 99 + + def reset(self) -> None: + self.reset_count += 1 + self.counter = 0 + + def infer(self, observation: FloatArray) -> FloatArray: + super().infer(observation) + self.counter += 1 + return np.tanh(observation[:2] + np.float32(self.counter * 0.1)).astype(np.float32) + + +def runtime_for(manifest, backend, *, steps=3, task=None, model=None, binding=None, scheduler=None): + task = task or _TestPolicyProcessor(manifest) + model = model or ConstantPolicy(4, np.array([0.4, -0.4], np.float32)) + controller = PolicyController(task, model, steps=steps) + runtime = HardwareRuntime(backend, scheduler=scheduler or FixedStepScheduler(manifest.control.period_s)) + session = ControlSession( + controller=controller, + robot=backend, + command_binding=binding or ConstantPlanarVelocityBinding((0.5, 0, 0)), + period_s=manifest.control.period_s, + state_timeout_s=manifest.control.state_timeout_s, + ) + runtime.bind_session(session) + return runtime, controller diff --git a/motrix_deploy/tests/fake_robot.py b/motrix_deploy/tests/fake_robot.py index d9ea05b0..61981851 100644 --- a/motrix_deploy/tests/fake_robot.py +++ b/motrix_deploy/tests/fake_robot.py @@ -148,6 +148,5 @@ def _state(self) -> RobotState: base_orientation_xyzw=np.array([0.0, 0.0, 0.0, 1.0], dtype=np.float32), base_angular_velocity=zeros, base_linear_acceleration=zeros, - base_position=np.array([0.0, 0.0, 0.3], dtype=np.float32), base_linear_velocity=zeros, ) diff --git a/motrix_deploy/tests/task_specs.py b/motrix_deploy/tests/task_specs.py index 222aca15..5ba61a9c 100644 --- a/motrix_deploy/tests/task_specs.py +++ b/motrix_deploy/tests/task_specs.py @@ -6,6 +6,7 @@ from typing import ClassVar from motrix_deploy.artifact.schema import TaskSpec +from motrix_deploy.runtime.lifecycle import ControllerStep from motrix_deploy.task import DeployTask @@ -16,18 +17,25 @@ class TestTaskSpec(TaskSpec): class TestDeployTask(DeployTask[object]): spec_type = TestTaskSpec - def __init__(self, spec, robot): + def __init__(self, spec, robot, policy, steps=None, artifact=None): self.spec = spec self.robot = robot + self.policy = policy + self.steps = steps + self.states = [] + self.stop_requested = False - def reset(self, state, context): - pass + def reset(self, state): + self.states = [state] + self.stop_requested = False - def build_observation(self, state, context): - raise NotImplementedError + def step(self, state, context): + self.states.append(state) + return ControllerStep(complete=True) - def process_action(self, action): - raise NotImplementedError + def request_stop(self): + self.stop_requested = True def validate_command(self, command): - pass + if command is not None: + raise ValueError("fixture task accepts no external input") diff --git a/motrix_deploy/tests/test_artifact.py b/motrix_deploy/tests/test_artifact.py index b892eb88..db084043 100644 --- a/motrix_deploy/tests/test_artifact.py +++ b/motrix_deploy/tests/test_artifact.py @@ -12,7 +12,14 @@ import pytest -from motrix_deploy.artifact import ControlSpec, DeploymentManifest, inspect_artifact, read_artifact, write_artifact +from motrix_deploy.artifact import ( + ControlSpec, + DeploymentManifest, + inspect_artifact, + read_artifact, + sha256_bytes, + write_artifact, +) from motrix_deploy.contracts import JointControlMode from motrix_deploy.errors import ArtifactError, ValidationError @@ -36,6 +43,32 @@ def test_artifact_round_trip_and_inspect( assert summary["policy"]["input"] == {"name": "observation", "shape": [1, 4], "dtype": "float32"} +def test_task_payload_round_trip_and_tamper_rejection( + tmp_path: Path, + manifest_factory: Callable[[], DeploymentManifest], +) -> None: + import dataclasses + + from motrix_deploy.artifact.schema import PayloadSpec + + payload = b"motion-clip-npz-bytes" + manifest = dataclasses.replace( + manifest_factory(), + payloads=(PayloadSpec(path="payloads/motion.npz", sha256=sha256_bytes(payload)),), + ) + output = tmp_path / "fixture.deploy" + artifact = write_artifact(output, manifest, {"policy/model.onnx": POLICY_BYTES, "payloads/motion.npz": payload}) + assert (output / "payloads" / "motion.npz").read_bytes() == payload + assert artifact.manifest.payloads[0].path == "payloads/motion.npz" + # A modified task payload is rejected by its checksum. + (output / "payloads" / "motion.npz").write_bytes(b"tampered") + with pytest.raises(ArtifactError, match="payload sha256 mismatch"): + read_artifact(output) + # Missing and unexpected payload keys are rejected at the write boundary. + with pytest.raises(ArtifactError, match="payload keys must be exactly"): + write_artifact(tmp_path / "short.deploy", manifest, {"policy/model.onnx": POLICY_BYTES}) + + def test_cli_inspect_outputs_json(tmp_path: Path, manifest_factory: Callable[[], DeploymentManifest]) -> None: output = tmp_path / "fixture.deploy" write_artifact(output, manifest_factory(), {"policy/model.onnx": POLICY_BYTES}) diff --git a/motrix_deploy/tests/test_policy.py b/motrix_deploy/tests/test_policy.py index d39846ba..21f58456 100644 --- a/motrix_deploy/tests/test_policy.py +++ b/motrix_deploy/tests/test_policy.py @@ -12,11 +12,11 @@ from motrix_deploy.contracts import TensorSpec from motrix_deploy.errors import ValidationError -from motrix_deploy.policy import NoOpPolicyRuntime, OnnxPolicyRuntime, PolicyRuntime +from motrix_deploy.policy import NoOpPolicy, OnnxPolicy, Policy def test_decision_runtime_only_requires_infer() -> None: - class Planner(PolicyRuntime): + class Planner(Policy): def infer(self, observation): return observation[::-1].copy() @@ -26,7 +26,7 @@ def infer(self, observation): def test_noop_returns_independent_zero_actions_and_ignores_observation() -> None: - runtime = NoOpPolicyRuntime(3) + runtime = NoOpPolicy(3) first = runtime.infer(np.array([1.0], dtype=np.float32)) assert first.shape == (3,) and first.dtype == np.float32 np.testing.assert_array_equal(first, np.zeros(3)) @@ -35,12 +35,6 @@ def test_noop_returns_independent_zero_actions_and_ignores_observation() -> None np.testing.assert_array_equal(runtime.infer(np.arange(10, dtype=np.float32)), np.zeros(3)) -@pytest.mark.parametrize("size", [-1, True, 1.5]) -def test_noop_rejects_invalid_action_size(size) -> None: - with pytest.raises(ValidationError, match="policy.noop.action_size"): - NoOpPolicyRuntime(size) - - def _write_linear_model( path: Path, *, @@ -72,7 +66,7 @@ def _write_linear_model( def test_onnx_policy_validates_io_and_runs_float32(tmp_path: Path) -> None: path = tmp_path / "policy.onnx" _write_linear_model(path) - runtime = OnnxPolicyRuntime( + runtime = OnnxPolicy( path, TensorSpec(name="observation", shape=(1, 4)), TensorSpec(name="action", shape=(1, 2)), @@ -87,7 +81,7 @@ def test_onnx_policy_validates_io_and_runs_float32(tmp_path: Path) -> None: def test_onnx_policy_accepts_dynamic_model_batch_for_single_sample_runtime(tmp_path: Path) -> None: path = tmp_path / "policy.onnx" _write_linear_model(path, dynamic_batch=True) - runtime = OnnxPolicyRuntime( + runtime = OnnxPolicy( path, TensorSpec(name="observation", shape=(1, 4)), TensorSpec(name="action", shape=(1, 2)), @@ -103,7 +97,7 @@ def test_onnx_policy_rejects_manifest_name_mismatch(tmp_path: Path) -> None: _write_linear_model(path, output_name="actual_action") with pytest.raises(ValidationError, match="policy.output.name"): - OnnxPolicyRuntime( + OnnxPolicy( path, TensorSpec(name="observation", shape=(1, 4)), TensorSpec(name="action", shape=(1, 2)), @@ -113,7 +107,7 @@ def test_onnx_policy_rejects_manifest_name_mismatch(tmp_path: Path) -> None: def test_onnx_policy_rejects_non_finite_input(tmp_path: Path) -> None: path = tmp_path / "policy.onnx" _write_linear_model(path) - runtime = OnnxPolicyRuntime( + runtime = OnnxPolicy( path, TensorSpec(name="observation", shape=(1, 4)), TensorSpec(name="action", shape=(1, 2)), @@ -126,7 +120,7 @@ def test_onnx_policy_rejects_non_finite_input(tmp_path: Path) -> None: def test_onnx_policy_rejects_non_finite_output(tmp_path: Path) -> None: path = tmp_path / "policy.onnx" _write_linear_model(path, nan_output=True) - runtime = OnnxPolicyRuntime( + runtime = OnnxPolicy( path, TensorSpec(name="observation", shape=(1, 4)), TensorSpec(name="action", shape=(1, 2)), diff --git a/motrix_deploy/tests/test_policy_controller.py b/motrix_deploy/tests/test_policy_controller.py new file mode 100644 index 00000000..c588276d --- /dev/null +++ b/motrix_deploy/tests/test_policy_controller.py @@ -0,0 +1,104 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""PolicyController computes commands from measurements without backend side effects.""" + +import numpy as np +import pytest +from controller_helpers import ConstantPolicy, _StatefulPolicy, _StatefulPolicyProcessor, _TestPolicyProcessor +from fake_robot import FakeRobotInterface + +from motrix_deploy.errors import ControlFailure +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import PolicyController +from motrix_env_core.input import PlanarVelocityCommand + + +def context(step=0, time_s=0.0): + return ControlContext(step, time_s, PlanarVelocityCommand(np.zeros((1, 3), dtype=np.float32)), dt_s=0.02) + + +def test_policy_controller_uses_supplied_state_and_returns_command(manifest_factory): + manifest = manifest_factory() + robot = FakeRobotInterface(manifest.robot) + task = _TestPolicyProcessor(manifest) + model = ConstantPolicy(4, np.zeros(2, np.float32)) + controller = PolicyController(task, model, steps=1) + assert controller.policy_io is task + assert controller.policy is model + robot.open() + state = robot.read_state(0.1) + events = list(robot.events) + seen = [] + observe = task.build_observation + + def observation(measurement, inputs): + seen.append((measurement, inputs)) + return observe(measurement, inputs) + + task.build_observation = observation + controller.reset(state) + decision = controller.step(state, context()) + assert decision.command is not None and not decision.complete + assert seen[0][0] is state + assert robot.events == events + assert controller.completed_steps == 1 + assert decision.policy_tick + assert decision.trace_bytes + assert decision.latency_ns["inference"] >= 0 + final = controller.step(state, context(1, 0.02)) + assert final.complete and final.command is None + assert controller.completed_steps == 1 + + +def test_model_failure_propagates_without_backend_side_effects(manifest_factory): + manifest = manifest_factory() + robot = FakeRobotInterface(manifest.robot) + model = ConstantPolicy(4, np.zeros(2, np.float32)) + controller = PolicyController(_TestPolicyProcessor(manifest), model) + robot.open() + state = robot.read_state(0.1) + controller.reset(state) + events = list(robot.events) + + def infer(observation): + raise RuntimeError("controller failed") + + model.infer = infer + with pytest.raises(ControlFailure, match="controller failed") as error: + controller.step(state, context()) + assert error.value.reason == "policy_error" + assert controller.completed_steps == 0 + assert robot.events == events + + +def test_policy_controller_owns_local_count_clock_and_history_reset(manifest_factory): + manifest = manifest_factory() + robot = FakeRobotInterface(manifest.robot) + robot.open() + state = robot.read_state(0.1) + task = _StatefulPolicyProcessor(manifest) + model = _StatefulPolicy() + controller = PolicyController(task, model, steps=2) + controller.reset(state) + controller.step(state, context(42, 3.0)) + controller.step(state, context(43, 3.07)) + assert model.reset_count == 1 + assert len(task.reset_contexts) == 1 + assert [inputs.step for inputs in task.contexts] == [0, 1] + assert [inputs.elapsed_time_s for inputs in task.contexts] == pytest.approx([0, 0.07]) + assert controller.step(state, context(44, 3.09)).complete + + +def test_requested_stop_completes_without_another_inference(manifest_factory): + manifest = manifest_factory() + robot = FakeRobotInterface(manifest.robot) + robot.open() + state = robot.read_state(0.1) + model = ConstantPolicy(4, np.zeros(2, np.float32)) + controller = PolicyController(_TestPolicyProcessor(manifest), model) + controller.reset(state) + assert controller.step(state, context()).command is not None + controller.request_stop() + assert controller.step(state, context(1, 0.02)).complete + assert len(model.observations) == 1 diff --git a/motrix_deploy/tests/test_runtime.py b/motrix_deploy/tests/test_runtime.py index 289ce139..3b282e91 100644 --- a/motrix_deploy/tests/test_runtime.py +++ b/motrix_deploy/tests/test_runtime.py @@ -1,905 +1,479 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Unified control loop and fake backend contract tests.""" +"""Robot controller execution and runtime safety boundary contracts.""" -from collections.abc import Callable +import time +from dataclasses import replace import numpy as np import pytest +from controller_helpers import ( + ConstantPolicy, + _AlternatingPolicyProcessor, + _StatefulPolicy, + _StatefulPolicyProcessor, + _TestPolicyProcessor, + _TorquePolicyProcessor, + runtime_for, +) from fake_robot import FakeRobotInterface -from motrix_deploy.artifact import DeploymentManifest from motrix_deploy.contracts import ( - FloatArray, JointControlMode, - JointServoCommand, JointTorqueCommand, RobotCapabilities, RobotCommand, RobotSpec, - RobotState, - float32_array, ) from motrix_deploy.errors import LieDownRequestedError, ValidationError -from motrix_deploy.policy import PolicyRuntime -from motrix_deploy.runtime import ( - ControlSession, - FixedStepScheduler, - HardwareRuntime, - PolicyContext, - RealtimeScheduler, -) -from motrix_deploy.task import DeployTask -from motrix_env_core.input import CommandBinding, ConstantPlanarVelocityBinding, PlanarVelocityCommand +from motrix_deploy.runtime.control import ControlSession, PolicyController +from motrix_deploy.runtime.hardware import HardwareRuntime +from motrix_deploy.runtime.lifecycle import ControllerStep +from motrix_deploy.runtime.result import LatencySummary, RolloutResult +from motrix_deploy.runtime.scheduler import FixedStepScheduler, RealtimeScheduler +from motrix_env_core.input import CommandBinding, PlanarVelocityCommand -class ConstantPolicy(PolicyRuntime): - def __init__(self, input_size: int, action: FloatArray) -> None: - self._input_size = input_size - self._action = float32_array(action, path="test.action", shape=(action.size,)) - self.observations: list[FloatArray] = [] +class _FailingBinding(CommandBinding[PlanarVelocityCommand]): + def read_command(self, *, batch_size: int = 1) -> PlanarVelocityCommand: + del batch_size + raise RuntimeError("input disconnected") - def infer(self, observation: FloatArray) -> FloatArray: - value = float32_array(observation, path="test.observation", shape=(self._input_size,)) - self.observations.append(value) - return self._action +class _TrackingBinding(CommandBinding[PlanarVelocityCommand]): + def __init__(self) -> None: + self.batch_sizes: list[int] = [] -class _TestDeployTask(DeployTask[PlanarVelocityCommand]): - def __init__(self, manifest: DeploymentManifest) -> None: - self.robot = manifest.robot - self._previous_action = np.zeros(self.robot.joint_count, dtype=np.float32) + def read_command(self, *, batch_size: int = 1) -> PlanarVelocityCommand: + self.batch_sizes.append(batch_size) + return PlanarVelocityCommand(np.zeros((batch_size, 3), dtype=np.float32)) - def reset(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> None: - del state, context - self._previous_action = np.zeros(2, dtype=np.float32) - def build_observation(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> FloatArray: - del context - return np.concatenate((state.joint_position - self.robot.default_joint_position, state.joint_velocity)).astype( - np.float32 - ) +class _InterruptingBinding(CommandBinding[PlanarVelocityCommand]): + def __init__(self, interrupt_at: int) -> None: + self._interrupt_at = interrupt_at + self.read_count = 0 - def process_action(self, action: FloatArray) -> RobotCommand: - executed = np.clip(action, -1.0, 1.0).astype(np.float32) - self._previous_action = executed - zeros = np.zeros(2, dtype=np.float32) - return JointServoCommand( - joint_position=self.robot.default_joint_position + np.float32(0.25) * executed, - joint_velocity=zeros, - feedforward_torque=zeros, - kp=np.full(2, 35.0, dtype=np.float32), - kd=np.full(2, 0.5, dtype=np.float32), + def read_command(self, *, batch_size: int = 1) -> PlanarVelocityCommand: + if self.read_count == self._interrupt_at: + raise KeyboardInterrupt + self.read_count += 1 + return PlanarVelocityCommand(np.zeros((batch_size, 3), dtype=np.float32)) + + +class EnablingBackend(FakeRobotInterface): + def __init__(self, spec: RobotSpec, *, sample_period_s: float = 0.02) -> None: + super().__init__(spec, sample_period_s=sample_period_s) + self._capabilities = RobotCapabilities( + control_modes=("joint_servo",), + state_fields=self._capabilities.state_fields, + max_command_rate_hz=1.0 / sample_period_s, + requires_enable=True, ) + self.enabled = False - def validate_command(self, command: PlanarVelocityCommand) -> None: - if not isinstance(command, PlanarVelocityCommand) or command.batch_size != 1: - raise ValueError("expected one planar velocity command") + def enable(self) -> None: + assert "write" not in self.events + self.events.append("enable") + self.enabled = True + + def write_command(self, command: RobotCommand) -> None: + assert self.enabled + super().write_command(command) -class _TorqueDeployTask(_TestDeployTask): - def process_action(self, action: FloatArray) -> JointTorqueCommand: - return JointTorqueCommand(np.array(action, dtype=np.float32, copy=True)) +class LieDownBackend(FakeRobotInterface): + def write_command(self, command: RobotCommand) -> None: + del command + raise LieDownRequestedError("remote B requested lie-down shutdown") +@pytest.mark.parametrize("task_type", [_TestPolicyProcessor, _TorquePolicyProcessor, _AlternatingPolicyProcessor]) @pytest.mark.parametrize("requires_enable", [False, True]) -def test_torque_session_success_is_deterministic_without_fake_physics( - manifest_factory: Callable[[], DeploymentManifest], - requires_enable: bool, -) -> None: +def test_runtime_executes_deterministic_controller_commands(manifest_factory, task_type, requires_enable): manifest = manifest_factory() - traces = [] + runs = [] for _ in range(2): backend = EnablingBackend(manifest.robot) if requires_enable else FakeRobotInterface(manifest.robot) - if requires_enable: - backend._capabilities = RobotCapabilities( - control_modes=(JointControlMode.SERVO, JointControlMode.TORQUE), - state_fields=backend.capabilities.state_fields, - requires_enable=True, - ) - session = _session(manifest, backend) - session.task = _TorqueDeployTask(manifest) - assert session.start() - for step in range(3): - assert session.tick(elapsed_time_s=step * manifest.control.period_s) - session.stop() - result = session.result(steps=3) - assert result.success + backend._capabilities = replace( + backend.capabilities, control_modes=(JointControlMode.SERVO, JointControlMode.TORQUE) + ) + runtime, controller = runtime_for(manifest, backend, task=task_type(manifest), steps=4) + result = runtime.run() + assert result.success and result.completed_steps == 4 + assert len(backend.commands) == 4 + assert backend.events[-2:] == ["stop", "close"] if requires_enable: assert backend.events.index("enable") < backend.events.index("write") - assert all(command.mode is JointControlMode.TORQUE for command in backend.commands) - np.testing.assert_array_equal(backend._position, manifest.robot.default_joint_position) - np.testing.assert_array_equal(backend._velocity, np.zeros(2, dtype=np.float32)) - assert backend._sample_time_ns == 3 * backend._period_ns - traces.append(result.trace_sha256) - assert traces[0] == traces[1] - - -@pytest.mark.parametrize("requires_enable", [False, True]) -def test_unsupported_command_mode_prevents_write_after_enable( - manifest_factory: Callable[[], DeploymentManifest], - requires_enable: bool, -) -> None: - manifest = manifest_factory() - backend = EnablingBackend(manifest.robot) if requires_enable else FakeRobotInterface(manifest.robot) - backend._capabilities = RobotCapabilities( - control_modes=(JointControlMode.SERVO,), - state_fields=backend.capabilities.state_fields, - requires_enable=requires_enable, - ) - session = _session(manifest, backend) - session.task = _TorqueDeployTask(manifest) - assert session.start() - assert not session.tick(elapsed_time_s=0.0) - session.stop() - result = session.result(steps=1) - assert result.exit_reason == "invalid_action" - assert "backend.control_modes" in result.error - assert ("enable" in backend.events) is requires_enable - assert "write" not in backend.events - assert backend.commands == [] - assert backend.events[-2:] == ["stop", "close"] - - -class _AlternatingDeployTask(_TestDeployTask): - def __init__(self, manifest: DeploymentManifest) -> None: - super().__init__(manifest) - self._next_mode = JointControlMode.SERVO - - def process_action(self, action: FloatArray) -> RobotCommand: - if self._next_mode is JointControlMode.SERVO: - self._next_mode = JointControlMode.TORQUE - return super().process_action(action) - self._next_mode = JointControlMode.SERVO - return JointTorqueCommand(np.array(action, dtype=np.float32, copy=True)) + if task_type is _TorquePolicyProcessor: + assert all(command.mode is JointControlMode.TORQUE for command in backend.commands) + np.testing.assert_array_equal(backend._position, manifest.robot.default_joint_position) + if task_type is _AlternatingPolicyProcessor: + assert [command.mode for command in backend.commands] == [ + JointControlMode.SERVO, + JointControlMode.TORQUE, + ] * 2 + runs.append((result, controller, backend)) + assert runs[0][0].trace_sha256 == runs[1][0].trace_sha256 + for first, second in zip(runs[0][1].policy.observations, runs[1][1].policy.observations, strict=True): + np.testing.assert_array_equal(first, second) -@pytest.mark.parametrize("requires_enable", [False, True]) -def test_one_session_alternates_servo_and_torque_commands( - manifest_factory: Callable[[], DeploymentManifest], - requires_enable: bool, -) -> None: - manifest = manifest_factory() - backend = EnablingBackend(manifest.robot) if requires_enable else FakeRobotInterface(manifest.robot) - backend._capabilities = RobotCapabilities( - control_modes=(JointControlMode.SERVO, JointControlMode.TORQUE), - state_fields=backend.capabilities.state_fields, - requires_enable=requires_enable, - ) - session = _session(manifest, backend) - session.task = _AlternatingDeployTask(manifest) - assert session.start() - for step in range(4): - assert session.tick(elapsed_time_s=step * session.period_s) - session.stop() - assert session.result(steps=4).success - expected_modes = [JointControlMode.SERVO, JointControlMode.TORQUE] * 2 - if requires_enable: - assert backend.events.count("enable") == 1 - assert [command.mode for command in backend.commands] == expected_modes - assert backend.events.count("open") == 1 - assert backend.events.count("write") == 4 - - -def test_switch_to_unsupported_mode_preserves_successful_tick( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +@pytest.mark.parametrize("task_type,completed", [(_TorquePolicyProcessor, 0), (_AlternatingPolicyProcessor, 1)]) +def test_unsupported_mode_is_rejected_before_backend_write(manifest_factory, task_type, completed): manifest = manifest_factory() backend = FakeRobotInterface(manifest.robot) - backend._capabilities = RobotCapabilities( - control_modes=(JointControlMode.SERVO,), - state_fields=backend.capabilities.state_fields, - ) - session = _session(manifest, backend) - session.task = _AlternatingDeployTask(manifest) - assert session.start() - assert session.tick(elapsed_time_s=0.0) - trace = session.result(steps=1).trace_sha256 - assert not session.tick(elapsed_time_s=session.period_s) - session.stop() - result = session.result(steps=2) - assert result.exit_reason == "invalid_action" - assert "backend.control_modes" in result.error - assert result.completed_steps == 1 - assert result.trace_sha256 == trace - assert len(backend.commands) == 1 - assert backend.commands[0].mode is JointControlMode.SERVO - assert backend.events.count("write") == 1 - - -@pytest.mark.parametrize("torque", [[1.0], [100.0, 0.0]]) -def test_fake_validates_torque_shape_and_limits( - manifest_factory: Callable[[], DeploymentManifest], - torque: list[float], -) -> None: - from motrix_deploy.errors import ValidationError - - backend = FakeRobotInterface(manifest_factory().robot) - backend.open() - try: - with pytest.raises(ValidationError, match="command.torque"): - backend.write_command(JointTorqueCommand(np.array(torque, dtype=np.float32))) - assert backend.commands == [] - assert "write" not in backend.events - finally: - backend.close() - - -def _loop( - manifest: DeploymentManifest, - backend: FakeRobotInterface, - *, - command_binding: CommandBinding[PlanarVelocityCommand] | None = None, -) -> tuple[HardwareRuntime, ControlSession]: - runtime = HardwareRuntime(backend, scheduler=FixedStepScheduler(manifest.control.period_s)) - return runtime, _session(manifest, backend, command_binding=command_binding) - - -def test_fake_interface_binds_readonly_spec_at_construction( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - spec = manifest_factory().robot - backend = FakeRobotInterface(spec) - - assert backend.spec is spec - with pytest.raises(AttributeError): - backend.spec = spec - backend.open() - np.testing.assert_array_equal(backend.read_state(0.1).joint_position, spec.default_joint_position) - backend.close() - - -def _session( - manifest: DeploymentManifest, - backend: FakeRobotInterface, - *, - command_binding: CommandBinding[PlanarVelocityCommand] | None = None, -) -> ControlSession: - return ControlSession( - robot=backend, - task=_TestDeployTask(manifest), - policy=ConstantPolicy(manifest.policy.input.shape[1], np.array([0.4, -0.4], dtype=np.float32)), - command_binding=command_binding or ConstantPlanarVelocityBinding([0.5, 0.0, 0.0]), - period_s=manifest.control.period_s, - state_timeout_s=manifest.control.state_timeout_s, - ) - - -class _SimulationOwnedFakeRobotInterface(FakeRobotInterface): - """Cache commands while a separate simulation callback advances state.""" - - def write_command(self, command: RobotCommand) -> None: - self._require_open() - if self._fail_write_at == self._write_count: - raise RuntimeError("injected write failure") - assert command.joint_position.shape == self._position.shape - self.commands.append(command) - self.events.append("write") - self._write_count += 1 - - def advance(self) -> None: - self._require_open() - self.events.append("advance") - previous = self._position.copy() - self._position = self.commands[-1].joint_position.copy() - self._velocity = ((self._position - previous) / np.float32(self._period_s)).astype(np.float32) - self._sample_time_ns += self._period_ns - - -class _TrackingPolicy(ConstantPolicy): - def __init__(self, input_size: int, action: FloatArray, events: list[str]) -> None: - super().__init__(input_size, action) - self.events = events - - def infer(self, observation: FloatArray) -> FloatArray: - self.events.append("infer") - return super().infer(observation) - - -def test_control_session_allows_external_simulation_advance_after_each_tick( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - manifest = manifest_factory() - backend = _SimulationOwnedFakeRobotInterface(manifest.robot) - loop = _session(manifest, backend) - policy = _TrackingPolicy(manifest.policy.input.shape[1], np.array([0.4, -0.4], dtype=np.float32), backend.events) - loop.policy = policy - - assert loop.start() - try: - for step in range(3): - assert loop.tick(elapsed_time_s=step * manifest.control.period_s) - backend.advance() - finally: - loop.stop() - result = loop.result(steps=3) - - assert result.success - assert result.completed_steps == 3 - assert result.simulation_time_s == pytest.approx(3 * manifest.control.period_s) - assert backend.events == ["open", "read", *(["read", "infer", "write", "advance"] * 3), "stop", "close"] - assert backend._sample_time_ns == 3 * backend._period_ns - np.testing.assert_array_equal(policy.observations[0], np.zeros(4, dtype=np.float32)) - np.testing.assert_allclose( - policy.observations[1][:2], backend.commands[0].joint_position - manifest.robot.default_joint_position - ) - np.testing.assert_array_equal(backend._position, backend.commands[-1].joint_position) - - -def test_standalone_driver_does_not_advance_simulation( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - manifest = manifest_factory() - backend = _SimulationOwnedFakeRobotInterface(manifest.robot) - runtime, loop = _loop(manifest, backend) - - result = runtime.run(loop, steps=3) - - assert result.success - assert backend._sample_time_ns == 0 - assert "advance" not in backend.events - np.testing.assert_array_equal(backend._position, manifest.robot.default_joint_position) - for observation in loop.policy.observations: - np.testing.assert_array_equal(observation, np.zeros(4, dtype=np.float32)) - - -def test_external_simulation_failure_preserves_completed_control_tick( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - manifest = manifest_factory() - backend = _SimulationOwnedFakeRobotInterface(manifest.robot) - session = _session(manifest, backend) - assert session.start() - assert session.tick(elapsed_time_s=0.0) - backend.events.append("advance") - session.fail(RuntimeError("simulation advance failed")) - assert not session.active - assert not session.tick(elapsed_time_s=manifest.control.period_s) - session.stop() - result = session.result(steps=3) - + backend._capabilities = replace(backend.capabilities, control_modes=(JointControlMode.SERVO,)) + runtime, _ = runtime_for(manifest, backend, task=task_type(manifest)) + result = runtime.run() assert not result.success - assert result.exit_reason == "backend_error" - assert result.error == "simulation advance failed" - assert result.completed_steps == 1 - assert result.simulation_time_s == manifest.control.period_s - assert "write" in result.latency - assert "loop" in result.latency - assert backend.events == ["open", "read", "read", "write", "advance", "stop", "close"] - assert len(backend.commands) == 1 + assert result.completed_steps == completed + assert len(backend.commands) == completed + assert "control mode" in result.error + assert backend.events[-2:] == ["stop", "close"] @pytest.mark.parametrize("response", [1.0, 0.5]) -def test_control_loop_runs_with_different_robot_responses( - manifest_factory: Callable[[], DeploymentManifest], - response: float, -) -> None: +def test_runtime_accepts_different_measured_robot_responses(manifest_factory, response): manifest = manifest_factory() backend = FakeRobotInterface(manifest.robot, response=response) - - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=5) - + runtime, _ = runtime_for(manifest, backend, steps=5) + result = runtime.run() assert result.success - assert result.exit_reason == "completed" + assert isinstance(result, RolloutResult) assert result.completed_steps == 5 - assert result.simulation_time_s == pytest.approx(0.1) + assert result.wall_time_s >= 0 + report = result.to_dict() + assert report["success"] and report["completed_steps"] == 5 + assert report["wall_time_s"] == result.wall_time_s + assert isinstance(result.latency["read"], LatencySummary) + assert report["latency"]["read"]["mean_ms"] == result.latency["read"].mean_ms assert len(backend.commands) == 5 - assert backend.events[-2:] == ["stop", "close"] - assert set(result.latency) == {"input", "read", "observation", "inference", "action", "write", "loop"} + assert set(result.latency) >= {"input", "read", "observation", "inference", "action", "write", "loop"} -def test_fixed_step_rollout_is_deterministic(manifest_factory: Callable[[], DeploymentManifest]) -> None: - manifest = manifest_factory() - first_backend = FakeRobotInterface(manifest.robot) - second_backend = FakeRobotInterface(manifest.robot) - - first_runtime, first_loop = _loop(manifest, first_backend) - second_runtime, second_loop = _loop(manifest, second_backend) - first = first_runtime.run(first_loop, steps=4) - second = second_runtime.run(second_loop, steps=4) - - assert (first.success, first.exit_reason, first.completed_steps) == ( - second.success, - second.exit_reason, - second.completed_steps, - ) - for first_command, second_command in zip(first_backend.commands, second_backend.commands, strict=True): - np.testing.assert_array_equal(first_command.joint_position, second_command.joint_position) - assert isinstance(first_loop.policy, ConstantPolicy) - assert isinstance(second_loop.policy, ConstantPolicy) - for first_observation, second_observation in zip( - first_loop.policy.observations, - second_loop.policy.observations, - strict=True, - ): - np.testing.assert_array_equal(first_observation, second_observation) - - -class _FailingBinding(CommandBinding[PlanarVelocityCommand]): - def read_command(self, *, batch_size: int = 1) -> PlanarVelocityCommand: - del batch_size - raise RuntimeError("input disconnected") - - -class _TrackingBinding(CommandBinding[PlanarVelocityCommand]): - def __init__(self) -> None: - self.batch_sizes: list[int] = [] - - def read_command(self, *, batch_size: int = 1) -> PlanarVelocityCommand: - self.batch_sizes.append(batch_size) - return PlanarVelocityCommand(np.zeros((batch_size, 3), dtype=np.float32)) - - -class _InterruptingBinding(CommandBinding[PlanarVelocityCommand]): - def __init__(self, interrupt_at: int) -> None: - self._interrupt_at = interrupt_at - self.read_count = 0 - - def read_command(self, *, batch_size: int = 1) -> PlanarVelocityCommand: - if self.read_count == self._interrupt_at: - raise KeyboardInterrupt - self.read_count += 1 - return PlanarVelocityCommand(np.zeros((batch_size, 3), dtype=np.float32)) - - -def test_control_loop_reads_one_singleton_command_batch_per_tick( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +def test_runtime_reads_singleton_commands_for_policy_ticks(manifest_factory): manifest = manifest_factory() binding = _TrackingBinding() - runtime, loop = _loop(manifest, FakeRobotInterface(manifest.robot), command_binding=binding) - loop.policy = ConstantPolicy(manifest.policy.input.shape[1], np.zeros(2, dtype=np.float32)) + runtime, _ = runtime_for(manifest, FakeRobotInterface(manifest.robot), binding=binding) + assert runtime.run().success + assert all(size == 1 for size in binding.batch_sizes) + assert len(binding.batch_sizes) >= 3 - result = runtime.run(loop, steps=3) - assert result.success - assert binding.batch_sizes == [1, 1, 1] - - -def test_control_loop_runs_without_a_step_bound_until_interrupted( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +def test_unbounded_controller_runs_until_input_interrupt(manifest_factory): manifest = manifest_factory() - binding = _InterruptingBinding(interrupt_at=3) - runtime, loop = _loop(manifest, FakeRobotInterface(manifest.robot), command_binding=binding) - loop.policy = ConstantPolicy(manifest.policy.input.shape[1], np.zeros(2, dtype=np.float32)) - - result = runtime.run(loop) - + runtime, _ = runtime_for(manifest, FakeRobotInterface(manifest.robot), steps=None, binding=_InterruptingBinding(3)) + result = runtime.run() assert not result.success assert result.exit_reason == "interrupted" assert result.completed_steps == 3 -def test_command_binding_failure_returns_input_error(manifest_factory: Callable[[], DeploymentManifest]) -> None: +def test_input_failure_is_structured_and_cleans_backend(manifest_factory): manifest = manifest_factory() backend = FakeRobotInterface(manifest.robot) - runtime, loop = _loop(manifest, backend, command_binding=_FailingBinding()) - loop.policy = ConstantPolicy(manifest.policy.input.shape[1], np.zeros(2, dtype=np.float32)) - - result = runtime.run(loop, steps=1) - - assert not result.success + runtime, _ = runtime_for(manifest, backend, binding=_FailingBinding()) + result = runtime.run() assert result.exit_reason == "input_error" assert result.error == "input disconnected" assert backend.events[-2:] == ["stop", "close"] @pytest.mark.parametrize( - ("backend_kwargs", "reason", "completed_steps"), + "options,reason,count", [ ({"fail_read_at": 0}, "state_timeout", 0), ({"unhealthy_at": 1}, "backend_unhealthy", 0), ({"fail_write_at": 2}, "backend_write_error", 2), ], ) -def test_backend_failures_return_structured_results_and_cleanup( - manifest_factory: Callable[[], DeploymentManifest], - backend_kwargs: dict[str, int], - reason: str, - completed_steps: int, -) -> None: +def test_backend_failure_preserves_result_and_cleanup(manifest_factory, options, reason, count): manifest = manifest_factory() - backend = FakeRobotInterface(manifest.robot, **backend_kwargs) - - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=5) - + backend = FakeRobotInterface(manifest.robot, **options) + runtime, _ = runtime_for(manifest, backend, steps=5) + result = runtime.run() assert not result.success assert result.exit_reason == reason - assert result.completed_steps == completed_steps + assert result.completed_steps == count assert backend.events[-2:] == ["stop", "close"] -def test_backend_open_validation_failure_cleans_up_before_first_command( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - class InvalidRobot(FakeRobotInterface): - def open(self) -> None: - self.events.append("open") - raise ValidationError("backend.joint_names", "matching robot joints", "missing_joint") +@pytest.mark.parametrize( + "kind,reason", + [ + ("invalid", "invalid_state"), + ("stale", "state_timeout"), + ("backwards", "invalid_state"), + ], +) +def test_runtime_validates_state_contract_and_freshness(manifest_factory, kind, reason): + manifest = manifest_factory() + + class StateBackend(FakeRobotInterface): + def read_state(self, timeout_s): + state = super().read_state(timeout_s) + if kind == "invalid": + return None + if kind == "stale": + return replace(state, receive_time_ns=time.monotonic_ns() - 1_000_000_000) + if self._read_count > 1: + return replace(state, sample_time_ns=0) + return replace(state, sample_time_ns=10) + + backend = StateBackend(manifest.robot) + runtime, _ = runtime_for(manifest, backend) + result = runtime.run() + assert not result.success and result.exit_reason == reason + assert backend.events[-2:] == ["stop", "close"] + +def test_open_validation_failure_cleans_before_first_command(manifest_factory): manifest = manifest_factory() - backend = InvalidRobot(manifest.robot) - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=2) + class InvalidRobot(FakeRobotInterface): + def open(self): + self.events.append("open") + raise ValidationError("backend.joint_names", "matching joints", "missing") + backend = InvalidRobot(manifest.robot) + runtime, _ = runtime_for(manifest, backend) + result = runtime.run() assert result.exit_reason == "validation_error" assert result.completed_steps == 0 - assert backend.commands == [] assert backend.events == ["open", "stop", "close"] -class InterruptingBackend(FakeRobotInterface): - def read_state(self, timeout_s: float): - del timeout_s - raise KeyboardInterrupt - - -def test_user_interrupt_returns_result_and_cleans_up(manifest_factory: Callable[[], DeploymentManifest]) -> None: +@pytest.mark.parametrize( + "error,reason", [(KeyboardInterrupt(), "interrupted"), (LieDownRequestedError("lie down"), "lie_down")] +) +def test_runtime_interrupts_reach_backend_cleanup(manifest_factory, error, reason): manifest = manifest_factory() - backend = InterruptingBackend(manifest.robot) - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=2) + class InterruptedRobot(FakeRobotInterface): + def read_state(self, timeout_s): + raise error - assert result.exit_reason == "interrupted" + backend = InterruptedRobot(manifest.robot) + runtime, _ = runtime_for(manifest, backend) + assert runtime.run().exit_reason == reason assert backend.events[-2:] == ["stop", "close"] -class InvalidStateBackend(FakeRobotInterface): - def read_state(self, timeout_s: float): - del timeout_s - return None - - -def test_invalid_state_fails_and_lifecycle_cleanup_is_idempotent( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +def test_host_running_check_failure_stops_before_command_and_cleans_up(manifest_factory, monkeypatch): manifest = manifest_factory() - backend = InvalidStateBackend(manifest.robot) - - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=2) - events_after_run = list(backend.events) - backend.stop() - backend.close() - - assert result.exit_reason == "invalid_state" - assert result.completed_steps == 0 - assert backend.events == events_after_run - - -def test_realtime_scheduler_uses_absolute_deadlines() -> None: - now = [1_000_000_000] - sleeps: list[float] = [] - - def clock_ns() -> int: - return now[0] - - def sleep(duration: float) -> None: - sleeps.append(duration) - now[0] += round(duration * 1e9) - - scheduler = RealtimeScheduler(0.02, clock_ns=clock_ns, sleep=sleep) - scheduler.reset() - scheduler.wait(1) - now[0] += 5_000_000 - scheduler.wait(2) - - assert sleeps == pytest.approx([0.02, 0.015]) - assert scheduler.elapsed_time_s(2) == pytest.approx(0.04) - - -class EnablingBackend(FakeRobotInterface): - def __init__(self, spec: RobotSpec, *, sample_period_s: float = 0.02) -> None: - super().__init__(spec, sample_period_s=sample_period_s) - self._capabilities = RobotCapabilities( - control_modes=("joint_servo",), - state_fields=self._capabilities.state_fields, - max_command_rate_hz=1.0 / sample_period_s, - requires_enable=True, - ) - self.enabled = False - - def enable(self) -> None: - assert "write" not in self.events - self.events.append("enable") - self.enabled = True - - def write_command(self, command: RobotCommand) -> None: - assert self.enabled - super().write_command(command) + backend = FakeRobotInterface(manifest.robot) + runtime, _ = runtime_for(manifest, backend) + def reject_interval(): + raise RuntimeError("host stopped") -class LieDownBackend(FakeRobotInterface): - def write_command(self, command: RobotCommand) -> None: - del command - raise LieDownRequestedError("remote B requested lie-down shutdown") + monkeypatch.setattr(runtime, "_check_running", reject_interval) + result = runtime.run() + assert result.exit_reason == "backend_error" + assert result.error == "host stopped" + assert not backend.commands + assert backend.events[-2:] == ["stop", "close"] -def test_lie_down_request_returns_structured_result_and_cleans_up( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +@pytest.mark.parametrize("phase", ["reset", "wait"]) +def test_scheduler_failures_preserve_commands_and_cleanup(manifest_factory, phase): manifest = manifest_factory() - backend = LieDownBackend(manifest.robot) + backend = FakeRobotInterface(manifest.robot) + scheduler = FixedStepScheduler(manifest.control.period_s) - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=1) + def fail(*args): + raise RuntimeError("scheduler failed") - assert not result.success - assert result.exit_reason == "lie_down" - assert result.completed_steps == 0 + setattr(scheduler, phase, fail) + runtime, _ = runtime_for(manifest, backend, scheduler=scheduler) + result = runtime.run() + assert result.exit_reason == "backend_error" + assert result.error == "scheduler failed" + assert len(backend.commands) == (1 if phase == "wait" else 0) assert backend.events[-2:] == ["stop", "close"] -@pytest.mark.parametrize("terminate_at", [0, 1, 3]) -def test_task_termination_prevents_inference_and_commands( - manifest_factory: Callable[[], DeploymentManifest], terminate_at: int -) -> None: +@pytest.mark.parametrize("prior_failure", [False, True]) +def test_cleanup_error_preserves_prior_failure_and_attempts_close(manifest_factory, prior_failure): manifest = manifest_factory() - backend = EnablingBackend(manifest.robot) if terminate_at == 0 else FakeRobotInterface(manifest.robot) - runtime, loop = _loop(manifest, backend) - checks = [] - - def check(state: RobotState) -> str | None: - checks.append(state) - return "task fell" if len(checks) - 1 == terminate_at else None - - loop.task.check_termination = check - result = runtime.run(loop, steps=5) - - assert result.exit_reason == "task_terminated" - assert result.error == "task fell" - assert not result.success - assert result.completed_steps == max(0, terminate_at - 1) - assert len(loop.policy.observations) == result.completed_steps - assert len(backend.commands) == result.completed_steps - if terminate_at == 0: - assert "enable" not in backend.events - assert backend.events[-2:] == ["stop", "close"] + backend = FakeRobotInterface(manifest.robot, fail_write_at=0 if prior_failure else None) + def fail_stop(): + backend.events.append("stop-failed") + raise RuntimeError("cleanup failed") -def test_task_termination_checks_state_after_enable_before_inference( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - manifest = manifest_factory() - backend = EnablingBackend(manifest.robot) - runtime, loop = _loop(manifest, backend) - loop.task.check_termination = lambda state: "fell after enable" if backend.enabled else None - result = runtime.run(loop, steps=1) - assert result.exit_reason == "task_terminated" - assert result.completed_steps == 0 - assert backend.commands == [] - assert loop.policy.observations == [] - assert backend.events == ["open", "read", "enable", "read", "stop", "close"] + backend.stop = fail_stop + runtime, _ = runtime_for(manifest, backend, steps=1) + result = runtime.run() + assert result.exit_reason == ("backend_write_error" if prior_failure else "cleanup_error") + assert backend.events[-2:] == ["stop-failed", "close"] -def test_task_termination_hook_failure_has_task_error_and_cleanup( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +def test_finite_controller_validates_final_measured_state(manifest_factory): manifest = manifest_factory() backend = FakeRobotInterface(manifest.robot) - runtime, loop = _loop(manifest, backend) - - def fail(state: RobotState) -> str | None: - raise RuntimeError("termination failed") - - loop.task.check_termination = fail - result = runtime.run(loop, steps=1) - assert result.exit_reason == "task_termination_error" - assert result.error == "termination failed" - assert backend.commands == [] + task = _TestPolicyProcessor(manifest) + task.check_termination = lambda state: ( + "final state unsafe" if state.sample_time_ns >= 2 * backend._period_ns else None + ) + runtime, _ = runtime_for(manifest, backend, task=task, steps=2) + result = runtime.run() + assert not result.success and result.exit_reason == "task_terminated" + assert result.completed_steps == 2 + assert len(backend.commands) == 2 assert backend.events[-2:] == ["stop", "close"] -def test_required_enable_completes_before_first_policy_write( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +def test_controller_receives_post_enable_measurements_and_resets_history(manifest_factory): manifest = manifest_factory() backend = EnablingBackend(manifest.robot) - - runtime, control = _loop(manifest, backend) - result = runtime.run(control, steps=1) - + task = _StatefulPolicyProcessor(manifest) + model = _StatefulPolicy() + runtime, _ = runtime_for(manifest, backend, task=task, model=model) + result = runtime.run() assert result.success - assert backend.events[:6] == ["open", "read", "enable", "read", "read", "write"] + assert backend.events.index("enable") < backend.events.index("write") + assert model.reset_count >= 1 + assert [context.step for context in task.contexts] == [0, 1, 2] + assert [context.elapsed_time_s for context in task.contexts] == pytest.approx([0, 0.02, 0.04]) -def test_enable_does_not_process_a_synthetic_policy_action(manifest_factory) -> None: - manifest = manifest_factory() - backend = EnablingBackend(manifest.robot) - session = _session(manifest, backend) - actions = [] - process_action = session.task.process_action - - def record_action(action): - actions.append(np.array(action, copy=True)) - return process_action(action) - - session.task.process_action = record_action - assert session.start() - assert actions == [] - assert session.tick(elapsed_time_s=0.0) - assert len(actions) == 1 - session.stop() - assert session.result(steps=1).success +def test_realtime_scheduler_uses_absolute_deadlines(): + now = [1_000_000_000] + sleeps = [] + def sleep(duration): + sleeps.append(duration) + now[0] += round(duration * 1e9) -def test_direct_session_lifecycle_is_single_use_and_cleanup_is_explicit( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: - manifest = manifest_factory() - backend = FakeRobotInterface(manifest.robot) - session = _session(manifest, backend) - assert not session.active - assert not session.tick(elapsed_time_s=0.0) - assert session.start() - assert session.start() - assert backend.events == ["open", "read"] - assert session.tick(elapsed_time_s=7.25) - assert session.completed_steps == 1 - assert session.active - session.stop() - events = list(backend.events) - session.stop() - assert not session.start() - assert not session.tick(elapsed_time_s=8.0) - assert not session.active - assert backend.events == events - result = session.result(steps=1, overrun_count=2) - assert result.success - assert result.overrun_count == 2 - assert result.simulation_time_s == manifest.control.period_s - assert not session.result(steps=None).success - assert not session.result(steps=2).success - assert session.result(steps=1).wall_time_s == result.wall_time_s + scheduler = RealtimeScheduler(0.02, clock_ns=lambda: now[0], sleep=sleep) + scheduler.reset() + scheduler.wait(1) + now[0] += 5_000_000 + scheduler.wait(2) + assert sleeps == pytest.approx([0.02, 0.015]) + assert scheduler.elapsed_time_s(2) == pytest.approx(0.04) + now[0] += 25_000_000 + scheduler.wait(3) + assert scheduler.overrun_count == 1 + scheduler.reset() + assert scheduler.overrun_count == 0 -def test_failed_start_records_error_without_implicit_cleanup( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +@pytest.mark.parametrize( + "fault,reason", + [ + ("enable", "backend_enable_error"), + ("termination", "task_termination_error"), + ("observation", "invalid_observation"), + ("inference", "policy_error"), + ("action", "invalid_action"), + ], +) +def test_policy_and_enable_failures_keep_structured_error(manifest_factory, fault, reason): manifest = manifest_factory() - backend = FakeRobotInterface(manifest.robot, fail_read_at=0) - session = _session(manifest, backend) - assert not session.start() - assert not session.start() - assert not session.active - assert not session.tick(elapsed_time_s=0.0) - assert "stop" not in backend.events - session.stop() - assert session.result(steps=1).exit_reason == "state_timeout" + backend = EnablingBackend(manifest.robot) + task = _TestPolicyProcessor(manifest) + model = ConstantPolicy(4, np.zeros(2, np.float32)) + + def fail(*args): + raise RuntimeError("injected boundary failure") + + target, method = { + "enable": (backend, "enable"), + "termination": (task, "check_termination"), + "observation": (task, "build_observation"), + "inference": (model, "infer"), + "action": (task, "process_action"), + }[fault] + setattr(target, method, fail) + runtime, _ = runtime_for(manifest, backend, task=task, model=model) + result = runtime.run() + assert not result.success and result.exit_reason == reason + assert result.error == "injected boundary failure" + assert result.completed_steps == 0 + assert backend.commands == [] assert backend.events[-2:] == ["stop", "close"] -class _StatefulTask(_TestDeployTask): - def __init__(self, manifest: DeploymentManifest) -> None: - super().__init__(manifest) - self.contexts: list[PolicyContext[PlanarVelocityCommand]] = [] - self.reset_contexts: list[PolicyContext[PlanarVelocityCommand]] = [] +class DeterministicController: + """A deterministic controller that does not contain a model or task adapter.""" - def reset(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> None: - super().reset(state, context) - self.reset_contexts.append(context) + def reset(self, state): + self.position = state.joint_position.copy() + self.calls = 0 + self.stop_requested = False - def build_observation(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> FloatArray: - self.contexts.append(context) - observation = super().build_observation(state, context) - observation[:2] += self._previous_action - observation[2:] += np.float32(context.elapsed_time_s) - return observation + def request_stop(self): + self.stop_requested = True + def step(self, state, context): + self.command = context.command + if self.stop_requested or self.calls == 2: + return ControllerStep(complete=True) + self.calls += 1 + return ControllerStep(command=JointTorqueCommand(np.zeros_like(state.joint_position))) -class _StatefulPolicy(ConstantPolicy): - def __init__(self) -> None: - super().__init__(4, np.zeros(2, dtype=np.float32)) - self.reset_count = 0 - self.counter = 99 - - def reset(self) -> None: - self.reset_count += 1 - self.counter = 0 - - def infer(self, observation: FloatArray) -> FloatArray: - super().infer(observation) - self.counter += 1 - return np.tanh(observation[:2] + np.float32(self.counter * 0.1)).astype(np.float32) - - -@pytest.mark.parametrize("enabling", [False, True]) -def test_stateful_session_and_standalone_driver_have_identical_trace_and_reset_semantics( - manifest_factory: Callable[[], DeploymentManifest], - enabling: bool, -) -> None: - manifest = manifest_factory() - backend_type = EnablingBackend if enabling else FakeRobotInterface - direct = _session(manifest, backend_type(manifest.robot)) - runtime, driver = _loop(manifest, backend_type(manifest.robot)) - for executor in (direct, driver): - executor.task = _StatefulTask(manifest) - executor.policy = _StatefulPolicy() - assert direct.start() - for step in range(4): - assert direct.tick(elapsed_time_s=step * direct.period_s) - direct.stop() - direct_result = direct.result(steps=4) - driver_result = runtime.run(driver, steps=4) - assert direct_result.success and driver_result.success - assert direct_result.trace_sha256 == driver_result.trace_sha256 - assert direct.robot.events == driver.robot.events - for executor in (direct, driver): - assert executor.policy.reset_count == (2 if enabling else 1) - assert len(executor.task.reset_contexts) == (3 if enabling else 1) - assert [context.step for context in executor.task.contexts] == list(range(4)) - assert [context.elapsed_time_s for context in executor.task.contexts] == pytest.approx( - [step * executor.period_s for step in range(4)] - ) - for first, second in zip(direct.policy.observations, driver.policy.observations, strict=True): - np.testing.assert_array_equal(first, second) - for first, second in zip(direct.robot.commands, driver.robot.commands, strict=True): - np.testing.assert_array_equal(first.joint_position, second.joint_position) - -def test_direct_session_uses_supplied_simulation_relative_context_time( - manifest_factory: Callable[[], DeploymentManifest], -) -> None: +def test_missing_required_command_fails_before_inference_and_write(manifest_factory): manifest = manifest_factory() - session = _session(manifest, FakeRobotInterface(manifest.robot)) - task = _StatefulTask(manifest) - session.task = task - assert session.start() - assert session.tick(elapsed_time_s=0.125) - assert session.tick(elapsed_time_s=0.75) - session.stop() - assert task.reset_contexts[0].elapsed_time_s == 0.125 - assert [context.elapsed_time_s for context in task.contexts] == [0.125, 0.75] - assert session.result(steps=2).simulation_time_s == 2 * session.period_s + backend = FakeRobotInterface(manifest.robot) + model = ConstantPolicy(4, np.zeros(2, np.float32)) + session = ControlSession( + robot=backend, + controller=PolicyController(_TestPolicyProcessor(manifest), model, steps=1), + period_s=0.02, + state_timeout_s=0.1, + ) + runtime = HardwareRuntime(backend, realtime=False) + runtime.bind_session(session) + result = runtime.run() + assert result.exit_reason == "input_error" + assert not model.observations + assert not backend.commands + assert backend.events[-2:] == ["stop", "close"] -@pytest.mark.parametrize("phase", ["reset", "wait"]) -def test_driver_scheduler_failure_is_recorded_and_cleans_up( - manifest_factory: Callable[[], DeploymentManifest], - phase: str, -) -> None: +def test_control_executes_model_free_controller_and_reports_generic_completion(manifest_factory): manifest = manifest_factory() backend = FakeRobotInterface(manifest.robot) - runtime, loop = _loop(manifest, backend) - - def fail(*args) -> None: - raise RuntimeError("scheduler failed") - - setattr(runtime.scheduler, phase, fail) - result = runtime.run(loop, steps=1) - assert result.exit_reason == "backend_error" - assert result.error == "scheduler failed" - assert result.completed_steps == 0 + controller = DeterministicController() + session = ControlSession( + controller=controller, + robot=backend, + period_s=0.02, + state_timeout_s=0.1, + ) + runtime = HardwareRuntime(backend, realtime=False) + runtime.bind_session(session) + result = runtime.run() + assert result.success + assert result.completed_steps == 0 # Deterministic commands are not model ticks. + assert len(backend.commands) == 2 + assert controller.calls == 2 + assert controller.command is None assert backend.events[-2:] == ["stop", "close"] -@pytest.mark.parametrize("prior_failure", [False, True]) -def test_cleanup_errors_do_not_replace_existing_failure_and_close_is_attempted( - manifest_factory: Callable[[], DeploymentManifest], - prior_failure: bool, -) -> None: +def test_control_requested_stop_is_controller_owned_and_cleanup_is_idempotent(manifest_factory): manifest = manifest_factory() backend = FakeRobotInterface(manifest.robot) - session = _session(manifest, backend) + controller = DeterministicController() + session = ControlSession( + controller=controller, + robot=backend, + period_s=0.02, + state_timeout_s=0.1, + ) assert session.start() assert session.tick(elapsed_time_s=0.0) - - def fail_stop() -> None: - backend.events.append("stop-failed") - raise RuntimeError("cleanup failed") - - backend.stop = fail_stop - if prior_failure: - session.fail(LieDownRequestedError("lie down")) + session.request_stop() + assert not session.tick(elapsed_time_s=0.02) session.stop() + events = list(backend.events) session.stop() - result = session.result(steps=1) - assert result.exit_reason == ("lie_down" if prior_failure else "cleanup_error") - assert result.error == ("lie down" if prior_failure else "cleanup failed") - assert backend.events[-2:] == ["stop-failed", "close"] + assert backend.events == events + assert session.result().success + assert len(backend.commands) == 1 diff --git a/motrix_deploy/tests/test_runtime_binding.py b/motrix_deploy/tests/test_runtime_binding.py index f64b75a6..74cef5f2 100644 --- a/motrix_deploy/tests/test_runtime_binding.py +++ b/motrix_deploy/tests/test_runtime_binding.py @@ -1,64 +1,102 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Runtime/control ownership binding contracts.""" +"""Runtime binds robot session; session binds a backend-independent controller.""" from types import SimpleNamespace +import numpy as np import pytest +from controller_helpers import ConstantPolicy, _TestPolicyProcessor from fake_robot import FakeRobotInterface -from test_runtime import _session import motrix_deploy.runtime.factory as runtime_factory from motrix_deploy.errors import ValidationError +from motrix_deploy.runtime.control import ControlSession, PolicyController from motrix_deploy.runtime.factory import create_hardware_runtime from motrix_deploy.runtime.hardware import HardwareRuntime -from motrix_deploy.runtime.scheduler import FixedStepScheduler +from motrix_env_core.input import ConstantPlanarVelocityBinding -def test_hardware_runtime_runs_bound_control_without_duplicate_session(manifest_factory): - manifest = manifest_factory() - robot = FakeRobotInterface(manifest.robot) - control = _session(manifest, robot) - runtime = HardwareRuntime(robot, scheduler=FixedStepScheduler(manifest.control.period_s)) +def make_controller(manifest, steps=2): + return PolicyController(_TestPolicyProcessor(manifest), ConstantPolicy(4, np.zeros(2, np.float32)), steps=steps) - runtime.bind_control_session(control) - assert runtime.control is control - result = runtime.run(steps=2) - assert result.success - assert runtime.control is control - assert robot.events[-2:] == ["stop", "close"] +def bind(runtime, controller, period_s=0.02): + session = ControlSession( + controller=controller, + robot=runtime.robot, + command_binding=ConstantPlanarVelocityBinding((0, 0, 0)), + period_s=period_s, + state_timeout_s=0.1, + ) + runtime.bind_session(session) + return session -def test_binding_rejects_conflicting_robot_and_duplicate_control(manifest_factory): +def test_runtime_rejects_conflicting_session_binding(manifest_factory): manifest = manifest_factory() - robot = FakeRobotInterface(manifest.robot) - other = FakeRobotInterface(manifest.robot) - runtime = HardwareRuntime(robot) - first = _session(manifest, robot) - second = _session(manifest, robot) - foreign = _session(manifest, other) - - runtime.bind_control_session(first) - runtime.bind_control_session(first) - with pytest.raises(ValidationError, match="already bound"): - runtime.bind_control_session(second) - with pytest.raises(ValidationError, match="runtime.control.robot"): - runtime.bind_control_session(foreign) - with pytest.raises(ValidationError, match="already bound"): - runtime.run(second, steps=1) - - -def test_unbound_hardware_runtime_requires_control(manifest_factory): + runtime = HardwareRuntime(FakeRobotInterface(manifest.robot), realtime=False) + first = bind(runtime, make_controller(manifest)) + with pytest.raises(ValidationError, match="bound"): + bind(runtime, make_controller(manifest)) + assert runtime.session is first + + +def test_runtime_rejects_session_for_another_robot(manifest_factory): manifest = manifest_factory() - runtime = HardwareRuntime(FakeRobotInterface(manifest.robot)) + runtime = HardwareRuntime(FakeRobotInterface(manifest.robot), realtime=False) + foreign = ControlSession( + controller=make_controller(manifest), + robot=FakeRobotInterface(manifest.robot), + command_binding=ConstantPlanarVelocityBinding((0, 0, 0)), + period_s=0.02, + state_timeout_s=0.1, + ) + with pytest.raises(ValidationError, match="robot"): + runtime.bind_session(foreign) + assert runtime.session is None + + +def test_unbound_runtime_requires_session(manifest_factory): + runtime = HardwareRuntime(FakeRobotInterface(manifest_factory().robot), realtime=False) + with pytest.raises(ValidationError, match="session"): + runtime.run() + + +def test_session_supplies_its_execution_period_to_controller(manifest_factory): + manifest = manifest_factory() + controller = make_controller(manifest) + contexts = [] + step = controller.step + + def observe(state, context): + contexts.append(context) + return step(state, context) - with pytest.raises(ValidationError, match="runtime.control"): - runtime.run(steps=1) + controller.step = observe + runtime = HardwareRuntime(FakeRobotInterface(manifest.robot), realtime=False) + session = bind(runtime, controller, period_s=0.04) + assert runtime.run().success + assert session.period_s == 0.04 + assert [context.dt_s for context in contexts] == [0.04, 0.04, 0.04] + assert [context.elapsed_time_s for context in contexts] == pytest.approx([0, 0.04, 0.08]) -def test_hardware_factory_prepares_robot_for_explicit_control_binding(monkeypatch, manifest_factory): +@pytest.mark.parametrize("period,timeout", [(0.0, 0.1), (0.02, 0.0)]) +def test_session_validates_public_timing_boundary(manifest_factory, period, timeout): + manifest = manifest_factory() + with pytest.raises(ValidationError): + ControlSession( + controller=make_controller(manifest), + robot=FakeRobotInterface(manifest.robot), + command_binding=ConstantPlanarVelocityBinding((0, 0, 0)), + period_s=period, + state_timeout_s=timeout, + ) + + +def test_factory_produces_host_for_explicit_session_binding(monkeypatch, manifest_factory): manifest = manifest_factory() robot = FakeRobotInterface(manifest.robot) calls = [] @@ -69,24 +107,19 @@ def factory(config, context): entry = SimpleNamespace(name="fake", value="fake:factory", load=lambda: factory) monkeypatch.setattr(runtime_factory, "_runtime_entry_points", lambda: (entry,)) - context = runtime_factory.RuntimeCreateContext(robot=manifest.robot, control=manifest.control) - config = {} - runtime = create_hardware_runtime("fake", config, context) - assert calls == [(config, context)] - assert runtime.robot is robot - assert not runtime.opened - assert robot.events == [] - - control = _session(manifest, runtime.robot) - runtime.bind_control_session(control) - assert runtime.control is control - assert control.robot is runtime.robot + runtime = create_hardware_runtime("fake", {}, context) + assert calls == [({}, context)] + assert runtime.robot is robot and not runtime.opened + controller = make_controller(manifest, steps=2) + session = bind(runtime, controller) + assert runtime.session is session and session.controller is controller assert robot.events == [] - with runtime: - assert runtime.opened - result = runtime.run(steps=1) - assert result.success + assert runtime.opened and runtime.session is session + result = runtime.run() + assert result.success and result.completed_steps == 2 + assert len(robot.commands) == 2 + assert runtime.session is session assert robot.events[-2:] == ["stop", "close"] assert not runtime.opened diff --git a/motrix_deploy/tests/test_simulation_config.py b/motrix_deploy/tests/test_simulation_config.py new file mode 100644 index 00000000..de7d6da4 --- /dev/null +++ b/motrix_deploy/tests/test_simulation_config.py @@ -0,0 +1,70 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Simulation scene, timing and sensor recipe decoding contracts.""" + +from copy import deepcopy + +import pytest + +from motrix_deploy.errors import ValidationError +from motrix_deploy.runtime.config import SensorBindings, SimulationRuntimeConfig +from motrix_env_core.config.scene import SceneCfg +from motrix_env_core.config.sim import SimCfg + + +def test_from_mapping_decodes_recipe_without_mutating_input(): + scene = SceneCfg() + nested = { + "physics": {"dt": 0.005, "solver_iterations": 25, "solver_tolerance": 0.0001, "gravity": (0.0, 0.0, -9.81)}, + "sensor_bindings": { + "base_angular_velocity": "gyro", + "base_linear_acceleration": "accelerometer", + "base_linear_velocity": "velocimeter", + }, + } + original = deepcopy(nested) + values = {"name": "generic-backend", "scene": scene, **nested} + config = SimulationRuntimeConfig.from_mapping(values, render=True, realtime=False) + assert config.scene is scene + assert isinstance(config.physics, SimCfg) + for name, value in nested["physics"].items(): + assert getattr(config.physics, name) == value + assert config.sensor_bindings == SensorBindings(**nested["sensor_bindings"]) + assert config.render is True + assert config.realtime is False + assert {name: values[name] for name in nested} == original + + +def test_from_mapping_supplies_independent_optional_defaults(): + values = {"scene": SceneCfg(), "physics": {"dt": 0.005, "solver_iterations": 25}} + first = SimulationRuntimeConfig.from_mapping(values) + second = SimulationRuntimeConfig.from_mapping(values) + assert first.sensor_bindings == SensorBindings() + assert first.render is False + assert first.realtime is None + assert first.sensor_bindings is not second.sensor_bindings + assert first.physics is not second.physics + assert set(values) == {"scene", "physics"} + + +def test_from_mapping_rejects_unknown_top_level_fields(): + unknown_name = "unrecognized_option" + values = {"scene": SceneCfg(), "physics": {"dt": 0.005, "solver_iterations": 25}, unknown_name: True} + with pytest.raises(ValidationError) as error: + SimulationRuntimeConfig.from_mapping(values) + assert error.value.path == "runtime" + assert unknown_name in str(error.value) + + +@pytest.mark.parametrize("section", ["physics", "sensor_bindings"]) +def test_from_mapping_rejects_unknown_nested_fields(section): + unknown_name = "unrecognized_option" + values = { + "scene": SceneCfg(), + "physics": {"dt": 0.005, "solver_iterations": 25}, + "sensor_bindings": {"base_angular_velocity": "gyro"}, + } + values[section][unknown_name] = True + with pytest.raises(TypeError, match=unknown_name): + SimulationRuntimeConfig.from_mapping(values) diff --git a/motrix_deploy/tests/test_simulation_runtime.py b/motrix_deploy/tests/test_simulation_runtime.py index 013a2460..7ea23d79 100644 --- a/motrix_deploy/tests/test_simulation_runtime.py +++ b/motrix_deploy/tests/test_simulation_runtime.py @@ -30,7 +30,13 @@ def __init__(self): def robot(self): return self._robot - def run(self, control, *, steps=None): + def advance_control_period(self): + pass + + def _physics_time_s(self): + return 0.0 + + def run(self): raise NotImplementedError calls = [] diff --git a/motrix_deploy/tests/test_task_plugins.py b/motrix_deploy/tests/test_task_plugins.py index 42cffe63..bb2e5875 100644 --- a/motrix_deploy/tests/test_task_plugins.py +++ b/motrix_deploy/tests/test_task_plugins.py @@ -1,15 +1,21 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Deployment task plugin discovery and loading boundary.""" +"""Deployment task plugin discovery and complete controller loading boundary.""" from types import SimpleNamespace from unittest.mock import Mock +import numpy as np import pytest +from controller_helpers import ConstantPolicy +from fake_robot import FakeRobotInterface from task_specs import TestDeployTask as FixtureDeployTask from motrix_deploy import task as task_module +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import ControlSession +from motrix_deploy.runtime.hardware import HardwareRuntime from motrix_deploy.task import TASK_ENTRY_POINT_GROUP, available_tasks, create_task @@ -21,6 +27,10 @@ def entry_points(*, group): monkeypatch.setattr(task_module.metadata, "entry_points", entry_points) +def policy(): + return ConstantPolicy(4, np.zeros(2, np.float32)) + + def test_listing_is_sorted_and_lazy(monkeypatch): entries = [SimpleNamespace(name=name, load=Mock()) for name in ("other/v1", "test/v1")] _install(monkeypatch, entries) @@ -29,24 +39,36 @@ def test_listing_is_sorted_and_lazy(monkeypatch): entry.load.assert_not_called() -def test_selected_class_receives_artifact_contract(monkeypatch, manifest_factory): +def test_selected_class_receives_policy_and_budget_and_executes_as_session_controller(monkeypatch, manifest_factory): manifest = manifest_factory() selected = SimpleNamespace(name=manifest.task.name, load=Mock(return_value=FixtureDeployTask)) other = SimpleNamespace(name="other/v1", load=Mock()) _install(monkeypatch, [other, selected]) - task = create_task(manifest.task, manifest.robot) + model = policy() + task = create_task(manifest.task, manifest.robot, model, steps=2) assert isinstance(task, FixtureDeployTask) assert task.spec is manifest.task assert task.robot is manifest.robot + assert task.policy is model + assert task.steps == 2 selected.load.assert_called_once_with() other.load.assert_not_called() + backend = FakeRobotInterface(manifest.robot) + session = ControlSession(robot=backend, controller=task, period_s=0.02, state_timeout_s=0.1) + runtime = HardwareRuntime(backend, realtime=False) + runtime.bind_session(session) + result = runtime.run() + assert result.success + assert session.controller is task + assert len(task.states) == 2 + assert backend.events[-2:] == ["stop", "close"] def test_missing_plugin_reports_available_names(monkeypatch, manifest_factory): manifest = manifest_factory() _install(monkeypatch, [SimpleNamespace(name="other/v1", load=Mock())]) with pytest.raises(ValueError, match="test/v1.*available tasks: other/v1"): - create_task(manifest.task, manifest.robot) + create_task(manifest.task, manifest.robot, policy()) def test_duplicate_plugins_fail_before_loading(monkeypatch, manifest_factory): @@ -54,7 +76,7 @@ def test_duplicate_plugins_fail_before_loading(monkeypatch, manifest_factory): entries = [SimpleNamespace(name=manifest.task.name, load=Mock()) for _ in range(2)] _install(monkeypatch, entries) with pytest.raises(ValueError, match="Multiple deployment task plugins"): - create_task(manifest.task, manifest.robot) + create_task(manifest.task, manifest.robot, policy()) for entry in entries: entry.load.assert_not_called() @@ -64,4 +86,22 @@ def test_invalid_plugin_class_contract(monkeypatch, manifest_factory, factory): manifest = manifest_factory() _install(monkeypatch, [SimpleNamespace(name=manifest.task.name, load=Mock(return_value=factory))]) with pytest.raises(TypeError, match="Deployment task plugin test/v1"): - create_task(manifest.task, manifest.robot) + create_task(manifest.task, manifest.robot, policy()) + + +def test_plugin_task_exposes_root_reset_step_and_stop(manifest_factory): + manifest = manifest_factory() + task = create_task(manifest.task, manifest.robot, policy()) + backend = FakeRobotInterface(manifest.robot) + backend.open() + try: + state = backend.read_state(0.1) + task.reset(state) + assert task.step(state, ControlContext(0, 0.0, None, dt_s=0.02)).complete + task.request_stop() + assert task.stop_requested + task.reset(state) + assert task.states == [state] + assert not task.stop_requested + finally: + backend.close() diff --git a/motrix_deploy_motrixsim/README.md b/motrix_deploy_motrixsim/README.md index 1812ccd9..2e8bb8ca 100644 --- a/motrix_deploy_motrixsim/README.md +++ b/motrix_deploy_motrixsim/README.md @@ -32,40 +32,38 @@ MotrixSim is supplied by `motrix-env-motrixsim`, using the workspace's pinned SD ## Explicit runtime and controller assembly -`create_simulation_runtime("motrixsim", config)` accepts a complete `SimulationRuntimeConfig`. -The factory returns a prepared host with `runtime.robot` and its read-only `spec` -available before opening. Construct the task, policy, command binding, and control -session in the application: +`create_simulation_runtime("motrixsim", config)` accepts a complete `SimulationRuntimeConfig` +and returns a prepared host with `runtime.robot` and its read-only `spec` available before +opening. Task, model, and command binding are application-owned components assembled +explicitly: ```python from motrix_deploy.runtime.control import ControlSession from motrix_deploy.runtime.factory import create_simulation_runtime +from motrix_deploy.task import create_task runtime = create_simulation_runtime("motrixsim", config) robot = runtime.robot -control = ControlSession( +task = create_task(task_spec, robot.spec, model, steps=50) +session = ControlSession( robot=robot, - task=task, - policy=policy, + controller=task, command_binding=command_binding, period_s=0.02, + state_timeout_s=0.1, ) -runtime.bind_control_session(control) +runtime.bind_session(session) with runtime: - result = runtime.run(steps=50) + result = runtime.run() ``` -Here `config` contains the complete scene, physics, state sources, and rendering -settings; `task`, `policy`, and `command_binding` are application-owned components. -A robot-dependent task can be built from `robot.spec` after creation. Runtime factories -do not construct controllers through callbacks. Direct callers can also pass a -session to `runtime.run(control, steps=...)`. - -`ControlSession.period_s` is the single control-period setting. Binding or resolving -the session validates that it is an integer multiple of `config.physics.dt`. -The runtime owns the compiled MSD world, model, data, optional viewer, and physics -advancement. Robot ports delegate I/O only: `open()` takes no spec, writes cache targets, -and neither reads nor writes advance physics or close the world. +`config` contains the complete scene, physics, state sources, and rendering settings. The +control period must be an integer multiple of `config.physics.dt` and is validated when +the session is bound. The runtime owns the compiled MSD world, model, data, optional +viewer, and physics advancement; robot ports delegate I/O only. See the +[deployment tutorial](../docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md) +for the framework contracts (ControlSession, DeployTask, controller lifecycle, rollout +result semantics). ## Model, placement, and state contract @@ -94,13 +92,16 @@ sensor_bindings: For Go2 these names select local `FrameAngVel`, local `FrameLinAcc`, and world `FrameLinVel` sensors. IMU sites must belong to the base body and align with its body frame; the velocity source must target the base link or an aligned base-body site. -Missing or incompatible sources fail rather than fabricating state. Base position and -linear velocity come from the simulation; tasks check optional fields -at their usage sites. Public state reads own snapshots of native query buffers. +Missing or incompatible sources fail rather than fabricating state. Public `RobotState` +does not expose world base position. Optional linear velocity comes only from its bound +sensor and remains `None` when unbound; tasks check optional fields at their usage sites. Public state reads own snapshots of native query buffers. ## Control timing and viewer -Each control tick uses shared `ControlSession.start/tick/stop` logic. Every physics +ControlSession calls `Controller` with validated state and context and writes its command; +runtime advances one control interval using one scheduler. +Completion consumes no extra interval; task-specific ready and normal exit actions +are decisions of the concrete task, not runtime phases. Every physics substep recomputes servo torque from current joint state: ```text diff --git a/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/robot.py b/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/robot.py index 0a6c72cb..e903a1ce 100644 --- a/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/robot.py +++ b/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/robot.py @@ -47,6 +47,7 @@ def __init__(self, runtime: MotrixSimRuntime, spec: RobotSpec, actuator_names: t self._last_communication_ns = 0 self._health_reason = "simulation is not open" self._read: mtx.query.QueryProgram | None = None + self._read_fields: tuple[str, ...] = () self._joint_read: mtx.query.QueryProgram | None = None self._write: mtx.write.WriteProgram | None = None self._joint_names = tuple(self._robot.resolve_name(name) for name in spec.joint_names) @@ -62,7 +63,6 @@ def __init__(self, runtime: MotrixSimRuntime, spec: RobotSpec, actuator_names: t "base_orientation_xyzw", "base_angular_velocity", "base_linear_acceleration", - "base_position", "base_linear_velocity", } ), @@ -102,6 +102,8 @@ def _validate_sensors(self) -> None: ): path = f"backend.sensor_bindings.{role}" local_name = getattr(self._runtime.config.sensor_bindings, role) + if local_name is None and role == "base_linear_velocity": + continue if local_name is None: raise ValidationError(path, "an explicit model-local sensor name", local_name) name = self._robot.resolve_name(local_name) @@ -128,11 +130,9 @@ def bind(self) -> None: self._runtime.reset() self.refresh_reads() self._command = None - assert self._write is not None - self._write["torque"][:] = 0 - self._write.execute(self._runtime.data) self._opened = True self._closed = False + self.stop() self._health_reason = "" self._last_communication_ns = time.monotonic_ns() @@ -146,11 +146,11 @@ def refresh_reads(self) -> None: self._joint_read = model.compile_query(joint_queries).allocate(data) queries = { **joint_queries, - "base_position": mtx.query.LinkPosition((self._robot.resolved_base_link_name,)), "base_orientation_xyzw": mtx.query.LinkRotation((self._robot.resolved_base_link_name,)), } queries.update({role: mtx.query.SensorValues((name,)) for role, name in self._sensor_names.items()}) self._read = model.compile_query(queries).allocate(data) + self._read_fields = tuple(queries) self._write = model.compile_write({"torque": mtx.write.ActuatorCtrls(self._actuator_names)}).allocate(data) def open(self) -> None: @@ -167,16 +167,7 @@ def read_state(self, timeout_s: float) -> RobotState: # Native programs reuse their buffers; public samples must own snapshots. # RobotState validates the canonical shapes, dtype and finite values. fields = { - name: np.array(self._read[name].reshape(-1), dtype=np.float32, copy=True) - for name in ( - "joint_position", - "joint_velocity", - "base_position", - "base_orientation_xyzw", - "base_angular_velocity", - "base_linear_acceleration", - "base_linear_velocity", - ) + name: np.array(self._read[name].reshape(-1), dtype=np.float32, copy=True) for name in self._read_fields } return RobotState( sample_time_ns=round(self._runtime.simulation_time_s * 1e9), @@ -250,6 +241,7 @@ def health(self) -> HealthStatus: ) def stop(self) -> None: + """Clear the command and apply zero torque immediately.""" self._command = None if self._opened and not self._closed and self._write is not None: self._write["torque"][:] = 0 diff --git a/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/runtime.py b/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/runtime.py index b9864ac3..fc8f28e1 100644 --- a/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/runtime.py +++ b/motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/runtime.py @@ -4,7 +4,6 @@ """Native world owner: scene compilation, lifecycle and physics advancement.""" from copy import deepcopy -from dataclasses import replace from typing import TYPE_CHECKING import motrixsim as mtx @@ -21,8 +20,7 @@ from motrix_env_motrixsim.compiler import MotrixSimSceneCompiler if TYPE_CHECKING: - from motrix_deploy.runtime.control import ControlSession - from motrix_deploy.runtime.result import RolloutResult + from motrix_deploy.runtime.result import SimulationRolloutResult class MotrixSimRuntime(SimulationRuntime): @@ -94,7 +92,7 @@ def _derive_spec(model: mtx.SceneModel, robot: RobotCfg) -> tuple[RobotSpec, tup physical_range = np.asarray(joint.range).reshape(2) if limits[0] < physical_range[0] - 1e-6 or limits[1] > physical_range[1] + 1e-6: raise ValidationError( - f"backend.joints.{name}.range", "control limits inside physical joint range", limits + f"backend.joints.{name}.range", "session limits inside physical joint range", limits ) actuator_names.append(actuator.name) lower.append(limits[0]) @@ -127,16 +125,6 @@ def _prepare_motors(self, source_model: mtx.SceneModel, spec: RobotSpec, actuato raise ValidationError( f"backend.actuators.{actuator.name}.ctrl_range", [-limit, limit], native.ctrl_range ) - if isinstance(native, mtx.PositionActuator) and ( - not np.isfinite(native.kp) - or native.kp < 0 - or native.kd is None - or not np.isfinite(native.kd) - or native.kd < 0 - ): - raise ValidationError( - f"backend.actuators.{actuator.name}.gains", "finite non-negative kp/kd", (native.kp, native.kd) - ) actuator.actuator_type = mtx.msd.ActuatorType.motor() actuator.ctrlrange = mtx.msd.Range(-limit, limit) actuator.forcerange = mtx.msd.Range(-limit, limit) @@ -144,11 +132,10 @@ def _prepare_motors(self, source_model: mtx.SceneModel, spec: RobotSpec, actuato for keyframe in self.world.keyframes: keyframe.ctrl = [0.0] * len(self.world.actuators) - def bind_control_session(self, control: "ControlSession") -> None: - ratio = control.period_s / self.config.physics.dt + def _configure_session_period(self, period_s: float) -> None: + ratio = period_s / self.config.physics.dt if not np.isfinite(ratio) or not np.isclose(ratio, round(ratio), atol=1e-9, rtol=0) or round(ratio) < 1: - raise ValidationError("control.period_s", "an integer multiple of physics.dt", control.period_s) - super().bind_control_session(control) + raise ValidationError("session.period_s", "an integer multiple of physics.dt", period_s) self.physics_substeps = round(ratio) def open(self) -> None: @@ -158,10 +145,10 @@ def open(self) -> None: self.model = self.world.build() try: self._robot.bind() + self._opened = True if self.viewer is not None: self.viewer.open(self.model) self.sync_viewer() - self._opened = True except BaseException: self.close() raise @@ -193,49 +180,25 @@ def advance_control_period(self) -> None: if not self._opened: raise RuntimeError("MotrixSim simulation is not open") if self.physics_substeps is None: - raise RuntimeError("Bind a control session before advancing a control period") + raise RuntimeError("Bind a session before advancing a session period") self.check_viewer_running() for _ in range(self.physics_substeps): self._step() self.sync_viewer() - def run( - self, control: "ControlSession | None" = None, *, steps: int | None = None, realtime: bool | None = None - ) -> "RolloutResult": + def _physics_time_s(self) -> float: + return self.simulation_time_s + + def run(self, *, realtime: bool | None = None) -> "SimulationRolloutResult": if not self._opened: raise RuntimeError("MotrixSim simulation is not open") - control = self._resolve_control(control) - self.bind_control_session(control) - if steps is not None and (not isinstance(steps, int) or isinstance(steps, bool) or steps <= 0): - raise ValidationError("steps", "a positive integer", steps) + if self.session is None: + raise ValidationError("runtime.session", "a bound control session", None) paced = self.realtime if realtime is None else realtime if paced is None: paced = self.viewer is not None - scheduler = (RealtimeScheduler if paced else FixedStepScheduler)(control.period_s) - initial_time_s = self.simulation_time_s - try: - if control.start(): - initial_time_s = self.simulation_time_s - scheduler.reset() - while control.active: - if steps is not None and control.completed_steps >= steps: - break - self.check_viewer_running() - if not control.tick(elapsed_time_s=self.simulation_time_s - initial_time_s): - break - self.advance_control_period() - scheduler.wait(control.completed_steps) - except (Exception, KeyboardInterrupt) as error: - control.fail(error) - finally: - control.stop() - result = control.result(steps=steps, overrun_count=scheduler.overrun_count) - elapsed = self.simulation_time_s - initial_time_s - return replace( - result, - simulation_time_s=elapsed, - real_time_factor=elapsed / result.wall_time_s if result.wall_time_s > 0 else 0.0, - ) + scheduler = (RealtimeScheduler if paced else FixedStepScheduler)(self.session.period_s) + return self._run_session(scheduler) def check_viewer_running(self) -> None: if self.viewer is not None and not self.viewer.is_running(): @@ -253,8 +216,6 @@ def get_keyboard_device(self): def close(self) -> None: try: - if self.control is not None and self.control.active: - self.control.stop() if self.viewer is not None: self.viewer.close() finally: diff --git a/motrix_deploy_motrixsim/tests/test_motion_state_and_native_servos.py b/motrix_deploy_motrixsim/tests/test_motion_state_and_native_servos.py new file mode 100644 index 00000000..fff11a61 --- /dev/null +++ b/motrix_deploy_motrixsim/tests/test_motion_state_and_native_servos.py @@ -0,0 +1,165 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Native SDK motion-state and software-PD behavior contracts.""" + +from dataclasses import replace +from types import SimpleNamespace + +import motrixsim as mtx +import numpy as np +from motrix_deploy_motrixsim.runtime import MotrixSimRuntime +from test_native_motrixsim_runtime import config + +from motrix_deploy.contracts import JointControlMode, JointServoCommand, JointTorqueCommand + + +def set_simulation_state( + runtime, + *, + root_position, + root_orientation_xyzw, + root_linear_velocity, + root_angular_velocity, + joint_position, + joint_velocity, +): + """Arrange native SDK state for sensor and control behavior tests only.""" + base = (runtime.scene.objs.robot.resolved_base_link_name,) + joints = tuple(runtime.scene.objs.robot.resolve_name(name) for name in runtime.robot.spec.joint_names) + program = runtime.model.compile_write( + { + "root_position": mtx.write.BodyPosition(base), + "root_orientation_xyzw": mtx.write.BodyRotation(base), + "root_linear_velocity": mtx.write.BodyLinearVelocity(base), + "root_angular_velocity": mtx.write.BodyAngularVelocity(base), + "joint_position": mtx.write.BodyJointPosition(joints), + "joint_velocity": mtx.write.BodyJointVelocity(joints), + }, + reset=True, + forward_kinematic=True, + ).allocate(runtime.data) + program["root_position"][:] = root_position + program["root_orientation_xyzw"][:] = root_orientation_xyzw + program["root_linear_velocity"][:] = root_linear_velocity + program["root_angular_velocity"][:] = root_angular_velocity + program["joint_position"][:] = joint_position + program["joint_velocity"][:] = joint_velocity + program.execute(runtime.data) + + +def motion(spec): + return SimpleNamespace( + root_position=np.asarray([1.2, -0.7, 2.0], dtype=np.float32), + root_orientation_xyzw=np.asarray([0.0, 0.0, np.sin(0.4), np.cos(0.4)], dtype=np.float32), + root_linear_velocity=np.asarray([0.4, -0.2, 0.3], dtype=np.float32), + root_angular_velocity=np.asarray([0.1, 0.3, -0.2], dtype=np.float32), + joint_position=spec.default_joint_position + np.float32(0.02), + joint_velocity=np.linspace(-0.2, 0.2, spec.joint_count, dtype=np.float32), + ) + + +def test_world_motion_sensor_frames_and_joint_mapping_with_instance_names(): + cfg = config() + cfg.scene.objs.robot.prefix = "motion_" + cfg.scene.objs.robot.suffix = "_instance" + with MotrixSimRuntime(cfg) as runtime: + initial = motion(runtime.robot.spec) + set_simulation_state(runtime, **vars(initial)) + + def check_motion(): + state = runtime.robot.read_state(0.1) + base = (runtime.scene.objs.robot.resolved_base_link_name,) + position = runtime.model.compile_query({"position": mtx.query.LinkPosition(base)}).allocate(runtime.data) + position.execute(runtime.data) + np.testing.assert_allclose(position["position"].reshape(3), initial.root_position, atol=1e-6) + np.testing.assert_allclose(state.base_orientation_xyzw, initial.root_orientation_xyzw, atol=1e-6) + np.testing.assert_allclose(state.joint_position, initial.joint_position, atol=1e-6) + np.testing.assert_allclose(state.joint_velocity, initial.joint_velocity, atol=1e-6) + angle = 0.8 + rotation = np.asarray( + [ + [np.cos(angle), -np.sin(angle), 0], + [np.sin(angle), np.cos(angle), 0], + [0, 0, 1], + ] + ) + np.testing.assert_allclose( + state.base_angular_velocity, rotation.T @ initial.root_angular_velocity, atol=1e-6 + ) + sensor_name = runtime.scene.objs.robot.resolve_name(runtime.config.sensor_bindings.base_linear_velocity) + sensor = next(sensor for sensor in runtime.world.sensors.frame if sensor.name == sensor_name) + site_read = runtime.model.compile_query( + { + "position": mtx.query.SitePosition((sensor.object_type.value,)), + } + ).allocate(runtime.data) + site_read.execute(runtime.data) + site_offset = site_read["position"].reshape(3) - initial.root_position + np.testing.assert_allclose( + state.base_linear_velocity, + initial.root_linear_velocity + np.cross(initial.root_angular_velocity, site_offset), + atol=1e-6, + ) + base = (runtime.scene.objs.robot.resolved_base_link_name,) + read = runtime.model.compile_query( + { + "linear": mtx.query.LinkLinearVelocity(base), + "angular": mtx.query.LinkAngularVelocity(base), + } + ).allocate(runtime.data) + read.execute(runtime.data) + np.testing.assert_allclose(read["linear"].reshape(3), initial.root_linear_velocity, atol=1e-6) + np.testing.assert_allclose(read["angular"].reshape(3), initial.root_angular_velocity, atol=1e-6) + return state + + check_motion() + + +def test_linear_velocity_capability_is_independent_of_sensor_binding(): + cfg = config() + capabilities = [] + for binding in (cfg.sensor_bindings.base_linear_velocity, None): + bound_config = replace(cfg, sensor_bindings=replace(cfg.sensor_bindings, base_linear_velocity=binding)) + with MotrixSimRuntime(bound_config) as runtime: + capabilities.append(runtime.robot.capabilities) + assert "base_linear_velocity" in runtime.robot.capabilities.state_fields + initial = motion(runtime.robot.spec) + initial.root_angular_velocity.fill(0) + set_simulation_state(runtime, **vars(initial)) + state = runtime.robot.read_state(0.1) + if binding is None: + assert state.base_linear_velocity is None + else: + np.testing.assert_allclose(state.base_linear_velocity, initial.root_linear_velocity, atol=1e-6) + assert capabilities[0] == capabilities[1] + + +def test_software_pd_uses_command_gains_velocity_and_feedforward(): + with MotrixSimRuntime(config()) as runtime: + assert all(isinstance(actuator, mtx.MotorActuator) for actuator in runtime.model.actuators) + assert runtime.robot.capabilities.control_modes == (JointControlMode.SERVO, JointControlMode.TORQUE) + assert runtime.robot.capabilities.stop_semantics == "zero_torque" + initial = motion(runtime.robot.spec) + set_simulation_state(runtime, **vars(initial)) + count = runtime.robot.spec.joint_count + command = JointServoCommand( + initial.joint_position + np.float32(0.01), + np.full(count, 0.15, dtype=np.float32), + np.full(count, 0.5, dtype=np.float32), + np.full(count, 12, dtype=np.float32), + np.full(count, 2, dtype=np.float32), + ) + runtime.robot.write_command(command) + runtime.robot.apply_control() + expected = ( + command.kp * (command.joint_position - initial.joint_position) + + command.kd * (command.joint_velocity - initial.joint_velocity) + + command.feedforward_torque + ) + np.testing.assert_allclose(runtime.model.get_actuator_ctrls(runtime.data).reshape(-1), expected, atol=1e-6) + runtime.robot.write_command(JointTorqueCommand(np.ones(count, dtype=np.float32))) + runtime.robot.apply_control() + np.testing.assert_array_equal(runtime.model.get_actuator_ctrls(runtime.data), 1) + runtime.reset() + np.testing.assert_array_equal(runtime.model.get_actuator_ctrls(runtime.data), 0) diff --git a/motrix_deploy_motrixsim/tests/test_native_motrixsim_runtime.py b/motrix_deploy_motrixsim/tests/test_native_motrixsim_runtime.py index 0929051b..68688db7 100644 --- a/motrix_deploy_motrixsim/tests/test_native_motrixsim_runtime.py +++ b/motrix_deploy_motrixsim/tests/test_native_motrixsim_runtime.py @@ -15,11 +15,11 @@ from motrix_deploy.contracts import JointControlMode, JointServoCommand, JointTorqueCommand from motrix_deploy.errors import ValidationError -from motrix_deploy.policy import NoOpPolicyRuntime +from motrix_deploy.policy import NoOpPolicy +from motrix_deploy.policy.processing import PolicyProcessor from motrix_deploy.runtime.config import SensorBindings, SimulationRuntimeConfig -from motrix_deploy.runtime.control import ControlSession +from motrix_deploy.runtime.control import ControlSession, PolicyController from motrix_deploy.runtime.factory import create_simulation_runtime -from motrix_deploy.task import DeployTask from motrix_env_core.config import configclass from motrix_env_core.config.scene import FlatTerrainCfg, SceneCfg, SceneObjsCfg from motrix_env_core.config.scene.actuator import MotorActuatorCfg @@ -46,13 +46,16 @@ def config(**kwargs): ) -class HoldTask(DeployTask): +class HoldPolicyProcessor(PolicyProcessor): def __init__(self, spec): self.spec = spec def reset(self, state, context): pass + def check_termination(self, state): + return None + def validate_command(self, command): pass @@ -64,15 +67,19 @@ def process_action(self, action): return JointServoCommand(self.spec.default_joint_position, z, z, z + 30, z + 1) -def session(runtime, period=0.006): - return ControlSession( +def bind_session(runtime, period=0.006, steps=2): + controller = PolicyController( + HoldPolicyProcessor(runtime.robot.spec), NoOpPolicy(runtime.robot.spec.joint_count), steps=steps + ) + session = ControlSession( + controller=controller, robot=runtime.robot, - task=HoldTask(runtime.robot.spec), - policy=NoOpPolicyRuntime(runtime.robot.spec.joint_count), command_binding=ConstantPlanarVelocityBinding((0, 0, 0)), period_s=period, state_timeout_s=0.1, ) + runtime.bind_session(session) + return controller @pytest.mark.parametrize("gravity,tolerance", [((0.3, -0.2, -4.1), 2e-7), ((-0.1, 0.4, -6.3), 3e-6)]) @@ -112,8 +119,7 @@ def test_native_factory_session_cadence_and_owner(monkeypatch): assert runtime.robot.capabilities.max_command_rate_hz == 1 / runtime.config.physics.dt with pytest.raises(RuntimeError): runtime.robot.read_state(0.1) - control = session(runtime) - runtime.bind_control_session(control) + bind_session(runtime, steps=5) calls = [] original = runtime.robot.apply_control @@ -123,10 +129,10 @@ def count_apply(): monkeypatch.setattr(runtime.robot, "apply_control", count_apply) with runtime: - result = runtime.run(steps=5) + result = runtime.run() assert result.success assert result.completed_steps == 5 - assert result.simulation_time_s == pytest.approx(5 * control.period_s) + assert result.policy_simulation_time_s == pytest.approx(5 * 0.006) assert len(calls) == 5 * 3 assert runtime.opened runtime.robot.close() @@ -171,6 +177,49 @@ def test_native_servo_feedforward_snapshots_and_clipping(): np.testing.assert_array_equal(runtime.model.get_actuator_ctrls(runtime.data), 0) +@pytest.mark.parametrize("backend", ["motrixsim", "mujoco"]) +def test_stop_applies_zero_torque_across_substeps(backend): + if backend == "mujoco": + pytest.importorskip("mujoco") + runtime = create_simulation_runtime(backend, config()) + with runtime: + held = runtime.robot.read_state(0.1).joint_position.copy() + count = runtime.robot.spec.joint_count + runtime.robot.write_command(JointTorqueCommand(np.ones(count, dtype=np.float32))) + runtime.robot.apply_control() + runtime.robot.stop() + displaced = held + 0.02 + if backend == "motrixsim": + positions = np.asarray(runtime.data.dof_pos).reshape(-1).copy() + positions[runtime.robot.joint_dof_pos_indices] = displaced + runtime.data.set_dof_pos(positions, runtime.model) + runtime.model.forward_kinematic(runtime.data) + else: + runtime.data.qpos[runtime.robot._joint_qpos_indices] = displaced + runtime.mj.mj_forward(runtime.model, runtime.data) + for _ in range(3): + runtime.robot.read_state(0.1) + runtime.robot.apply_control() + controls = ( + np.asarray(runtime.model.get_actuator_ctrls(runtime.data)).reshape(-1) + if backend == "motrixsim" + else runtime.data.ctrl[runtime.robot._actuator_indices] + ) + np.testing.assert_array_equal(controls, 0.0) + if backend == "motrixsim": + runtime._step() + else: + runtime.mj.mj_step(runtime.model, runtime.data) + runtime.robot.stop() + runtime.robot.apply_control() + controls = ( + np.asarray(runtime.model.get_actuator_ctrls(runtime.data)).reshape(-1) + if backend == "motrixsim" + else runtime.data.ctrl[runtime.robot._actuator_indices] + ) + np.testing.assert_array_equal(controls, 0.0) + + def test_native_servo_substeps_only_query_joint_state(monkeypatch): runtime = MotrixSimRuntime(config()) with runtime: @@ -190,9 +239,13 @@ def test_native_repeated_reset_preserves_compiled_placement_and_sensor_state(): runtime = MotrixSimRuntime(config()) with runtime: initial = runtime.robot.read_state(0.1) - assert initial.base_position[0] == pytest.approx(0.2) - assert initial.base_position[1] == pytest.approx(-0.1) - assert initial.base_position[2] > 0.4 # placement composes with imported root, never replaces it + base = (runtime.scene.objs.robot.resolved_base_link_name,) + position = runtime.model.compile_query({"position": mtx.query.LinkPosition(base)}).allocate(runtime.data) + position.execute(runtime.data) + initial_position = position["position"].reshape(3).copy() + assert initial_position[0] == pytest.approx(0.2) + assert initial_position[1] == pytest.approx(-0.1) + assert initial_position[2] > 0.4 # placement composes with imported root, never replaces it for _ in range(2): runtime.robot.write_command(JointTorqueCommand(np.ones(runtime.robot.spec.joint_count, dtype=np.float32))) for _ in range(5): @@ -201,8 +254,9 @@ def test_native_repeated_reset_preserves_compiled_placement_and_sensor_state(): runtime.reset() reset = runtime.robot.read_state(0.1) assert reset.sample_time_ns == 0 + position.execute(runtime.data) + np.testing.assert_allclose(position["position"].reshape(3), initial_position, atol=1e-6) for field in ( - "base_position", "base_orientation_xyzw", "joint_position", "joint_velocity", @@ -213,7 +267,9 @@ def test_native_repeated_reset_preserves_compiled_placement_and_sensor_state(): np.testing.assert_allclose(getattr(reset, field), getattr(initial, field), atol=1e-6) runtime.robot.write_command(JointTorqueCommand(np.zeros(runtime.robot.spec.joint_count, dtype=np.float32))) with runtime: - np.testing.assert_allclose(runtime.robot.read_state(0.1).base_position, initial.base_position) + position = runtime.model.compile_query({"position": mtx.query.LinkPosition(base)}).allocate(runtime.data) + position.execute(runtime.data) + np.testing.assert_allclose(position["position"].reshape(3), initial_position, atol=1e-6) def test_native_sensor_bindings_are_actual_live_native_values(): @@ -245,8 +301,8 @@ def test_native_instance_names_preserve_artifact_local_robot_contract(): np.testing.assert_allclose( runtime.robot.read_state(0.1).joint_position, runtime.robot.spec.default_joint_position, atol=1e-6 ) - runtime.bind_control_session(session(runtime)) - assert runtime.run(steps=2).success + bind_session(runtime) + assert runtime.run().success def test_native_motor_source_supported(): @@ -273,7 +329,7 @@ def test_native_motor_source_supported(): def test_native_session_period_requires_whole_physics_steps(period): runtime = MotrixSimRuntime(config()) with pytest.raises(ValidationError, match="integer multiple"): - runtime.bind_control_session(session(runtime, period)) + bind_session(runtime, period) runtime.close() @@ -294,7 +350,7 @@ def test_native_explicit_sensor_semantics(role, name): pass -@pytest.mark.parametrize("role", ["base_angular_velocity", "base_linear_acceleration", "base_linear_velocity"]) +@pytest.mark.parametrize("role", ["base_angular_velocity", "base_linear_acceleration"]) def test_native_missing_sensor_fails_at_model_binding(role): cfg = config() cfg = replace(cfg, sensor_bindings=replace(cfg.sensor_bindings, **{role: None})) @@ -339,9 +395,9 @@ def test_native_artifact_mapping_same_contract(): assert isinstance(runtime.config.physics, SimCfg) assert runtime.world.simulate_option.constraint_solver_tolerance == pytest.approx(4e-7) np.testing.assert_allclose(runtime.world.simulate_option.gravity, (0.2, -0.3, -5.0)) - runtime.bind_control_session(session(runtime)) + bind_session(runtime) with runtime: - assert runtime.run(steps=2).success + assert runtime.run().success @pytest.mark.parametrize("physics", [{}, {"dt": 0.004}, {"solver_iterations": None}]) @@ -389,8 +445,7 @@ def close(self): assert calls == [] and not runtime.viewer.is_running() with pytest.raises(RuntimeError, match="Open the MotrixSim viewer"): device.poll() - control = session(runtime) - runtime.bind_control_session(control) + bind_session(runtime, steps=5) with runtime: assert runtime.viewer.is_running() assert device is runtime.get_keyboard_device() diff --git a/motrix_deploy_mujoco/src/motrix_deploy_mujoco/robot.py b/motrix_deploy_mujoco/src/motrix_deploy_mujoco/robot.py index 99b283b0..70d2ca8d 100644 --- a/motrix_deploy_mujoco/src/motrix_deploy_mujoco/robot.py +++ b/motrix_deploy_mujoco/src/motrix_deploy_mujoco/robot.py @@ -92,7 +92,6 @@ def bind(self) -> None: "base_orientation_xyzw", "base_angular_velocity", "base_linear_acceleration", - "base_position", "base_linear_velocity", } ), @@ -129,8 +128,10 @@ def write_command(self, command: RobotCommand) -> None: if value.shape != (joint_count,) or not np.isfinite(value).all(): raise ValidationError(f"command.{field_name}", f"finite shape ({joint_count},)", value) if isinstance(command, JointServoCommand): - if np.any(command.joint_position < self._spec.position_lower) or np.any( - command.joint_position > self._spec.position_upper + # Independently imported model/task limits can round differently at float32 boundaries. + position_tolerance = 1e-6 + if np.any(command.joint_position < self._spec.position_lower - position_tolerance) or np.any( + command.joint_position > self._spec.position_upper + position_tolerance ): raise ValidationError( "command.joint_position", "inside RobotSpec position range", command.joint_position @@ -147,6 +148,13 @@ def write_command(self, command: RobotCommand) -> None: # Snapshot the command: the caller may reuse or mutate its arrays afterwards. self._command = type(command)(**{name: getattr(command, name).copy() for name in fields}) + if isinstance(self._command, JointServoCommand): + np.clip( + self._command.joint_position, + self._spec.position_lower, + self._spec.position_upper, + out=self._command.joint_position, + ) self._last_communication_ns = time.monotonic_ns() def apply_control(self) -> None: @@ -177,11 +185,11 @@ def health(self) -> HealthStatus: ) def stop(self) -> None: + """Clear the cached command and zero actuator torque.""" self._command = None if not self._opened or self._closed or self._runtime.data is None: return - if self._joint_qpos_indices.size: - self._runtime.data.ctrl[self._actuator_indices] = 0.0 + self._runtime.data.ctrl[self._actuator_indices] = 0.0 def open(self) -> None: """Check that the owning runtime has prepared and bound robot I/O.""" @@ -333,6 +341,8 @@ def _bind_sensors(self) -> None: path = f"runtime.sensor_bindings.{role}" local_name = getattr(self.config.sensor_bindings, role) if local_name is None: + if role == "base_linear_velocity": + continue raise ValidationError(path, "an explicit model-local sensor name", "missing") sensor_name = self._cfg.resolve_name(local_name) sensor_id = self._name_id(self._runtime.mj.mjtObj.mjOBJ_SENSOR, sensor_name, f"sensor_bindings.{role}") @@ -379,8 +389,9 @@ def _state(self) -> RobotState: base_orientation_xyzw=orientation_xyzw, base_angular_velocity=self._sensor("base_angular_velocity"), base_linear_acceleration=self._sensor("base_linear_acceleration"), - base_position=np.asarray(self._runtime.data.xpos[self._base_body_id], dtype=np.float32), - base_linear_velocity=self._sensor("base_linear_velocity"), + base_linear_velocity=( + self._sensor("base_linear_velocity") if "base_linear_velocity" in self._sensor_slices else None + ), ) def _sensor(self, role: str) -> NDArray[np.float32]: diff --git a/motrix_deploy_mujoco/src/motrix_deploy_mujoco/runtime.py b/motrix_deploy_mujoco/src/motrix_deploy_mujoco/runtime.py index 9cd8e238..2d5ec553 100644 --- a/motrix_deploy_mujoco/src/motrix_deploy_mujoco/runtime.py +++ b/motrix_deploy_mujoco/src/motrix_deploy_mujoco/runtime.py @@ -9,9 +9,8 @@ import time from collections.abc import Callable from copy import deepcopy -from dataclasses import replace from types import ModuleType -from typing import TYPE_CHECKING, TypeVar, cast +from typing import TYPE_CHECKING, cast from motrix_deploy.contracts import RobotSpec from motrix_deploy.robot.interface import RobotInterface @@ -22,13 +21,12 @@ if TYPE_CHECKING: import mujoco - from motrix_deploy.runtime.control import ControlSession import numpy as np from numpy.typing import NDArray from motrix_deploy.errors import ValidationError -from motrix_deploy.runtime.result import RolloutResult +from motrix_deploy.runtime.result import SimulationRolloutResult from motrix_deploy.runtime.scheduler import FixedStepScheduler, RealtimeScheduler from motrix_deploy_mujoco.robot import Robot from motrix_deploy_mujoco.viewer import MujocoGlfwViewer @@ -36,8 +34,6 @@ from motrix_env_core.config.scene.base import RobotCfg from motrix_env_mujoco.compiler import MuJoCoSceneCompiler -CommandT = TypeVar("CommandT") - logger = logging.getLogger(__name__) @@ -67,7 +63,7 @@ def __init__( self.config = config self.control_period_s: float | None = None if control_period_s is not None: - self._configure_control_period(control_period_s) + self._configure_session_period(control_period_s) self.realtime = config.realtime self._closed = False self._source_spec: mujoco.MjSpec | None = None @@ -78,20 +74,13 @@ def __init__( def robot(self) -> RobotInterface: return self._robot - def _configure_control_period(self, period_s: float) -> None: + def _configure_session_period(self, period_s: float) -> None: ratio = period_s / self.sim.dt if not np.isfinite(ratio) or ratio < 1 or not np.isclose(ratio, round(ratio), atol=1e-9): - raise ValidationError("control.period_s", "an integer multiple of physics.dt", period_s) + raise ValidationError("session.period_s", "an integer multiple of physics.dt", period_s) self.control_period_s = period_s self.physics_substeps = round(ratio) - def bind_control_session(self, control: ControlSession[CommandT]) -> None: - """Bind control ownership and derive physics cadence from the session.""" - # Resolve identity conflicts before changing the runtime's timing. - self._resolve_control(control) - self._configure_control_period(control.period_s) - super().bind_control_session(control) - def _derive_robot_spec(self) -> RobotSpec: """Inspect physical limits, never controller gains, before binding robot I/O.""" robot = cast(RobotCfg, self.scene.objs.robot) @@ -172,72 +161,26 @@ def reset( self.data.ctrl.fill(0.0) self.mj.mj_forward(self.model, self.data) - def run( - self, - control: ControlSession[CommandT] | None = None, - *, - steps: int | None = None, - realtime: bool | None = None, - ) -> RolloutResult: - """Drive shared control at physics boundaries inside an already-open world. + def _physics_time_s(self) -> float: + return float(self.data.time) - Control writes cached commands only. This owner re-evaluates robot PD on - every physics substep, and paces complete control intervals independently - of the shared control lifecycle. Stopping control leaves this world open. - """ + def run(self, *, realtime: bool | None = None) -> SimulationRolloutResult: if not self._opened: raise RuntimeError("MuJoCo simulation with a registered robot is not open") - control = self._resolve_control(control) - if steps is not None and (not isinstance(steps, int) or isinstance(steps, bool) or steps <= 0): - raise ValidationError("steps", "a positive integer", steps) - self._configure_control_period(control.period_s) - if realtime is None: - realtime = self.realtime - paced = self.viewer is not None if realtime is None else realtime - assert self.physics_substeps is not None and self.control_period_s is not None - scheduler = (RealtimeScheduler if paced else FixedStepScheduler)(self.control_period_s) - assert self.data is not None and self.model is not None - initial_time_s = float(self.data.time) - simulation_time_s = 0.0 - try: - if control.start(): - # Establish relative simulation time after control initialization. - initial_time_s = float(self.data.time) - scheduler.reset() - substep = 0 - while control.active: - if substep % self.physics_substeps == 0: - if steps is not None and control.completed_steps >= steps: - break - self.check_viewer_running() - if not control.tick(elapsed_time_s=float(self.data.time) - initial_time_s): - break - self._robot.apply_control() - self.mj.mj_step(self.model, self.data) - substep += 1 - if substep % self.physics_substeps == 0: - self.sync_viewer() - # Absolute deadlines avoid accumulated wall-clock drift, - # and include the final interval without an extra tick. - scheduler.wait(substep // self.physics_substeps) - except (Exception, KeyboardInterrupt) as error: - control.fail(error) - finally: - simulation_time_s = float(self.data.time) - initial_time_s - control.stop() - result = control.result(steps=steps, overrun_count=scheduler.overrun_count) - return replace( - result, - simulation_time_s=simulation_time_s, - real_time_factor=simulation_time_s / result.wall_time_s if result.wall_time_s > 0 else 0.0, - ) + if self.session is None: + raise ValidationError("runtime.session", "a bound control session", None) + paced = self.realtime if realtime is None else realtime + if paced is None: + paced = self.viewer is not None + scheduler = (RealtimeScheduler if paced else FixedStepScheduler)(self.session.period_s) + return self._run_session(scheduler) def advance_control_period(self) -> None: """Advance physics, re-evaluating cached robot PD at every substep.""" if not self._opened: raise RuntimeError("MuJoCo simulation with a registered robot is not open") if self.physics_substeps is None: - raise RuntimeError("Bind a control session before advancing a control period") + raise RuntimeError("Bind a session before advancing a session period") self.check_viewer_running() for _ in range(self.physics_substeps): self._robot.apply_control() @@ -257,8 +200,6 @@ def close(self) -> None: if self._closed: return try: - if self.control is not None and self.control.active: - self.control.stop() if self.viewer is not None: self.viewer.close() deadline = time.monotonic() + 2.0 diff --git a/motrix_deploy_mujoco/tests/control_helpers.py b/motrix_deploy_mujoco/tests/control_helpers.py index e9c64a81..0a962390 100644 --- a/motrix_deploy_mujoco/tests/control_helpers.py +++ b/motrix_deploy_mujoco/tests/control_helpers.py @@ -6,12 +6,12 @@ import numpy as np from motrix_deploy.contracts import FloatArray, JointServoCommand, RobotSpec, RobotState -from motrix_deploy.runtime.context import PolicyContext -from motrix_deploy.task import DeployTask +from motrix_deploy.policy.processing import PolicyProcessor +from motrix_deploy.runtime.context import ControlContext from motrix_env_core.input import PlanarVelocityCommand -class DummyServoTask(DeployTask[PlanarVelocityCommand]): +class DummyServoPolicyProcessor(PolicyProcessor[PlanarVelocityCommand]): """Keep generic driver tests independent of examples and trained artifacts.""" def __init__(self, robot: RobotSpec, kp: FloatArray, kd: FloatArray) -> None: @@ -20,10 +20,10 @@ def __init__(self, robot: RobotSpec, kp: FloatArray, kd: FloatArray) -> None: self.kd = kd self._zeros = np.zeros(robot.joint_count, dtype=np.float32) - def reset(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> None: + def reset(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> None: pass - def build_observation(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> FloatArray: + def build_observation(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> FloatArray: return self._zeros.copy() def process_action(self, action: FloatArray) -> JointServoCommand: @@ -35,6 +35,9 @@ def process_action(self, action: FloatArray) -> JointServoCommand: kd=self.kd, ) + def check_termination(self, state: RobotState) -> str | None: + return None + def validate_command(self, command: PlanarVelocityCommand) -> None: if command.batch_size != 1 or np.any(command.values != 0.0): - raise ValueError("DummyServoTask accepts one zero velocity command") + raise ValueError("DummyServoPolicyProcessor accepts one zero velocity command") diff --git a/motrix_deploy_mujoco/tests/test_examples.py b/motrix_deploy_mujoco/tests/test_examples.py index 139a9b5f..b16f31c9 100644 --- a/motrix_deploy_mujoco/tests/test_examples.py +++ b/motrix_deploy_mujoco/tests/test_examples.py @@ -13,7 +13,7 @@ import numpy as np import pytest -from control_helpers import DummyServoTask +from control_helpers import DummyServoPolicyProcessor ROOT = Path(__file__).parents[2] EXAMPLES = ROOT / "examples" @@ -22,13 +22,12 @@ @pytest.fixture def onnx_policy(tmp_path, control_scene_config, control_gains): - """Generate raw ONNX locally; never depend on a trained checkout policy.""" + """Generate raw ONNX locally; never depend on a trained checkout controller.""" import onnx from onnx import TensorProto, helper, numpy_helper - from motrix_deploy.task import create_task from motrix_deploy_mujoco.runtime import MujocoRuntime - from motrix_deploy_tasks.tasks.go2_walk import Go2WalkTaskSpec + from motrix_deploy_tasks.tasks.go2_walk import Go2WalkPolicyProcessor, Go2WalkTaskSpec runtime = MujocoRuntime(control_scene_config, control_period_s=0.02) robot = runtime.robot.spec @@ -42,22 +41,19 @@ def onnx_policy(tmp_path, control_scene_config, control_gains): gait_frequency_hz=1.0, standing_threshold=0.05, termination_min_up_z=-1.0, - termination_min_base_height=None, kp=kp.tolist(), kd=kd.tolist(), action_lower=[-1.0] * robot.joint_count, action_upper=[1.0] * robot.joint_count, ) - task = create_task(task_spec, robot) - from motrix_deploy.runtime.context import PolicyContext + task = Go2WalkPolicyProcessor(task_spec, robot) + from motrix_deploy.runtime.context import ControlContext from motrix_env_core.input import ConstantPlanarVelocityBinding with runtime: runtime.robot.open() - context = PolicyContext( - step=0, - elapsed_time_s=0.0, - command=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)).read_command(), + context = ControlContext( + step=0, elapsed_time_s=0.0, command=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)).read_command(), dt_s=0.02 ) state = runtime.robot.read_state(0.1) task.reset(state, context) @@ -115,8 +111,8 @@ def test_programmatic_example_uses_shared_control_execution(tmp_path, onnx_polic assert result["completed_steps"] == 3 assert result["exit_reason"] == "completed" assert result["error"] is None - assert result["simulation_time_s"] == pytest.approx(0.06) - assert "latency" in result # Shared control execution report, not a separate preview loop. + assert result["policy_simulation_time_s"] == pytest.approx(0.06) + assert "latency" in result # Shared session execution report, not a separate preview loop. repeated = subprocess.run(command, check=False, capture_output=True, text=True, cwd=tmp_path) assert repeated.returncode == 0, repeated.stderr assert _result(repeated.stdout)["trace_sha256"] == result["trace_sha256"] @@ -125,10 +121,10 @@ def test_programmatic_example_uses_shared_control_execution(tmp_path, onnx_polic def test_simulation_factory_supports_explicit_bound_control_and_world_ownership( control_scene_config, control_gains ) -> None: - from motrix_deploy.policy import NoOpPolicyRuntime + from motrix_deploy.policy import NoOpPolicy from motrix_deploy.robot.interface import RobotInterface from motrix_deploy.runtime.config import SimulationRuntimeConfig - from motrix_deploy.runtime.control import ControlSession + from motrix_deploy.runtime.control import ControlSession, PolicyController from motrix_deploy.runtime.factory import create_simulation_runtime from motrix_env_core.input import ConstantPlanarVelocityBinding @@ -142,27 +138,28 @@ def test_simulation_factory_supports_explicit_bound_control_and_world_ownership( assert isinstance(robot, RobotInterface) assert not runtime.opened assert runtime.model is None and runtime.data is None - control = ControlSession( + controller = PolicyController( + DummyServoPolicyProcessor(robot.spec, *control_gains), NoOpPolicy(robot.spec.joint_count), steps=2 + ) + session = ControlSession( + controller=controller, robot=robot, - task=DummyServoTask(robot.spec, *control_gains), - policy=NoOpPolicyRuntime(robot.spec.joint_count), command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), period_s=0.012, state_timeout_s=0.1, ) - runtime.bind_control_session(control) - assert runtime.control_period_s == control.period_s + runtime.bind_session(session) + assert runtime.control_period_s == 0.012 assert runtime.physics_substeps == 6 - assert runtime.control is control and control.robot is robot + assert runtime.session is session assert not runtime.opened assert runtime.model is None and runtime.data is None with runtime: - result = runtime.run(steps=2) + result = runtime.run() assert result.success and result.completed_steps == 2 - assert runtime.robot is robot and runtime.control is control - assert not control.active - # Control shutdown releases robot I/O, not the simulation world's resources. + assert runtime.robot is robot and runtime.session is session + # ControlSession shutdown releases robot I/O, not the simulation world's resources. assert runtime.opened and runtime.model is not None and runtime.data is not None before = runtime.data.time runtime.advance_control_period() @@ -172,23 +169,21 @@ def test_simulation_factory_supports_explicit_bound_control_and_world_ownership( def test_robot_commands_do_not_advance_or_own_the_world(control_scene_config, control_gains) -> None: - from motrix_deploy.runtime.context import PolicyContext + from motrix_deploy.runtime.context import ControlContext from motrix_deploy_mujoco.runtime import MujocoRuntime from motrix_env_core.input import ConstantPlanarVelocityBinding config = control_scene_config simulation = MujocoRuntime(config, control_period_s=0.02) spec = simulation.robot.spec - task = DummyServoTask(spec, *control_gains) + task = DummyServoPolicyProcessor(spec, *control_gains) interface = simulation.robot assert interface.spec is spec with simulation: interface.open() before = interface.read_state(0.1) - context = PolicyContext( - step=0, - elapsed_time_s=0.0, - command=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)).read_command(), + context = ControlContext( + step=0, elapsed_time_s=0.0, command=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)).read_command(), dt_s=0.02 ) observation = task.build_observation(before, context) np.testing.assert_array_equal(observation, np.zeros(spec.joint_count, dtype=np.float32)) @@ -202,7 +197,7 @@ def test_robot_commands_do_not_advance_or_own_the_world(control_scene_config, co assert advanced.sample_time_ns > before.sample_time_ns interface.stop() interface.close() - # Closing the robot port releases control, not the shared simulation. + # Closing the robot port releases session, not the shared simulation. assert simulation.model is not None and simulation.data is not None time_before = simulation.data.time simulation.advance_control_period() diff --git a/motrix_deploy_mujoco/tests/test_initial_state_and_native_servos.py b/motrix_deploy_mujoco/tests/test_initial_state_and_native_servos.py new file mode 100644 index 00000000..756a00d4 --- /dev/null +++ b/motrix_deploy_mujoco/tests/test_initial_state_and_native_servos.py @@ -0,0 +1,130 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Robot motion coordinates, sensor bindings and software PD contracts.""" + +from dataclasses import replace +from types import SimpleNamespace + +import numpy as np + +from motrix_deploy.contracts import JointControlMode, JointServoCommand +from motrix_deploy_mujoco.runtime import MujocoRuntime + + +def _motion_fixture(spec): + return SimpleNamespace( + root_position=np.array([1.2, -0.5, 2.0], dtype=np.float32), + root_orientation_xyzw=np.array([0, 0, np.sqrt(0.5), np.sqrt(0.5)], dtype=np.float32), + root_linear_velocity=np.array([0.2, -0.4, 0.6], dtype=np.float32), + root_angular_velocity=np.array([0.1, 0.3, -0.2], dtype=np.float32), + joint_position=spec.default_joint_position + np.linspace(-0.01, 0.01, spec.joint_count, dtype=np.float32), + joint_velocity=np.linspace(-0.3, 0.3, spec.joint_count, dtype=np.float32), + ) + + +def _set_motion_fixture(runtime, motion): + """Write native MuJoCo data only to exercise robot state decoding in tests.""" + model, data = runtime.model, runtime.data + cfg = runtime.scene.objs.robot + root_joint = model.body_jntadr[model.body(cfg.resolved_base_link_name).id] + qpos_address = model.jnt_qposadr[root_joint] + dof_address = model.jnt_dofadr[root_joint] + quaternion = motion.root_orientation_xyzw[[3, 0, 1, 2]].astype(np.float64) + rotation = np.empty(9) + runtime.mj.mju_quat2Mat(rotation, quaternion) + data.qpos[qpos_address : qpos_address + 3] = motion.root_position + data.qpos[qpos_address + 3 : qpos_address + 7] = quaternion + data.qvel[dof_address : dof_address + 3] = motion.root_linear_velocity + data.qvel[dof_address + 3 : dof_address + 6] = rotation.reshape(3, 3).T @ motion.root_angular_velocity + for index, name in enumerate(cfg.key_pose.joint_names): + joint = model.joint(cfg.resolve_name(name)) + data.qpos[joint.qposadr] = motion.joint_position[index] + data.qvel[joint.dofadr] = motion.joint_velocity[index] + runtime.mj.mj_forward(model, data) + + +def test_robot_state_maps_root_coordinates_gyro_world_velocity_and_canonical_joints(control_scene_config): + # Reverse canonical order and prefix model names: neither vector may use raw MuJoCo order. + cfg = control_scene_config.scene.objs.robot + cfg.prefix = "test_" + names = cfg.key_pose.joint_names + cfg.key_pose.joint_names = tuple(reversed(names)) + cfg.key_pose.poses = {name: tuple(reversed(pose)) for name, pose in cfg.key_pose.poses.items()} + with MujocoRuntime(control_scene_config, 0.02) as runtime: + motion = _motion_fixture(runtime.robot.spec) + _set_motion_fixture(runtime, motion) + state = runtime.robot.read_state(0.1) + np.testing.assert_allclose(runtime.data.xpos[runtime.robot._base_body_id], motion.root_position, atol=1e-6) + np.testing.assert_allclose(state.base_orientation_xyzw, motion.root_orientation_xyzw, atol=1e-6) + np.testing.assert_allclose(state.base_angular_velocity, [0.3, -0.1, -0.2], atol=1e-6) + # The world-frame sensor includes omega cross offset for its attached site. + sensor = runtime.model.sensor(cfg.resolve_name("global_linvel")) + site_position = runtime.data.site_xpos[sensor.objid[0]] + offset = site_position - runtime.data.xpos[runtime.robot._base_body_id] + expected_velocity = motion.root_linear_velocity + np.cross(motion.root_angular_velocity, offset) + np.testing.assert_allclose(state.base_linear_velocity, expected_velocity, atol=1e-6) + np.testing.assert_array_equal(state.joint_position, motion.joint_position) + np.testing.assert_array_equal(state.joint_velocity, motion.joint_velocity) + + +def test_linear_velocity_capability_is_independent_of_sensor_binding(control_scene_config): + capabilities = [] + for binding in (control_scene_config.sensor_bindings.base_linear_velocity, None): + config = replace( + control_scene_config, + sensor_bindings=replace(control_scene_config.sensor_bindings, base_linear_velocity=binding), + ) + with MujocoRuntime(config) as runtime: + capabilities.append(runtime.robot.capabilities) + assert "base_linear_velocity" in runtime.robot.capabilities.state_fields + motion = _motion_fixture(runtime.robot.spec) + motion.root_angular_velocity.fill(0) + _set_motion_fixture(runtime, motion) + state = runtime.robot.read_state(0.1) + if binding is None: + assert state.base_linear_velocity is None + else: + np.testing.assert_allclose(state.base_linear_velocity, motion.root_linear_velocity, atol=1e-6) + assert capabilities[0] == capabilities[1] + + +def test_software_pd_uses_all_command_fields_each_substep_and_zeroes_on_stop(control_scene_config, monkeypatch): + with MujocoRuntime(control_scene_config, 0.02) as runtime: + spec = runtime.robot.spec + robot = runtime.robot + indices = robot._actuator_indices + assert robot.capabilities.control_modes == (JointControlMode.SERVO, JointControlMode.TORQUE) + assert robot.capabilities.stop_semantics == "zero_torque" + assert np.all(runtime.model.actuator_biastype[indices] == runtime.mj.mjtBias.mjBIAS_NONE) + command = JointServoCommand( + joint_position=spec.default_joint_position.copy(), + joint_velocity=np.full(spec.joint_count, 0.2, dtype=np.float32), + feedforward_torque=np.full(spec.joint_count, 0.3, dtype=np.float32), + kp=np.full(spec.joint_count, 3.0, dtype=np.float32), + kd=np.full(spec.joint_count, 0.7, dtype=np.float32), + ) + robot.write_command(command) + snapshots = [] + step = runtime.mj.mj_step + + def record_step(model, data): + expected = np.clip( + command.kp * (command.joint_position - data.qpos[robot._joint_qpos_indices]) + + command.kd * (command.joint_velocity - data.qvel[robot._joint_qvel_indices]) + + command.feedforward_torque, + -spec.torque_limit, + spec.torque_limit, + ) + np.testing.assert_allclose(data.ctrl[indices], expected, atol=1e-7) + snapshots.append(data.ctrl[indices].copy()) + step(model, data) + + monkeypatch.setattr(runtime.mj, "mj_step", record_step) + runtime.advance_control_period() + assert len(snapshots) == runtime.physics_substeps + assert not np.array_equal(snapshots[0], snapshots[-1]) + robot.stop() + np.testing.assert_array_equal(runtime.data.ctrl[indices], 0) + robot.apply_control() + np.testing.assert_array_equal(runtime.data.ctrl[indices], 0) diff --git a/motrix_deploy_mujoco/tests/test_joint_control.py b/motrix_deploy_mujoco/tests/test_joint_control.py index a3c9d24c..d78881e4 100644 --- a/motrix_deploy_mujoco/tests/test_joint_control.py +++ b/motrix_deploy_mujoco/tests/test_joint_control.py @@ -87,6 +87,24 @@ def test_command_limits_are_validated_before_application(control_scene_config, k np.testing.assert_array_equal(runtime.data.ctrl, 0) +@pytest.mark.parametrize("bound,direction", [("position_lower", -1.0), ("position_upper", 1.0)]) +def test_servo_accepts_float32_boundary_rounding_but_rejects_real_limit_violation( + control_scene_config, bound, direction +): + # Task and backend limits may originate from independently rounded model imports. + with MujocoRuntime(control_scene_config, 0.02) as runtime: + spec = runtime.robot.spec + limit = getattr(spec, bound) + runtime.robot.write_command(_servo(spec, joint_position=limit.copy())) + np.testing.assert_array_equal(runtime.robot._command.joint_position, limit) + rounded_target = limit + np.float32(direction * 2e-7) + runtime.robot.write_command(_servo(spec, joint_position=rounded_target)) + np.testing.assert_array_equal(runtime.robot._command.joint_position, limit) + np.testing.assert_array_equal(rounded_target, limit + np.float32(direction * 2e-7)) + with pytest.raises(ValidationError, match="command.joint_position"): + runtime.robot.write_command(_servo(spec, joint_position=limit + np.float32(direction * 2e-5))) + + def test_servo_total_pd_torque_is_clipped_and_mode_can_change(control_scene_config): with MujocoRuntime(control_scene_config, 0.02) as runtime: spec = runtime.robot.spec diff --git a/motrix_deploy_mujoco/tests/test_mujoco_deploy_backend.py b/motrix_deploy_mujoco/tests/test_mujoco_deploy_backend.py index 7b97cacd..75213408 100644 --- a/motrix_deploy_mujoco/tests/test_mujoco_deploy_backend.py +++ b/motrix_deploy_mujoco/tests/test_mujoco_deploy_backend.py @@ -208,7 +208,7 @@ def test_state_sensor_mapping_rejects_unknown_roles() -> None: SimulationRuntimeConfig.from_mapping(values) -@pytest.mark.parametrize("role", ["base_angular_velocity", "base_linear_acceleration", "base_linear_velocity"]) +@pytest.mark.parametrize("role", ["base_angular_velocity", "base_linear_acceleration"]) def test_missing_state_sensor_fails_at_model_binding(role: str) -> None: config = _config() config = replace(config, sensor_bindings=replace(config.sensor_bindings, **{role: None})) @@ -414,7 +414,7 @@ def unexpected_lookup(*args: Any) -> int: state = backend.robot.read_state(0.1) for role in ("base_angular_velocity", "base_linear_acceleration", "base_linear_velocity"): np.testing.assert_allclose(getattr(state, role), backend.data.sensordata[backend.robot._sensor_slices[role]]) - np.testing.assert_allclose(state.base_position, backend.model.qpos0[:3]) + np.testing.assert_allclose(backend.data.xpos[backend.robot._base_body_id], backend.model.qpos0[:3]) np.testing.assert_allclose(state.base_angular_velocity, [0.4, -0.5, 0.6], atol=1e-6) backend.close() @@ -470,7 +470,7 @@ def test_direct_scene_cfg_headless_uses_supplied_robot_floor_and_placement() -> backend.open() try: state = backend.robot.read_state(0.1) - np.testing.assert_allclose(state.base_position, backend.model.qpos0[:3]) + np.testing.assert_allclose(backend.data.xpos[backend.robot._base_body_id], backend.model.qpos0[:3]) np.testing.assert_allclose(state.base_orientation_xyzw, robot.rotation) floor_id = backend.mj.mj_name2id(backend.model, backend.mj.mjtObj.mjOBJ_GEOM, "floor") assert backend.model.geom_pos[floor_id, 2] == pytest.approx(0.2) diff --git a/motrix_deploy_mujoco/tests/test_scene_session.py b/motrix_deploy_mujoco/tests/test_scene_session.py index a4df8a3a..02da1b2b 100644 --- a/motrix_deploy_mujoco/tests/test_scene_session.py +++ b/motrix_deploy_mujoco/tests/test_scene_session.py @@ -89,7 +89,7 @@ def test_file_scene_and_custom_objects_preserved_placement_has_no_double_transfo backend.open() try: state = backend.robot.read_state(0.1) - np.testing.assert_allclose(state.base_position, backend.model.qpos0[:3]) + np.testing.assert_allclose(backend.data.xpos[backend.robot._base_body_id], backend.model.qpos0[:3]) np.testing.assert_allclose(state.base_orientation_xyzw, robot.rotation, atol=1e-6) np.testing.assert_allclose(backend.model.geom("obstacle").pos, [5, 6, 7]) assert backend.model.geom("platform").pos[2] == pytest.approx(0.2) @@ -131,7 +131,7 @@ def test_robot_attach_transform_and_init_key_pose_are_reset_once(rotation) -> No with runtime: for _ in range(2): state = runtime.robot.read_state(0.1) - np.testing.assert_allclose(state.base_position, expected_position, atol=1e-6) + np.testing.assert_allclose(runtime.data.xpos[runtime.robot._base_body_id], expected_position, atol=1e-6) np.testing.assert_allclose(state.base_orientation_xyzw, expected_quat[[1, 2, 3, 0]], atol=1e-6) np.testing.assert_allclose(state.joint_position, robot.key_pose.poses["custom"], atol=1e-6) runtime.data.qpos[:] = 0.0 @@ -151,7 +151,7 @@ def test_environment_scene_is_resolved_by_application_before_backend() -> None: try: assert backend.model.njnt == 13 assert backend.scene is not source - np.testing.assert_allclose(backend.robot.read_state(0.1).base_position, backend.model.qpos0[:3]) + np.testing.assert_allclose(backend.data.xpos[backend.robot._base_body_id], backend.model.qpos0[:3]) finally: backend.close() diff --git a/motrix_deploy_mujoco/tests/test_simulation_driver.py b/motrix_deploy_mujoco/tests/test_simulation_driver.py index 545c785b..bb63d87c 100644 --- a/motrix_deploy_mujoco/tests/test_simulation_driver.py +++ b/motrix_deploy_mujoco/tests/test_simulation_driver.py @@ -1,39 +1,48 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Physics-owned control cadence, pacing, and shared lifecycle integration.""" +"""Physics-owned session cadence, pacing, and shared lifecycle integration.""" import numpy as np import pytest -from control_helpers import DummyServoTask +from control_helpers import DummyServoPolicyProcessor from motrix_deploy.errors import ValidationError -from motrix_deploy.policy import NoOpPolicyRuntime -from motrix_deploy.runtime.control import ControlSession +from motrix_deploy.policy import NoOpPolicy +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import ControlSession, PolicyController +from motrix_deploy.runtime.lifecycle import ControllerStep +from motrix_deploy.runtime.result import LatencySummary, SimulationRolloutResult +from motrix_deploy.runtime.scheduler import FixedStepScheduler from motrix_deploy_mujoco.runtime import MujocoRuntime from motrix_env_core.input import ConstantPlanarVelocityBinding -@pytest.fixture -def driver(control_scene_config, control_gains): - config = control_scene_config - simulation = MujocoRuntime(config, control_period_s=0.02) - task = DummyServoTask(simulation.robot.spec, *control_gains) - interface = simulation.robot - control = ControlSession( - robot=interface, - task=task, - policy=NoOpPolicyRuntime(interface.spec.joint_count), +def bind_task(simulation, task, *, steps=3, period_s=None): + period_s = simulation.control_period_s if period_s is None else period_s + controller = PolicyController(task, NoOpPolicy(simulation.robot.spec.joint_count), steps=steps) + session = ControlSession( + controller=controller, + robot=simulation.robot, command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), - period_s=simulation.control_period_s, + period_s=period_s, state_timeout_s=0.1, ) + simulation.bind_session(session) + return controller + + +@pytest.fixture +def driver(control_scene_config, control_gains): + simulation = MujocoRuntime(control_scene_config, control_period_s=0.02) + task = DummyServoPolicyProcessor(simulation.robot.spec, *control_gains) + controller = bind_task(simulation, task) with simulation: - yield simulation, control, interface, task + yield simulation, controller, simulation.robot, task def test_physics_substeps_and_control_sample_times(driver, monkeypatch): - simulation, control, interface, task = driver + simulation, session, interface, task = driver events = [] samples = [] contexts = [] @@ -58,20 +67,47 @@ def record_observation(state, context): monkeypatch.setattr(simulation.robot, "apply_control", record_apply) monkeypatch.setattr(simulation.mj, "mj_step", record_step) monkeypatch.setattr(task, "build_observation", record_observation) - # The driver must not delegate a full physics period to a control callback. - monkeypatch.setattr(simulation, "advance_control_period", lambda: pytest.fail("legacy advance called")) - result = simulation.run(control, steps=3) + result = simulation.run() assert result.success and result.completed_steps == 3 assert samples == [0, 20_000_000, 40_000_000] assert contexts == pytest.approx([0.0, 0.02, 0.04]) assert events == (["tick"] + ["pd", "physics"] * simulation.physics_substeps) * 3 - assert result.simulation_time_s == pytest.approx(0.06) + assert isinstance(result, SimulationRolloutResult) + assert result.policy_simulation_time_s == pytest.approx(0.06) + assert isinstance(result.latency["read"], LatencySummary) + report = result.to_dict() + assert report["policy_simulation_time_s"] == pytest.approx(0.06) + assert report["latency"]["read"]["mean_ms"] == result.latency["read"].mean_ms assert simulation.data.time == pytest.approx(0.06) assert simulation.model is not None and not interface.health().healthy np.testing.assert_array_equal(simulation.data.ctrl, np.zeros(simulation.model.nu)) -def test_torque_control_session_preserves_control_and_physics_cadence(driver, monkeypatch): +def test_simulation_duration_excludes_nonpolicy_command_intervals(driver, monkeypatch): + simulation, controller, _, _ = driver + step = controller.step + decisions = 0 + + def with_ready_interval(state, context): + nonlocal decisions + decisions += 1 + if decisions == 1: + # A deterministic ready command has physical duration but no model tick. + return ControllerStep( + command=controller.policy_io.process_action( + np.zeros(simulation.robot.spec.joint_count, dtype=np.float32) + ) + ) + return step(state, context) + + monkeypatch.setattr(controller, "step", with_ready_interval) + result = simulation.run() + assert result.success and result.completed_steps == 3 + assert simulation.data.time == pytest.approx(0.08) + assert result.policy_simulation_time_s == pytest.approx(0.06) + + +def test_torque_controller_preserves_control_and_physics_cadence(driver, monkeypatch): from motrix_deploy.contracts import JointTorqueCommand simulation, _, interface, task = driver @@ -92,33 +128,27 @@ def record_step(model, data): monkeypatch.setattr(task, "build_observation", record_observation) monkeypatch.setattr(task, "process_action", lambda action: JointTorqueCommand(desired)) monkeypatch.setattr(simulation.mj, "mj_step", record_step) - control = ControlSession( - robot=interface, - task=task, - policy=NoOpPolicyRuntime(interface.spec.joint_count), - command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), - period_s=simulation.control_period_s, - state_timeout_s=0.1, - ) - result = simulation.run(control, steps=3) + result = simulation.run() assert result.success and result.completed_steps == 3 assert samples == [0, 20_000_000, 40_000_000] assert len(torques) == 3 * simulation.physics_substeps for torque in torques: np.testing.assert_array_equal(torque, desired) - assert result.simulation_time_s == pytest.approx(0.06) + assert result.policy_simulation_time_s == pytest.approx(0.06) np.testing.assert_array_equal(simulation.data.ctrl, 0) -def test_shared_tick_never_advances_physics(driver): - simulation, control, _, _ = driver - try: - assert control.start() - before = simulation.data.time - assert control.tick(elapsed_time_s=0.0) - assert simulation.data.time == before - finally: - control.stop() +def test_controller_step_never_writes_or_advances_physics(driver): + simulation, controller, robot, _ = driver + state = robot.read_state(0.1) + context = ControlContext(0, 0.0, ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)).read_command(), dt_s=0.02) + before_time = simulation.data.time + before_control = simulation.data.ctrl.copy() + controller.reset(state) + decision = controller.step(state, context) + assert decision.command is not None and not decision.complete + assert simulation.data.time == before_time + np.testing.assert_array_equal(simulation.data.ctrl, before_control) def test_headless_driver_is_deterministic_and_never_paces(monkeypatch, control_scene_config, control_gains): @@ -129,19 +159,11 @@ def test_headless_driver_is_deterministic_and_never_paces(monkeypatch, control_s traces = [] for _ in range(2): simulation = MujocoRuntime(config, control_period_s=0.02) - task = DummyServoTask(simulation.robot.spec, *control_gains) - interface = simulation.robot + task = DummyServoPolicyProcessor(simulation.robot.spec, *control_gains) with simulation: - control = ControlSession( - robot=interface, - task=task, - policy=NoOpPolicyRuntime(interface.spec.joint_count), - command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), - period_s=simulation.control_period_s, - state_timeout_s=0.1, - ) - result = simulation.run(control, steps=4) - assert result.success and result.overrun_count == 0 + bind_task(simulation, task, steps=4) + result = simulation.run() + assert result.success traces.append(result.trace_sha256) assert traces[0] == traces[1] @@ -149,13 +171,12 @@ def test_headless_driver_is_deterministic_and_never_paces(monkeypatch, control_s def test_realtime_paces_every_complete_interval_without_extra_tick(driver, monkeypatch): from motrix_deploy_mujoco import runtime - simulation, control, _, _ = driver + simulation, session, _, _ = driver waits = [] - class Scheduler: - overrun_count = 2 - + class Scheduler(FixedStepScheduler): def __init__(self, period_s): + super().__init__(period_s) assert period_s == simulation.control_period_s def reset(self): @@ -165,14 +186,13 @@ def wait(self, step): waits.append(step) monkeypatch.setattr(runtime, "RealtimeScheduler", Scheduler) - result = simulation.run(control, steps=3, realtime=True) + result = simulation.run(realtime=True) assert result.success and result.completed_steps == 3 assert waits == ["reset", 1, 2, 3] - assert result.overrun_count == 2 def test_physics_failure_cleans_robot_but_keeps_world_and_reports_actual_time(driver, monkeypatch): - simulation, control, interface, _ = driver + simulation, session, interface, _ = driver step = simulation.mj.mj_step calls = 0 @@ -184,33 +204,33 @@ def fail_mid_interval(model, data): step(model, data) monkeypatch.setattr(simulation.mj, "mj_step", fail_mid_interval) - result = simulation.run(control, steps=3) + result = simulation.run() assert not result.success and result.exit_reason == "backend_error" assert result.error == "physics failed" assert result.completed_steps == 1 - assert result.simulation_time_s == pytest.approx(2 * simulation.config.physics.dt) - assert result.real_time_factor == pytest.approx(result.simulation_time_s / result.wall_time_s) + assert result.policy_simulation_time_s == pytest.approx(2 * simulation.config.physics.dt) + assert result.real_time_factor == pytest.approx(result.policy_simulation_time_s / result.wall_time_s) assert simulation.model is not None and simulation.data is not None - assert not interface.health().healthy and not control.active + assert not interface.health().healthy np.testing.assert_array_equal(simulation.data.ctrl, np.zeros(simulation.model.nu)) - control.stop() # Shared cleanup remains idempotent after driver failure. + interface.stop() # Backend cleanup remains idempotent after driver failure. -def test_start_exception_still_cleans_shared_control(driver, monkeypatch): - simulation, control, interface, _ = driver +def test_controller_reset_exception_still_cleans_robot(driver, monkeypatch): + simulation, session, interface, _ = driver - def failed_start(): + def failed_reset(state): raise RuntimeError("start failed") - monkeypatch.setattr(control, "start", failed_start) - result = simulation.run(control, steps=3) + monkeypatch.setattr(session, "reset", failed_reset) + result = simulation.run() assert result.exit_reason == "backend_error" and result.error == "start failed" - assert result.completed_steps == 0 and result.simulation_time_s == 0.0 + assert result.completed_steps == 0 and result.policy_simulation_time_s == 0.0 assert simulation.model is not None and not interface.health().healthy def test_elapsed_control_time_is_relative_to_this_run(driver, monkeypatch): - simulation, control, _, task = driver + simulation, session, _, task = driver simulation.advance_control_period() before = simulation.data.time contexts = [] @@ -221,84 +241,107 @@ def record_context(state, context): return observe(state, context) monkeypatch.setattr(task, "build_observation", record_context) - result = simulation.run(control, steps=2) + result = simulation.run() assert result.success - assert contexts == pytest.approx([0.0, simulation.control_period_s]) - assert result.simulation_time_s == pytest.approx(2 * simulation.control_period_s) - assert simulation.data.time - before == pytest.approx(result.simulation_time_s) + assert contexts == pytest.approx([0.0, simulation.control_period_s, 2 * simulation.control_period_s]) + assert result.policy_simulation_time_s == pytest.approx(3 * simulation.control_period_s) + assert simulation.data.time - before == pytest.approx(result.policy_simulation_time_s) def test_start_termination_does_not_advance_physics(driver, monkeypatch): - simulation, control, interface, task = driver + simulation, session, interface, task = driver monkeypatch.setattr(task, "check_termination", lambda state: "done") - result = simulation.run(control, steps=3) + result = simulation.run() assert not result.success and result.exit_reason == "task_terminated" - assert result.completed_steps == 0 and result.simulation_time_s == 0.0 + assert result.completed_steps == 0 and result.policy_simulation_time_s == 0.0 assert simulation.data.time == 0.0 and not interface.health().healthy def test_tick_termination_has_no_extra_physics_interval(driver, monkeypatch): - simulation, control, _, task = driver + simulation, session, _, task = driver monkeypatch.setattr(task, "check_termination", lambda state: "done" if state.sample_time_ns > 0 else None) - result = simulation.run(control, steps=3) + result = simulation.run() assert result.exit_reason == "task_terminated" and result.completed_steps == 1 - assert result.simulation_time_s == pytest.approx(simulation.control_period_s) + assert result.policy_simulation_time_s == pytest.approx(simulation.control_period_s) def test_viewer_interrupt_uses_shared_cleanup(driver, monkeypatch): - simulation, control, interface, _ = driver + simulation, session, interface, _ = driver def interrupt(): raise KeyboardInterrupt("viewer closed") monkeypatch.setattr(simulation, "check_viewer_running", interrupt) - result = simulation.run(control, steps=3) + result = simulation.run() assert result.exit_reason == "interrupted" and result.completed_steps == 0 - assert result.simulation_time_s == 0.0 and not interface.health().healthy + assert result.policy_simulation_time_s == 0.0 and not interface.health().healthy assert simulation.model is not None -@pytest.mark.parametrize("steps", [0, -1, True, 1.5]) -def test_run_rejects_invalid_tick_count(driver, steps): - simulation, control, _, _ = driver - with pytest.raises(ValidationError, match="steps"): - simulation.run(control, steps=steps) +def test_bound_controller_period_controls_physics_cadence(driver): + simulation, _, _, task = driver + # A fresh runtime can bind a different integral session period. + simulation.close() + with MujocoRuntime(simulation.config) as runtime: + bind_task(runtime, task, steps=2, period_s=0.01) + result = runtime.run() + assert result.success + assert runtime.control_period_s == 0.01 + assert result.policy_simulation_time_s == pytest.approx(0.02) -def test_run_uses_supplied_control_session_period(driver): - simulation, _, interface, task = driver - control = ControlSession( - robot=interface, - task=task, - policy=NoOpPolicyRuntime(interface.spec.joint_count), +def test_binding_rejects_nonintegral_period_without_changing_cadence(driver): + simulation, controller, _, _ = driver + period_s = simulation.control_period_s + substeps = simulation.physics_substeps + invalid_period = simulation.sim.dt * 1.5 + fresh = MujocoRuntime(simulation.config, control_period_s=period_s) + invalid = ControlSession( + controller=PolicyController(controller.policy_io, controller.policy, steps=3), + robot=fresh.robot, command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), - period_s=0.01, + period_s=invalid_period, state_timeout_s=0.1, ) - result = simulation.run(control, steps=2) - assert result.success - assert simulation.control_period_s == control.period_s - assert result.simulation_time_s == pytest.approx(2 * control.period_s) - - -def test_binding_rejects_nonintegral_period_without_binding_control(driver): - from types import SimpleNamespace - - simulation, _, _, _ = driver - period_s = simulation.control_period_s - substeps = simulation.physics_substeps - invalid = SimpleNamespace(period_s=simulation.sim.dt * 1.5, robot=simulation.robot) - with pytest.raises(ValidationError, match="control.period_s"): - simulation.bind_control_session(invalid) - assert simulation.control is None + # An unbound host rejects non-integral cadence before claiming the session. + bound = simulation.session + with pytest.raises(ValidationError, match="session.period_s"): + fresh.bind_session(invalid) + assert fresh.session is None + assert simulation.session is bound + fresh.close() assert simulation.control_period_s == period_s and simulation.physics_substeps == substeps -def test_run_requires_integral_control_period(driver): - simulation, _, _, _ = driver - # Physics cannot resample a control period that does not span whole substeps. - from types import SimpleNamespace +def test_runtime_binding_rejects_foreign_robot_and_conflicting_control(driver): + simulation, controller, robot, _ = driver + bound = simulation.session + conflict = ControlSession( + controller=controller, + robot=robot, + command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), + period_s=bound.period_s, + state_timeout_s=0.1, + ) + with pytest.raises(ValidationError, match="bound"): + simulation.bind_session(conflict) + foreign_runtime = MujocoRuntime(simulation.config, control_period_s=bound.period_s) + try: + with pytest.raises(ValidationError, match="robot"): + foreign_runtime.bind_session(bound) + assert foreign_runtime.session is None + assert simulation.session is bound + finally: + foreign_runtime.close() + - mismatched = SimpleNamespace(period_s=simulation.sim.dt * 1.5, robot=simulation.robot) - with pytest.raises(ValidationError, match="control.period_s"): - simulation.run(mismatched, steps=1) +def test_final_advanced_state_is_checked_before_controller_completion(driver, monkeypatch): + simulation, _, _, task = driver + monkeypatch.setattr( + task, "check_termination", lambda state: "last interval failed" if state.sample_time_ns >= 60_000_000 else None + ) + result = simulation.run() + assert not result.success + assert result.exit_reason == "task_terminated" + assert result.completed_steps == 3 + assert result.policy_simulation_time_s == pytest.approx(0.06) diff --git a/motrix_deploy_mujoco/tests/test_viewer.py b/motrix_deploy_mujoco/tests/test_viewer.py index eca539a0..b147529b 100644 --- a/motrix_deploy_mujoco/tests/test_viewer.py +++ b/motrix_deploy_mujoco/tests/test_viewer.py @@ -9,6 +9,7 @@ import numpy as np import pytest +from motrix_deploy.runtime.scheduler import FixedStepScheduler from motrix_deploy_mujoco.viewer import MujocoGlfwViewer from motrix_env_core.config.scene import SystemCameraCfg from motrix_env_core.input import KeyboardPlanarVelocityBinding @@ -298,10 +299,10 @@ def test_render_event_pump_interrupts_without_keyboard_binding(event) -> None: def test_gui_runtime_pumps_startup_camera_and_close_with_constant_input( control_scene_config, control_gains, monkeypatch ) -> None: - from control_helpers import DummyServoTask + from control_helpers import DummyServoPolicyProcessor - from motrix_deploy.policy import NoOpPolicyRuntime - from motrix_deploy.runtime.control import ControlSession + from motrix_deploy.policy import NoOpPolicy + from motrix_deploy.runtime.control import ControlSession, PolicyController from motrix_deploy_mujoco import runtime from motrix_env_core.input import ConstantPlanarVelocityBinding @@ -312,20 +313,14 @@ def test_gui_runtime_pumps_startup_camera_and_close_with_constant_input( simulation = runtime.MujocoRuntime(replace(control_scene_config, render=True), viewer_factory=lambda *_: viewer) robot = simulation.robot - control = ControlSession( - robot=robot, - task=DummyServoTask(robot.spec, *control_gains), - policy=NoOpPolicyRuntime(robot.spec.joint_count), - command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), - period_s=0.02, - state_timeout_s=0.1, + controller = PolicyController( + DummyServoPolicyProcessor(robot.spec, *control_gains), NoOpPolicy(robot.spec.joint_count), steps=10 ) waits = [] - class Scheduler: - overrun_count = 0 - + class Scheduler(FixedStepScheduler): def __init__(self, period_s): + super().__init__(period_s) assert period_s == simulation.control_period_s def reset(self): @@ -345,15 +340,21 @@ def deliver_events(): poll() monkeypatch.setattr(glfw, "poll_events", deliver_events) - simulation.bind_control_session(control) + session = ControlSession( + controller=controller, + robot=robot, + command_binding=ConstantPlanarVelocityBinding((0.0, 0.0, 0.0)), + period_s=0.02, + state_timeout_s=0.1, + ) + simulation.bind_session(session) with simulation: assert glfw.poll_count == 1 and glfw.swap_count == 1 - result = simulation.run(steps=10) + result = simulation.run() assert result.exit_reason == "interrupted" and result.completed_steps == 3 - assert result.simulation_time_s == pytest.approx(0.06) + assert result.policy_simulation_time_s == pytest.approx(0.06) assert waits == [1, 2] assert mujoco.camera_moves == [(mujoco.mjtMouse.mjMOUSE_ZOOM, 0.0, -0.1)] - assert not control.active assert glfw.destroy_count == 1 and glfw.terminate_count == 1 assert mujoco.context.free_count == 1 and not viewer.is_running() diff --git a/motrix_deploy_tasks/README.md b/motrix_deploy_tasks/README.md index b06db9e5..22413295 100644 --- a/motrix_deploy_tasks/README.md +++ b/motrix_deploy_tasks/README.md @@ -1,7 +1,8 @@ # Motrix Deploy Tasks -`motrix-deploy-tasks` supplies the versioned Go2 walking task, flat/rough deployment worlds, -and installed Hydra recipes for `motrix-deploy`. It does not provide a simulation or hardware backend. +`motrix-deploy-tasks` supplies the versioned deployment tasks and installed Hydra recipes +for `motrix-deploy`: the Go2 walking task with flat/rough worlds, and the G1 WBT dance +task. It does not provide a simulation or hardware backend. Install a backend plugin and use an artifact exported for the matching task: @@ -9,9 +10,64 @@ Install a backend plugin and use an artifact exported for the matching task: motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy ``` -Use `go2-walk-rough/sim` for the rough scene, `runtime.backend=motrixsim` for native MotrixSim, -or `go2-walk-flat/hardware` for Unitree hardware. Recipes are packaged with the plugin; -no workspace config path is required. +Use `go2-walk-rough/sim` for the rough scene, `runtime.backend=motrixsim` for native +MotrixSim, or `go2-walk-flat/hardware` for Unitree hardware. Recipes are packaged with the +plugin; no workspace config path is required. See the [deployment tutorial](../docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md) for export, configuration, and hardware safety procedures. + +## G1 WBT dance: MuJoCo / MotrixSim sim2sim + +Use the standard **export → artifact → `motrix-deploy`** pipeline. The `g1_wbt/v1` task +embeds the actor's motion references, servo gains, action scales, preparation gains and +timing, and hardware-observable termination thresholds in the artifact. Deployment +requires neither Torch nor an RL environment; export needs the training provider and task +environment packages, but does **not** train. + +```bash +source .venv/bin/activate +RUN=runs/g1-wbt-dance/motrix/torch/fastsac/ +python scripts/export_deploy.py run="$RUN" \ + output=artifacts/g1-wbt-dance-software-pd.deploy validation.atol=3e-5 + +motrix-deploy task=g1-wbt-dance/sim \ + artifact=artifacts/g1-wbt-dance-software-pd.deploy +``` + +Headless validation and artifact inspection: + +```bash +motrix-deploy task=g1-wbt-dance/sim \ + artifact=artifacts/g1-wbt-dance-software-pd.deploy runtime.viewer=false +motrix-deploy inspect artifact=artifacts/g1-wbt-dance-software-pd.deploy +``` + +Notes: + +- The default duration comes from the embedded single clip; shorter runs use `duration_s`, + longer durations are rejected before opening the backend instead of looping or holding. +- No velocity command is needed: WBT motion is artifact-owned. +- The same artifact runs on MuJoCo and MotrixSim (`runtime.backend=motrixsim`, with + `runtime.physics.solver_iterations=3` matching the training budget). It is not a + hardware deployment recipe: the current Unitree transport is Go2-specific, and sim2sim + success is not evidence of hardware safety. +- The recipe's 0.002 s physics step (10 substeps per 0.02 s control tick) keeps the stiff + preparation PD inside MuJoCo's explicit-damping stability region. + +The task runs a four-phase lifecycle mirroring real deployment practice — `prepare` (ramp +measured joints to the robot's default standing pose with artifact-embedded gains and +timing, gated on continuously measured readiness), `policy_hold`, `playback`, `damping`. +The dance ends in a deliberately leaned pose that only the tracking policy can balance; +after playback the task enters measured damping directly. Ending upright requires the +motion clip itself to finish at the standing pose. +Takeover after measured readiness is automatic by default; programmatic applications can +stage it manually via `automatic_start=False`, `attach_keyboard`, or the request methods. +The CLI routes no task-specific options — operator input and preparation timing are task +semantics embedded in the artifact or set programmatically. See the +[deployment tutorial](../docs/source/en/user_guide/tutorial/advanced/motrix_deploy.md) +for the complete runtime, session, and controller contracts. + +```bash +python -m pytest motrix_deploy_tasks/tests -q +``` diff --git a/motrix_deploy_tasks/pyproject.toml b/motrix_deploy_tasks/pyproject.toml index d3cd6fc7..8285dba6 100644 --- a/motrix_deploy_tasks/pyproject.toml +++ b/motrix_deploy_tasks/pyproject.toml @@ -19,7 +19,8 @@ dependencies = [ ] [project.entry-points."motrix_deploy.tasks"] -"go2_walk/v1" = "motrix_deploy_tasks.tasks.go2_walk:Go2WalkDeployTaskV1" +"go2_walk/v1" = "motrix_deploy_tasks.tasks.go2_walk:Go2WalkDeployTask" +"g1_wbt/v1" = "motrix_deploy_tasks.tasks.g1_wbt:G1WbtDeployTask" [project.entry-points."motrix_deploy.envs"] flat = "motrix_deploy_tasks.envs.flat:build_scene" diff --git a/motrix_deploy_tasks/src/motrix_deploy_tasks/config/task/g1-wbt-dance/sim.yaml b/motrix_deploy_tasks/src/motrix_deploy_tasks/config/task/g1-wbt-dance/sim.yaml new file mode 100644 index 00000000..57d4bc11 --- /dev/null +++ b/motrix_deploy_tasks/src/motrix_deploy_tasks/config/task/g1-wbt-dance/sim.yaml @@ -0,0 +1,26 @@ +# @package _global_ +defaults: + - /runtime: sim + - _self_ + +# Task-owned default model: the compiler-validated 400k-iteration FastSAC dance +# checkpoint. Override with an explicit artifact=... to deploy another export. +artifact: artifacts/g1-wbt-dance.deploy + +runtime: + backend: mujoco + sensor_bindings: + base_angular_velocity: base_gyro + base_linear_acceleration: base_accel + base_linear_velocity: null + deploy_env_id: flat + robot_id: g1-29dof + physics: + # 0.002 s (10 substeps per 0.02 s control tick) keeps the stiff standing-hold + # preparation PD free of the discrete contact limit cycle seen at 0.005 s in + # MuJoCo; both backends complete the full four-phase flow at this dt. + dt: 0.002 + # Use runtime.physics.solver_iterations=3 to match MotrixSim training. + solver_iterations: 100 + +command: null diff --git a/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/flat.py b/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/flat.py index 20ccb359..9e6bd433 100644 --- a/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/flat.py +++ b/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/flat.py @@ -4,14 +4,28 @@ """A robot-free flat-ground deployment world.""" from motrix_env_core.config import configclass -from motrix_env_core.config.scene import FlatTerrainCfg, SceneCfg, SceneObjsCfg +from motrix_env_core.config.scene import FlatTerrainCfg, SceneCfg, SceneObjsCfg, SystemCameraCfg +from motrix_env_core.config.scene.base import SceneVisualCfg +from motrix_env_core.config.scene.light import LightCfg @configclass class FlatWorldObjsCfg(SceneObjsCfg): floor: FlatTerrainCfg = FlatTerrainCfg(friction=(0.6, 0.005, 0.0001)) + sun: LightCfg = LightCfg(color=(0.7, 0.7, 0.7), illuminance=10_000.0) def build_scene() -> SceneCfg: """Build fresh flat ground with an empty robot slot.""" - return SceneCfg(objs=FlatWorldObjsCfg()) + return SceneCfg( + objs=FlatWorldObjsCfg(), + # Front view matching the G1 WBT training scene (g1/common.py). + system_camera=SystemCameraCfg(distance=6.0, elevation=-20.0, azimuth=180.0), + visual=SceneVisualCfg( + ambient_light_color=(0.3, 0.3, 0.3), + ambient_light_brightness=1_000.0, + head_light_color=(0.6, 0.6, 0.6), + head_light_luminous_power=1_000.0, + tone_mapping="none", + ), + ) diff --git a/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/rough.py b/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/rough.py index 69bbede3..7321a33a 100644 --- a/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/rough.py +++ b/motrix_deploy_tasks/src/motrix_deploy_tasks/envs/rough.py @@ -11,6 +11,7 @@ SceneAssetsCfg, SceneCfg, SceneObjsCfg, + SystemCameraCfg, ) @@ -32,4 +33,9 @@ class RoughWorldObjsCfg(SceneObjsCfg): def build_scene() -> SceneCfg: """Build fresh seeded rough ground with an empty robot slot.""" - return SceneCfg(assets=RoughWorldAssetsCfg(), objs=RoughWorldObjsCfg()) + # Front view matching the quadruped training scenes (e.g. quadruped/cfg.py). + return SceneCfg( + assets=RoughWorldAssetsCfg(), + objs=RoughWorldObjsCfg(), + system_camera=SystemCameraCfg(distance=10.0, elevation=-25.0, azimuth=90.0), + ) diff --git a/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/g1_wbt.py b/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/g1_wbt.py new file mode 100644 index 00000000..77131631 --- /dev/null +++ b/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/g1_wbt.py @@ -0,0 +1,646 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""G1 WBT task data, policy I/O and measured-state deployment controllers.""" + +from __future__ import annotations + +from dataclasses import dataclass, field, replace +from typing import TYPE_CHECKING, Annotated, ClassVar + +import numpy as np +from pydantic import Field + +if TYPE_CHECKING: + from motrix_deploy.artifact.io import Artifact + +from motrix_deploy.artifact.schema import TaskSpec +from motrix_deploy.contracts import ( + FloatArray, + JointServoCommand, + RobotSpec, + RobotState, + float32_array, +) +from motrix_deploy.errors import ValidationError +from motrix_deploy.policy import Policy +from motrix_deploy.policy.processing import PolicyProcessor +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import PolicyController +from motrix_deploy.runtime.lifecycle import ControllerStep +from motrix_deploy.task import DeployTask + +FiniteFloat = Annotated[float, Field(allow_inf_nan=False)] +NonNegativeFloat = Annotated[FiniteFloat, Field(ge=0)] +JointVector = Annotated[list[FiniteFloat], Field(min_length=29, max_length=29)] +GainVector = Annotated[list[NonNegativeFloat], Field(min_length=29, max_length=29)] +Quaternion = Annotated[list[FiniteFloat], Field(min_length=4, max_length=4)] + + +class G1WbtTaskSpec(TaskSpec): + """One motion clip in canonical robot order, inline or as an artifact NPZ payload.""" + + task_name: ClassVar[str] = "g1_wbt/v1" + period_s: Annotated[FiniteFloat, Field(gt=0)] = 0.02 + action_scale: GainVector + kp: GainVector + kd: GainVector + preparation_joint_position: JointVector | None = None + preparation_kp: GainVector | None = None + preparation_kd: GainVector | None = None + preparation_ramp_duration_s: NonNegativeFloat = 2.0 + preparation_settle_duration_s: NonNegativeFloat = 1.0 + preparation_timeout_s: Annotated[FiniteFloat, Field(gt=0)] = 5.0 + # The motion clip travels as the artifact's NPZ payload (joint_pos/joint_vel/ + # reference_quaternion_xyzw arrays); the task loads and validates it. + motion_frames: Annotated[int, Field(ge=1)] + reference_body_name: str = "torso_link" + termination_ref_orientation_threshold: NonNegativeFloat + termination_joint_position_threshold: NonNegativeFloat + termination_joint_velocity_threshold: NonNegativeFloat + + +@dataclass(frozen=True) +class G1WbtMotion: + """One validated motion clip in canonical robot order.""" + + joint_pos: FloatArray + joint_vel: FloatArray + reference_quaternion_xyzw: FloatArray + + def __post_init__(self) -> None: + joint_pos = np.asarray(self.joint_pos) + joint_vel = np.asarray(self.joint_vel) + quaternions = np.asarray(self.reference_quaternion_xyzw) + if joint_pos.ndim != 2 or joint_pos.shape[0] < 1 or joint_pos.shape[1] < 1: + raise ValidationError("motion.joint_pos", "a non-empty frame matrix", joint_pos.shape) + if joint_vel.shape != joint_pos.shape: + raise ValidationError("motion.joint_vel", f"shape {joint_pos.shape}", joint_vel.shape) + if quaternions.shape != (joint_pos.shape[0], 4): + raise ValidationError("motion.reference_quaternion_xyzw", f"({joint_pos.shape[0]}, 4)", quaternions.shape) + if not np.allclose(np.linalg.norm(quaternions, axis=1), 1, atol=1e-3, rtol=0): + raise ValidationError("motion.reference_quaternion_xyzw", "unit xyzw quaternions", None) + + def __len__(self) -> int: + return int(np.asarray(self.joint_pos).shape[0]) + + +def _load_motion(spec: G1WbtTaskSpec, artifact: Artifact | None) -> G1WbtMotion: + """Load and validate the motion clip from the artifact's single NPZ payload.""" + if artifact is None: + raise ValidationError("task.payloads", "the deployment artifact", None) + if len(artifact.manifest.payloads) != 1: + raise ValidationError("task.payloads", "exactly one motion payload entry", len(artifact.manifest.payloads)) + with np.load(artifact.root / artifact.manifest.payloads[0].path, allow_pickle=False) as arrays: + try: + motion = G1WbtMotion(arrays["joint_pos"], arrays["joint_vel"], arrays["reference_quaternion_xyzw"]) + except KeyError as error: + raise ValidationError( + f"task.payloads.{error.args[0]}", "a motion channel in the NPZ payload", None + ) from error + if len(motion) != spec.motion_frames: + raise ValidationError("task.motion_frames", f"{len(motion)} motion frames", spec.motion_frames) + return motion + + +class G1WbtPolicyProcessor(PolicyProcessor[None]): + """Measured-state G1 policy I/O with raw history and servo safety limits. + + The embedded spec is already in canonical robot order (the profile compiler + performs name-based motion remapping at export), so the actor math below + indexes motion channels directly. The actor has 154 inputs: reference joint + positions (29), reference joint velocities (29), relative torso orientation + (6), body-frame base angular velocity (3), measured joint positions minus + default (29), measured joint velocities (29), and the last raw policy action + (29). ``action_scale`` is the *resolved* scale in radians per unit action: + training WBT uses ``0.25 * effort_limit / kp`` (zero for zero kp), not a + uniform 0.25-radian scale. No noise, clipping or frame advancement happens + in the observation; ``previous_action`` history stores the raw action. + """ + + observation_size = 154 + action_size = 29 + + def __init__(self, spec: G1WbtTaskSpec, robot: RobotSpec, motion: G1WbtMotion) -> None: + if robot.joint_count != 29: + raise ValidationError("robot.joint_count", 29, robot.joint_count) + if robot.base_link_name != "pelvis" or spec.reference_body_name != "torso_link": + raise ValidationError("g1_wbt.kinematics", "pelvis base and torso_link reference", spec.reference_body_name) + self.spec = spec + self.robot = robot + self.motion = motion + # G1 model: aligned pelvis IMU, identity fixed rotations, serial Z-X-Y waist. + # Inertial-frame quaternions are NOT link-frame mounting transforms. + try: + self._waist_indices = np.asarray( + [robot.joint_names.index(f"waist_{axis}_joint") for axis in ("yaw", "roll", "pitch")] + ) + except ValueError as error: + raise ValidationError("robot.joint_names", "G1 yaw/roll/pitch waist joints", robot.joint_names) from error + self._frames = len(motion) + self._motion_joint_position = np.asarray(motion.joint_pos, dtype=np.float32) + self._motion_joint_velocity = np.asarray(motion.joint_vel, dtype=np.float32) + self._reference_quaternion = np.asarray(motion.reference_quaternion_xyzw, dtype=np.float32) + self._default_joint_position = robot.default_joint_position.astype(np.float32, copy=True) + self._action_scale = np.asarray(spec.action_scale, dtype=np.float32) + self._previous_action = np.zeros(self.action_size, dtype=np.float32) + self._kp = np.asarray(spec.kp, dtype=np.float32) + self._kd = np.asarray(spec.kd, dtype=np.float32) + self._latest_frame = 0 + self._reference_frame: int | None = None + + def reset_reference(self) -> None: + """Restore the initial reference when starting a new task execution.""" + self._reference_frame = 0 + self._latest_frame = 0 + + def set_reference_frame(self, frame: int) -> None: + """Select a reference independently of the continuously running policy.""" + if not 0 <= frame < self._frames: + raise ValidationError("reference_frame", "a frame inside the single motion clip", frame) + self._reference_frame = frame + + def validate_command(self, command: None) -> None: + if command is not None: + raise ValidationError("command", "None (motion is artifact-owned)", type(command).__name__) + + def reset(self, state: RobotState, context: ControlContext[None]) -> None: + self._previous_action.fill(0) + self._latest_frame = 0 + + @property + def previous_action(self) -> np.ndarray: + """Last processed raw action in policy order, independently owned.""" + return self._previous_action.copy() + + def actor_observation( + self, + frame: int, + torso_quaternion_xyzw: np.ndarray, + base_angular_velocity_body: np.ndarray, + joint_positions: np.ndarray, + joint_velocities: np.ndarray, + previous_action: np.ndarray | None = None, + ) -> np.ndarray: + """Return the raw actor vector for a caller-selected motion frame. + + Torso and motion quaternions are world-frame xyzw. The relative rotation + is ``R(torso).T @ R(reference)``; its first TWO ROWS are flattened in + row-major order (not the commonly used first-two-columns encoding). + Base angular velocity is already expressed in the floating-base frame, + not the torso frame. Explicit ``previous_action`` overrides the history + for this observation only, without mutating it. Otherwise the most recent + ``process_action`` input is echoed, as training observes the current raw + action after stepping and thus the previous action at the next inference. + """ + relative_rotation = _rotation_matrix(torso_quaternion_xyzw).T @ _rotation_matrix( + self._reference_quaternion[frame] + ) + raw_history = self._previous_action if previous_action is None else previous_action + return np.concatenate( + ( + self._motion_joint_position[frame], + self._motion_joint_velocity[frame], + relative_rotation[:2].reshape(-1), + base_angular_velocity_body, + np.asarray(joint_positions) - self._default_joint_position, + joint_velocities, + raw_history, + ) + ).astype(np.float32) + + def torso_orientation(self, state: RobotState) -> FloatArray: + """World XYZW torso attitude from measured pelvis attitude and waist FK. + + This fixed G1-29DOF chain matches the deployed model, not arbitrary robots. + Hardware must calibrate its IMU into the pelvis frame and map serial joint + coordinates before constructing RobotState. No simulator body query, + root position, desired joint position or motion quaternion is used. + """ + orientation = state.base_orientation_xyzw.astype(np.float64) + yaw, roll, pitch = state.joint_position[self._waist_indices] + for angle, axis in zip((yaw, roll, pitch), (2, 0, 1)): + rotation = np.zeros(4, dtype=np.float64) + rotation[axis] = np.sin(float(angle) / 2) + rotation[3] = np.cos(float(angle) / 2) + v, w = orientation[:3], orientation[3] + r, s = rotation[:3], rotation[3] + orientation = np.concatenate((w * r + s * v + np.cross(v, r), [w * s - np.dot(v, r)])) + return (orientation / np.linalg.norm(orientation)).astype(np.float32) + + def build_observation(self, state: RobotState, context: ControlContext[None]) -> FloatArray: + frame = context.step if self._reference_frame is None else self._reference_frame + if not 0 <= frame < self._frames: + raise ValidationError("context.step", "a frame inside the single motion clip", frame) + self._latest_frame = frame + return self.actor_observation( + frame, + self.torso_orientation(state), + state.base_angular_velocity, + state.joint_position, + state.joint_velocity, + ) + + def process_action(self, action: FloatArray) -> JointServoCommand: + raw = float32_array(action, path="action.raw", shape=(29,)) + self._previous_action = raw.copy() # Boundary arrays are read-only; history must stay writable. + # Neither the raw action nor the scaled target is clipped before the + # robot limit clamp below: this matches the training joint-position term. + target = self._default_joint_position + self._action_scale * raw + target = np.clip(target, self.robot.position_lower, self.robot.position_upper).astype(np.float32) + zeros = np.zeros(29, dtype=np.float32) + return JointServoCommand(target, zeros, zeros, self._kp, self._kd) + + def check_termination(self, state: RobotState) -> str | None: + frame = self._latest_frame + torso = self.torso_orientation(state) + reference = self._reference_quaternion[frame] + gravity_error = abs(2 * (reference[0] ** 2 + reference[1] ** 2 - torso[0] ** 2 - torso[1] ** 2)) + if gravity_error > self.spec.termination_ref_orientation_threshold: + return "bad_ref_ori" + violation = np.maximum(self.robot.position_lower - state.joint_position, 0) + np.maximum( + state.joint_position - self.robot.position_upper, 0 + ) + if np.max(violation) > self.spec.termination_joint_position_threshold: + return "bad_dof_pos" + if np.any(np.abs(state.joint_velocity) > self.spec.termination_joint_velocity_threshold): + return "bad_dof_vel" + return None + + +def _rotation_matrix(quaternion_xyzw: np.ndarray) -> np.ndarray: + """Quaternion matrix with the same norm correction as training's encoder.""" + x, y, z, w = np.asarray(quaternion_xyzw, dtype=np.float64) + s = 2.0 / (x * x + y * y + z * z + w * w) + return np.array( + [ + [1 - s * (y * y + z * z), s * (x * y - z * w), s * (x * z + y * w)], + [s * (x * y + z * w), 1 - s * (x * x + z * z), s * (y * z - x * w)], + [s * (x * z - y * w), s * (y * z + x * w), 1 - s * (x * x + y * y)], + ] + ) + + +@dataclass +class StageResult: + """G1 controller-local readiness or damping diagnostics.""" + + name: str + steps: int = 0 + time_s: float = 0.0 + complete: bool = False + metrics: dict[str, float] = field(default_factory=dict) + error: str | None = None + + +@dataclass(frozen=True) +class G1PreparationSettings: + """Measured readiness limits; preparation never injects a reference root state.""" + + ramp_duration_s: float = 2.0 + settle_duration_s: float = 1.0 + timeout_s: float = 5.0 + max_joint_error_rad: float = 0.2 + max_joint_velocity_rad_s: float = 1.0 + max_base_tilt_rad: float = 0.5 + + +class G1ReadyController: + """Ramp from measured joints, then require an uninterrupted ready interval.""" + + name = "prepare" + + def __init__( + self, + target: FloatArray, + kp: FloatArray, + kd: FloatArray, + robot: RobotSpec, + settings: G1PreparationSettings, + ) -> None: + self._initial_position: FloatArray | None = None + self._target = np.clip(target, robot.position_lower, robot.position_upper).astype(np.float32) + self._kp = kp + self._kd = kd + self._robot = robot + self._settings = settings + self._stop_requested = False + self._ready_since: float | None = None + self._reached_ready = False + self._zeros = np.zeros(robot.joint_count, dtype=np.float32) + + def reset(self, state: RobotState) -> None: + self._initial_position = state.joint_position.copy() + self._ready_since = None + self._reached_ready = False + self._stop_requested = False + + def hold_command(self) -> JointServoCommand: + """Keep the independent standing posture while waiting for a start request.""" + return JointServoCommand(self._target, self._zeros, self._zeros, self._kp, self._kd) + + def request_stop(self) -> None: + self._stop_requested = True + + def step(self, state: RobotState, context: ControlContext[None]) -> ControllerStep: + if self._stop_requested: + return ControllerStep(complete=True) + elapsed_time_s = context.elapsed_time_s + assert self._initial_position is not None + settings = self._settings + x, y, _, _ = state.base_orientation_xyzw + tilt = float(np.arccos(np.clip(1 - 2 * (float(x) ** 2 + float(y) ** 2), -1, 1))) + metrics = { + "max_joint_error_rad": float(np.max(np.abs(state.joint_position - self._target))), + "max_joint_velocity_rad_s": float(np.max(np.abs(state.joint_velocity))), + "base_tilt_rad": tilt, + } + if tilt > settings.max_base_tilt_rad: + return ControllerStep(metrics=metrics, error=f"unsafe base tilt during preparation: {metrics}") + ready = ( + elapsed_time_s + 1e-9 >= settings.ramp_duration_s + and metrics["max_joint_error_rad"] <= settings.max_joint_error_rad + and metrics["max_joint_velocity_rad_s"] <= settings.max_joint_velocity_rad_s + ) + if ready: + if self._ready_since is None: + self._ready_since = elapsed_time_s + else: + self._ready_since = None + if ( + self._ready_since is not None + and elapsed_time_s - self._ready_since + 1e-9 >= settings.settle_duration_s + and (self._reached_ready or elapsed_time_s <= settings.timeout_s + 1e-9) + ): + self._reached_ready = True + return ControllerStep(complete=True, metrics=metrics) + if not self._reached_ready and elapsed_time_s + 1e-9 >= settings.timeout_s: + return ControllerStep(metrics=metrics, error=f"preparation timed out: {metrics}") + fraction = ( + np.clip((elapsed_time_s + context.dt_s) / settings.ramp_duration_s, 0, 1) + if settings.ramp_duration_s > 0 + else 1 + ) + target = self._initial_position + np.float32(fraction) * (self._target - self._initial_position) + target = np.clip(target, self._robot.position_lower, self._robot.position_upper).astype(np.float32) + return ControllerStep( + command=JointServoCommand(target, self._zeros, self._zeros, self._kp, self._kd), metrics=metrics + ) + + +class G1DampingController: + """Damp measured joint velocity briefly, without holding any reference pose.""" + + name = "stop" + + def __init__(self, kd: FloatArray, robot: RobotSpec) -> None: + self._kd = kd + self._robot = robot + self._zeros = np.zeros_like(kd) + self._stop_requested = False + + def reset(self, state: RobotState) -> None: + self._stop_requested = False + + def request_stop(self) -> None: + self._stop_requested = True + + def step(self, state: RobotState, context: ControlContext[None]) -> ControllerStep: + elapsed_time_s = context.elapsed_time_s + if self._stop_requested or elapsed_time_s + 1e-9 >= 0.3: + return ControllerStep(complete=True) + # The backend validates position targets even with kp=0. Clipping keeps + # the command valid but cannot add a position-holding torque. + target = np.clip(state.joint_position, self._robot.position_lower, self._robot.position_upper).astype( + np.float32 + ) + return ControllerStep(command=JointServoCommand(target, self._zeros, self._zeros, self._zeros, self._kd)) + + +class G1WbtDeployTask(DeployTask[None]): + """Own standing preparation, policy hold, motion playback and damping stop.""" + + spec_type = G1WbtTaskSpec + + def __init__( + self, + spec: G1WbtTaskSpec, + robot: RobotSpec, + policy: Policy, + steps: int | None = None, + *, + automatic_start: bool = True, + motion: G1WbtMotion | None = None, + artifact: Artifact | None = None, + ): + if motion is None: + motion = _load_motion(spec, artifact) + budget = len(motion) if steps is None else steps + if not 0 < budget <= len(motion): + raise ValidationError("steps", "a positive budget inside the single motion clip", budget) + self.spec = spec + self.robot = robot + self.motion = motion + self.policy_io = G1WbtPolicyProcessor(spec, robot, motion) + self.policy_controller = PolicyController(self.policy_io, policy) + self._playback_budget = budget + self._standing_position = np.asarray( + robot.default_joint_position + if spec.preparation_joint_position is None + else spec.preparation_joint_position, + dtype=np.float32, + ).copy() + self._preparation_kp = np.asarray( + spec.kp if spec.preparation_kp is None else spec.preparation_kp, dtype=np.float32 + ) + self._preparation_kd = np.asarray( + spec.kd if spec.preparation_kd is None else spec.preparation_kd, dtype=np.float32 + ) + self._preparation_settings = G1PreparationSettings( + ramp_duration_s=spec.preparation_ramp_duration_s, + settle_duration_s=spec.preparation_settle_duration_s, + timeout_s=spec.preparation_timeout_s, + ) + self.ready = G1ReadyController( + self._standing_position, self._preparation_kp, self._preparation_kd, robot, self._preparation_settings + ) + self.damping = G1DampingController(self.policy_io._kd, robot) + self.transitions: list[StageResult] = [] + self._phase = "prepare" + self._record: StageResult | None = None + self._stop_requested = False + self._policy_start_requested = False + self._motion_start_requested = False + self._preparation_ready = False + self._playback_steps = 0 + self._stage_origin_s: float | None = None + self._keyboard = None + # Default takeover mode: after measured readiness the policy starts by + # itself and playback follows the task's single mandatory frozen-reference + # interval. Programmatic applications pass automatic_start=False (manual + # request methods only) or attach a keyboard for operator staging. + self._automatic_hold_ticks = 0 if automatic_start else None + self._held_ticks = 0 + + @property + def phase(self) -> str: + return self._phase + + @property + def preparation_ready(self) -> bool: + return self._preparation_ready + + @property + def playback_steps(self) -> int: + return self._playback_steps + + @classmethod + def default_duration_s(cls, spec: G1WbtTaskSpec) -> float: + return spec.motion_frames * spec.period_s + + def validate_command(self, command: None) -> None: + self.policy_io.validate_command(command) + + def _enter_phase(self, phase: str, *, completed: bool = True) -> None: + if self._record is not None: + self._record.complete = completed + self._phase = phase + self._stage_origin_s = None + self._record = StageResult(name=phase) + self.transitions.append(self._record) + + def reset(self, state: RobotState) -> None: + self._stop_requested = False + self._policy_start_requested = False + self._motion_start_requested = False + self._preparation_ready = False + self._playback_steps = 0 + self._held_ticks = 0 + self.policy_controller.steps = None + self.policy_io.reset_reference() + self.transitions.clear() + self._record = None + self._enter_phase("prepare") + self.ready.reset(state) + + def request_policy_start(self) -> None: + """Latch operator intent; takeover still requires measured preparation readiness.""" + self._policy_start_requested = True + + def request_motion_start(self) -> None: + """Latch playback intent without changing control state from the input thread.""" + self._motion_start_requested = True + + def request_stop(self) -> None: + self._stop_requested = True + + def attach_keyboard(self, keyboard, *, hold_ticks: int = 0) -> None: + """Let the task translate viewer keyboard press edges into phase requests.""" + if keyboard is None: + raise ValidationError("operator.keyboard", "an event-framed keyboard device", None) + self._keyboard = keyboard + self._automatic_hold_ticks = hold_ticks + + def enable_automatic_start(self, hold_ticks: int = 0) -> None: + """Let the task script its own phase requests after measured readiness.""" + self._keyboard = None + self._automatic_hold_ticks = hold_ticks + + @property + def operator_hint(self) -> str: + """One-line key reference printed by the CLI when keyboard input is attached.""" + return "p start policy m start motion o stop" + + def _process_operator_inputs(self) -> None: + if self._keyboard is not None: + self._keyboard.poll() + # Letters only: MotrixSim's viewer input supports letters, function, + # special and arrow keys, but not punctuation such as ']'. + if self._keyboard.is_key_down("p"): + self._policy_start_requested = True + if self._keyboard.is_key_down("m"): + self._motion_start_requested = True + if self._keyboard.is_key_down("o"): + self._stop_requested = True + elif self._automatic_hold_ticks is None: + return + elif self._phase == "prepare": + if self._preparation_ready: + self._policy_start_requested = True + return + elif self._phase != "policy_hold": + return + # Once the policy runs, playback follows the configured hold target; an + # explicit `m` press merely starts it earlier. + self._held_ticks += 1 + if self._held_ticks >= self._automatic_hold_ticks: + self._motion_start_requested = True + + def _begin_damping(self, state: RobotState) -> None: + self._enter_phase("damping", completed=not self._stop_requested) + self.damping.reset(state) + + def _record_decision(self, decision: ControllerStep, context: ControlContext[None]) -> None: + assert self._record is not None + if self._stage_origin_s is None: + self._stage_origin_s = context.elapsed_time_s + record = self._record + record.time_s = context.elapsed_time_s - self._stage_origin_s + record.metrics = dict(decision.metrics) + if decision.error: + record.error = decision.error + elif decision.command is not None: + record.steps += 1 + record.time_s += context.dt_s + + def _deterministic_step(self, state: RobotState, context: ControlContext[None]) -> ControllerStep: + assert self._record is not None + if self._stage_origin_s is None: + self._stage_origin_s = context.elapsed_time_s + local = ControlContext( + self._record.steps, context.elapsed_time_s - self._stage_origin_s, context.command, context.dt_s + ) + controller = self.ready if self._phase == "prepare" else self.damping + decision = controller.step(state, local) + if self._phase == "prepare": + self._preparation_ready = decision.complete and decision.error is None + if decision.complete and not self._policy_start_requested: + decision = replace(decision, complete=False, command=self.ready.hold_command()) + self._record_decision(decision, context) + return replace(decision, success=not self._stop_requested) + + def step(self, state: RobotState, context: ControlContext[None]) -> ControllerStep: + self._process_operator_inputs() + if self._phase == "complete": + return ControllerStep(complete=True, success=not self._stop_requested) + if self._stop_requested and self._phase != "damping": + self._begin_damping(state) + if self._phase == "prepare": + decision = self._deterministic_step(state, context) + if decision.error is not None or not (self._preparation_ready and self._policy_start_requested): + return decision + self.policy_controller.reset(state) + self._enter_phase("policy_hold") + if self._phase == "policy_hold": + # Policy takeover always gets at least one held-reference interval before playback. + assert self._record is not None + if self._motion_start_requested and self._record.steps > 0: + self._enter_phase("playback") + # Preserve inference history; only the remaining playback budget becomes finite. + self.policy_controller.steps = self.policy_controller.completed_steps + self._playback_budget + if self._phase in {"policy_hold", "playback"}: + frame = self._playback_steps if self._phase == "playback" else 0 + self.policy_io.set_reference_frame(min(frame, len(self.motion) - 1)) + decision = self.policy_controller.step(state, context) + self._record_decision(decision, context) + if not decision.complete: + if self._phase == "playback" and decision.policy_tick: + self._playback_steps += 1 + return decision + self._begin_damping(state) + decision = self._deterministic_step(state, context) + if decision.complete: + assert self._record is not None + self._record.complete = True + self._phase = "complete" + return decision diff --git a/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/go2_walk.py b/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/go2_walk.py index 9e453b78..588c23bb 100644 --- a/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/go2_walk.py +++ b/motrix_deploy_tasks/src/motrix_deploy_tasks/tasks/go2_walk.py @@ -11,7 +11,11 @@ from motrix_deploy.artifact.schema import TaskSpec from motrix_deploy.contracts import FloatArray, JointServoCommand, RobotSpec, RobotState, float32_array from motrix_deploy.errors import ValidationError -from motrix_deploy.runtime import PolicyContext +from motrix_deploy.policy import Policy +from motrix_deploy.policy.processing import PolicyProcessor +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.control import PolicyController +from motrix_deploy.runtime.lifecycle import ControllerStep from motrix_deploy.task import DeployTask from motrix_env_core.input import PlanarVelocityCommand @@ -45,7 +49,6 @@ class Go2WalkTaskSpec(TaskSpec): gait_frequency_hz: PositiveFloat standing_threshold: NonNegativeFloat termination_min_up_z: Annotated[FiniteFloat, Field(ge=-1, le=1)] - termination_min_base_height: FiniteFloat | None @model_validator(mode="after") def validate_joint_vectors_and_ranges(self) -> "Go2WalkTaskSpec": @@ -60,16 +63,12 @@ def validate_joint_vectors_and_ranges(self) -> "Go2WalkTaskSpec": return self -class Go2WalkDeployTaskV1(DeployTask[PlanarVelocityCommand]): +class Go2WalkPolicyProcessor(PolicyProcessor[PlanarVelocityCommand]): """Go2 walking policy I/O and artifact-owned fall termination. Orientation termination is supported by both simulated and real IMU state. - Optional world-frame base-height termination requires base_position when - enabled; no height is invented when the backend cannot provide it. """ - spec_type = Go2WalkTaskSpec - def __init__(self, spec: Go2WalkTaskSpec, robot: RobotSpec) -> None: if len(spec.action_scale) != robot.joint_count: raise ValidationError( @@ -89,7 +88,6 @@ def __init__(self, spec: Go2WalkTaskSpec, robot: RobotSpec) -> None: self._gait_frequency_hz = spec.gait_frequency_hz self._standing_threshold = spec.standing_threshold self._termination_min_up_z = spec.termination_min_up_z - self._termination_min_base_height = spec.termination_min_base_height self._previous_action: FloatArray = np.zeros(self.robot.joint_count, dtype=np.float32) @property @@ -105,19 +103,14 @@ def check_termination(self, state: RobotState) -> str | None: up_z = 1.0 - 2.0 * (x * x + y * y) if up_z <= self._termination_min_up_z: return "fall_orientation" - if self._termination_min_base_height is not None: - if state.base_position is None: - raise ValidationError("state.base_position", "available for enabled base-height termination", "missing") - if state.base_position[2] <= self._termination_min_base_height: - return "fall_height" return None - def reset(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> None: + def reset(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> None: """Reset action history; callers provide validated state and command.""" self._previous_action.fill(0) - def build_observation(self, state: RobotState, context: PolicyContext[PlanarVelocityCommand]) -> FloatArray: - """Consume state and command validated by ControlSession or the caller.""" + def build_observation(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> FloatArray: + """Consume runtime-validated state and PolicyController-validated input commands.""" velocity = context.command.values[0, :] phase = np.zeros(4, dtype=np.float32) if context.step > 0 and np.linalg.norm(velocity) >= self._standing_threshold: @@ -153,7 +146,7 @@ def process_action(self, action: FloatArray) -> JointServoCommand: kd=self._kd, ) - def validate_command(self, command: PlanarVelocityCommand) -> None: + def validate_command(self, command: PlanarVelocityCommand | None) -> None: if not isinstance(command, PlanarVelocityCommand): raise ValidationError("command.type", "PlanarVelocityCommand", type(command).__name__) if command.batch_size != 1: @@ -178,3 +171,37 @@ def _projected_gravity(orientation_xyzw: FloatArray) -> FloatArray: dtype=np.float32, ) return rotation @ np.array([0.0, 0.0, -1.0], dtype=np.float32) + + +class Go2WalkDeployTask(DeployTask[PlanarVelocityCommand]): + """Complete Go2 walking task; its single policy phase handles normal stopping.""" + + spec_type = Go2WalkTaskSpec + + def __init__( + self, spec: Go2WalkTaskSpec, robot: RobotSpec, policy: Policy, steps: int | None = None, artifact=None + ): + self.spec = spec + self.robot = robot + self.policy_io = Go2WalkPolicyProcessor(spec, robot) + self.policy_controller = PolicyController(self.policy_io, policy, steps=steps) + + @property + def command_lower(self) -> FloatArray: + return self.policy_io.command_lower + + @property + def command_upper(self) -> FloatArray: + return self.policy_io.command_upper + + def validate_command(self, command: PlanarVelocityCommand | None) -> None: + self.policy_io.validate_command(command) + + def reset(self, state: RobotState) -> None: + self.policy_controller.reset(state) + + def step(self, state: RobotState, context: ControlContext[PlanarVelocityCommand]) -> ControllerStep: + return self.policy_controller.step(state, context) + + def request_stop(self) -> None: + self.policy_controller.request_stop() diff --git a/motrix_deploy_tasks/tests/test_cli.py b/motrix_deploy_tasks/tests/test_cli.py index d959bc8a..fbb5b20b 100644 --- a/motrix_deploy_tasks/tests/test_cli.py +++ b/motrix_deploy_tasks/tests/test_cli.py @@ -26,6 +26,7 @@ sha256_bytes, write_artifact, ) +from motrix_deploy.artifact.schema import PayloadSpec from motrix_deploy.contracts import RobotSpec, TensorSpec from motrix_deploy.env import assemble_deploy_scene, create_deploy_env from motrix_deploy_tasks.tasks.go2_walk import Go2WalkTaskSpec @@ -200,6 +201,7 @@ def test_installed_go2_task_can_be_created_without_preimport(tmp_path: Path) -> "from motrix_deploy.artifact import TaskSpec; " "from motrix_deploy.contracts import RobotSpec; " "from motrix_deploy.task import create_task; " + "from motrix_deploy.policy import NoOpPolicy; " "specs = json.load(open(sys.argv[1])); " "specs['robot']['joint_names'] = tuple(specs['robot']['joint_names']); " "specs['robot'].update({key: np.asarray(value, dtype=np.float32) " @@ -208,9 +210,9 @@ def test_installed_go2_task_can_be_created_without_preimport(tmp_path: Path) -> "assert type(spec).__name__ == 'Go2WalkTaskSpec'; " "assert type(spec).__module__ == 'motrix_deploy_tasks.tasks.go2_walk'; " "assert not any(name in sys.modules for name in ('motrix_envs', 'motrixsim', 'mujoco', 'torch')); " - "task = create_task(spec, RobotSpec(**specs['robot'])); " + "task = create_task(spec, RobotSpec(**specs['robot']), NoOpPolicy(12)); " "assert type(task).__module__ == 'motrix_deploy_tasks.tasks.go2_walk'; " - "assert type(task).__name__ == 'Go2WalkDeployTaskV1'" + "assert type(task).__name__ == 'Go2WalkDeployTask'" ) result = subprocess.run( @@ -329,6 +331,64 @@ def test_headless_simulation_cli_runs_deterministic_onnx_fixture(tmp_path: Path, assert "duration_s" in invalid_bound.stderr +@pytest.mark.parametrize("backend,solver_iterations", [("mujoco", 100), ("motrixsim", 3)]) +def test_standard_cli_completes_four_phase_flow(tmp_path, backend, solver_iterations): + """Standing preparation, frozen-reference hold, then the requested playback budget.""" + pytest.importorskip(backend) + pytest.importorskip("onnxruntime") + from motrix_envs.deploy.g1_wbt import build_g1_wbt_profile + + profile = build_g1_wbt_profile("g1-wbt-dance") + graph = helper.make_graph( + [helper.make_node("MatMul", ["obs", "weight"], ["actions"])], + "zero_wbt_policy", + [helper.make_tensor_value_info("obs", TensorProto.FLOAT, [1, 154])], + [helper.make_tensor_value_info("actions", TensorProto.FLOAT, [1, 29])], + [numpy_helper.from_array(np.zeros((154, 29), dtype=np.float32), name="weight")], + ) + model = helper.make_model(graph, opset_imports=[helper.make_opsetid("", 17)]) + model.ir_version = 10 + payload = model.SerializeToString() + manifest = DeploymentManifest( + schema_version="motrix-deploy/v1", + source=SourceSpec("test", "wbt-smoke", "fixture"), + policy=PolicySpec( + "onnx/v1", + "policy/model.onnx", + sha256_bytes(payload), + TensorSpec("obs", (1, 154)), + TensorSpec("actions", (1, 29)), + ), + robot=profile.robot, + task=profile.task, + control=profile.control, + payloads=tuple(PayloadSpec(path, sha256_bytes(data)) for path, data in sorted(profile.payloads.items())), + ) + artifact = tmp_path / "wbt.deploy" + write_artifact(artifact, manifest, {"policy/model.onnx": payload, **profile.payloads}) + command = [ + sys.executable, + "-c", + "from motrix_deploy.cli import main; main()", + "task=g1-wbt-dance/sim", + f"artifact={artifact}", + "runtime.viewer=false", + f"runtime.backend={backend}", + f"runtime.physics.solver_iterations={solver_iterations}", + # The default zero hold plus the task's mandatory held-reference interval + # make the takeover-to-playback distance deterministic. + "duration_s=0.04", + ] + result = subprocess.run(command, check=False, capture_output=True, text=True) + assert result.returncode == 0, result.stderr + result.stdout + report = _rollout_result(result.stdout) + assert report["success"] + assert report["exit_reason"] == "completed" + # One mandatory hold interval plus the two-tick playback budget. + assert report["completed_steps"] == 3 + assert report["policy_simulation_time_s"] == pytest.approx(3 * profile.control.period_s) + + def _robot_spec() -> RobotSpec: return RobotSpec( base_link_name="base", @@ -366,7 +426,6 @@ def _task_spec() -> Go2WalkTaskSpec: gait_frequency_hz=2.0, standing_threshold=0.05, termination_min_up_z=0.25, - termination_min_base_height=None, kp=[35.0] * 12, kd=[0.5] * 12, action_lower=[-1.0] * 12, diff --git a/motrix_deploy_tasks/tests/test_g1_wbt.py b/motrix_deploy_tasks/tests/test_g1_wbt.py new file mode 100644 index 00000000..010c3241 --- /dev/null +++ b/motrix_deploy_tasks/tests/test_g1_wbt.py @@ -0,0 +1,140 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Focused, simulator-free tests of the current G1 WBT actor contract.""" + +import numpy as np +import pytest + +from motrix_deploy.contracts import RobotSpec, RobotState +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy_tasks.tasks.g1_wbt import G1WbtMotion, G1WbtPolicyProcessor, G1WbtTaskSpec + + +def _state(default): + return RobotState( + 0, + 0, + default, + np.zeros(29, np.float32), + np.array([0, 0, 0, 1], np.float32), + np.array([1, 2, 3], np.float32), + np.zeros(3, np.float32), + ) + + +def _motion(joint_pos=None, joint_vel=None, reference=None): + return G1WbtMotion( + joint_pos if joint_pos is not None else np.arange(58, dtype=np.float32).reshape(2, 29), + joint_vel if joint_vel is not None else np.arange(58, dtype=np.float32).reshape(2, 29) + 100, + np.asarray(reference if reference is not None else [[0, 0, 0, 1], [0, 0, 1, 0]], np.float32), + ) + + +def _spec(scale): + return G1WbtTaskSpec( + action_scale=[scale] * 29 if np.isscalar(scale) else scale.tolist(), + kp=[10] * 29, + kd=[1] * 29, + motion_frames=2, + termination_ref_orientation_threshold=0.4, + termination_joint_position_threshold=0.5, + termination_joint_velocity_threshold=10, + ) + + +def _io(scale=0.25, spec=None, motion=None): + default = np.linspace(-0.4, 0.7, 29, dtype=np.float32) + robot = RobotSpec( + "pelvis", + tuple(["waist_yaw_joint", "waist_roll_joint", "waist_pitch_joint", *[f"joint_{i}" for i in range(26)]]), + default, + np.full(29, -1000, np.float32), # Servo limits far away: these tests assert unclamped math. + np.full(29, 1000, np.float32), + np.full(29, 10, np.float32), + ) + motion = motion if motion is not None else _motion() + return G1WbtPolicyProcessor(spec if spec is not None else _spec(scale), robot, motion), default + + +def _observation(io, default, frame=0, previous_action=None): + return io.actor_observation( + frame, + np.array([0, 0, 0, 1]), + np.array([1, -2, 3]), + default, + np.zeros(29), + previous_action, + ) + + +def test_observation_order_frame_selection_and_unscaled_terms(): + spec = _spec(0.25) + io, default = _io(spec=spec) + motion = io.motion + positions = default + np.arange(29, dtype=np.float32) / 10 + velocities = np.linspace(-20, 30, 29) + previous = np.linspace(-5, 4, 29) + angular_velocity = np.array([7, -8, 9]) + observation = io.actor_observation(1, np.array([0, 0, 0, 1]), angular_velocity, positions, velocities, previous) + # 154 and these boundaries are the deployed actor contract, not tuning. + assert observation.shape == (154,) + assert observation.dtype == np.float32 + np.testing.assert_array_equal(observation[:29], motion.joint_pos[1]) + np.testing.assert_array_equal(observation[29:58], motion.joint_vel[1]) + # Frame-1 reference [0,0,1,0] is a 180° Z rotation: relative = diag(-1,-1,1). + np.testing.assert_array_equal(observation[58:64], [-1, 0, 0, 0, -1, 0]) + np.testing.assert_array_equal(observation[64:67], angular_velocity) + np.testing.assert_allclose(observation[67:96], positions - default) + np.testing.assert_allclose(observation[96:125], velocities) + np.testing.assert_allclose(observation[125:], previous) + np.testing.assert_array_equal(io.previous_action, np.zeros(29)) + + +def test_noncommuting_relative_orientation_first_two_rows_xyzw(): + torso_angle, reference_angle = 0.7, -1.1 + reference = [0, np.sin(reference_angle / 2), 0, np.cos(reference_angle / 2)] + io, default = _io(spec=_spec(0.25), motion=_motion(reference=[[0, 0, 0, 1], reference])) + torso = np.array([np.sin(torso_angle / 2), 0, 0, np.cos(torso_angle / 2)]) + ct, st = np.cos(torso_angle), np.sin(torso_angle) + cr, sr = np.cos(reference_angle), np.sin(reference_angle) + torso_matrix = np.array([[1, 0, 0], [0, ct, -st], [0, st, ct]]) + reference_matrix = np.array([[cr, 0, sr], [0, 1, 0], [-sr, 0, cr]]) + relative = torso_matrix.T @ reference_matrix + actual = io.actor_observation(1, torso, np.zeros(3), default, np.zeros(29))[58:64] + np.testing.assert_allclose(actual, relative[:2].reshape(-1), atol=1e-7) + assert not np.allclose(actual, relative[:, :2].reshape(-1)) + assert not np.allclose(actual, (reference_matrix @ torso_matrix.T)[:2].reshape(-1)) + assert not np.allclose(actual, relative.T[:2].reshape(-1)) + # Quaternion sign and small normalization differences do not change rotation. + negated = io.actor_observation(1, -torso * 1.0001, np.zeros(3), default, np.zeros(29))[58:64] + np.testing.assert_allclose(negated, actual, atol=1e-7) + + +@pytest.mark.parametrize("scale", [0.31, np.linspace(0, 0.8, 29, dtype=np.float32)]) +def test_action_offset_scale_raw_history_without_clipping_and_reset(scale): + io, default = _io(scale) + np.testing.assert_array_equal(_observation(io, default)[125:], np.zeros(29)) + raw = np.linspace(-9, 8, 29, dtype=np.float32) + expected_raw = raw.copy() + target = io.process_action(raw).joint_position + assert target.dtype == np.float32 + np.testing.assert_allclose(target, default + scale * expected_raw) + # History is raw, not scaled target, not clamped action, and not caller-owned. + raw.fill(99) + target.fill(99) + np.testing.assert_array_equal(io.previous_action, expected_raw) + np.testing.assert_array_equal(_observation(io, default)[125:], expected_raw) + io.previous_action.fill(99) + np.testing.assert_array_equal(io.previous_action, expected_raw) + override = np.full(29, -3, dtype=np.float32) + np.testing.assert_array_equal(_observation(io, default, previous_action=override)[125:], override) + np.testing.assert_array_equal(io.previous_action, expected_raw) + next_raw = np.full(29, 2, dtype=np.float32) + io.process_action(next_raw) + np.testing.assert_array_equal(_observation(io, default)[125:], next_raw) + io.reset( + _state(default), + ControlContext(0, 0.0, None, dt_s=0.02), + ) + np.testing.assert_array_equal(_observation(io, default)[125:], np.zeros(29)) diff --git a/motrix_deploy_tasks/tests/test_g1_wbt_measured_fk.py b/motrix_deploy_tasks/tests/test_g1_wbt_measured_fk.py new file mode 100644 index 00000000..3e9cbb80 --- /dev/null +++ b/motrix_deploy_tasks/tests/test_g1_wbt_measured_fk.py @@ -0,0 +1,191 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Measured pelvis IMU + named waist FK matches independent simulator truth.""" + +from dataclasses import replace + +import numpy as np +import pytest +from motrix_robots.unitree import UnitreeG129Dof + +from motrix_deploy.contracts import RobotState +from motrix_deploy.runtime.config import ( + SensorBindings, + SimulationRuntimeConfig, +) +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy.runtime.factory import create_simulation_runtime +from motrix_deploy_tasks.tasks.g1_wbt import G1WbtMotion, G1WbtPolicyProcessor +from motrix_env_core.config import configclass +from motrix_env_core.config.scene import FlatTerrainCfg, SceneCfg, SceneObjsCfg +from motrix_env_core.config.sim import SimCfg +from motrix_envs.deploy.g1_wbt import build_g1_wbt_profile + + +@configclass +class _FlatG1Objs(SceneObjsCfg): + floor: FlatTerrainCfg = FlatTerrainCfg() + + +@pytest.fixture(scope="module") +def profile(): + return build_g1_wbt_profile("g1-wbt-dance") + + +def _profile_motion(profile): + """Reload the compiled motion clip from the profile's NPZ payload.""" + import io + + payload = next(iter(profile.payloads.values())) + with np.load(io.BytesIO(payload), allow_pickle=False) as arrays: + return G1WbtMotion(arrays["joint_pos"], arrays["joint_vel"], arrays["reference_quaternion_xyzw"]) + + +def _random_quaternion(rng): + quaternion = rng.normal(size=4) + return (quaternion / np.linalg.norm(quaternion)).astype(np.float32) + + +def _rotation(quaternion): + """Independent Rodrigues construction, insensitive to quaternion sign.""" + vector = np.asarray(quaternion[:3], dtype=np.float64) + scalar = float(quaternion[3]) + x, y, z = vector + skew = np.array([[0, -z, y], [z, 0, -x], [-y, x, 0]]) + norm_squared = np.dot(vector, vector) + scalar**2 + return np.eye(3) + (2 / norm_squared) * (scalar * skew + skew @ skew) + + +def _waist_rotation(yaw, roll, pitch): + cy, sy = np.cos(yaw), np.sin(yaw) + cr, sr = np.cos(roll), np.sin(roll) + cp, sp = np.cos(pitch), np.sin(pitch) + rz = np.array([[cy, -sy, 0], [sy, cy, 0], [0, 0, 1]]) + rx = np.array([[1, 0, 0], [0, cr, -sr], [0, sr, cr]]) + ry = np.array([[cp, 0, sp], [0, 1, 0], [-sp, 0, cp]]) + return rz @ rx @ ry + + +def _state(robot, quaternion, waist): + joints = robot.default_joint_position.copy() + for axis, angle in zip(("yaw", "roll", "pitch"), waist): + joints[robot.joint_names.index(f"waist_{axis}_joint")] = angle + return RobotState( + sample_time_ns=0, + receive_time_ns=0, + joint_position=joints, + joint_velocity=np.zeros(robot.joint_count, np.float32), + base_orientation_xyzw=quaternion, + base_angular_velocity=np.zeros(3, np.float32), + base_linear_acceleration=np.zeros(3, np.float32), + ) + + +@pytest.mark.parametrize("permuted", [False, True]) +@pytest.mark.parametrize( + "waist", + [(0, 0, 0), (0.7, 0, 0), (0, -0.3, 0), (0, 0, 0.4), (0.7, -0.3, 0.4), (-0.8, 0.2, -0.3)], +) +def test_measured_fk_axis_order_base_rotation_and_named_joint_mapping(profile, permuted, waist): + robot = profile.robot + if permuted: + order = np.random.default_rng(13).permutation(robot.joint_count) + robot = replace( + robot, + joint_names=tuple(robot.joint_names[index] for index in order), + default_joint_position=robot.default_joint_position[order], + position_lower=robot.position_lower[order], + position_upper=robot.position_upper[order], + torque_limit=robot.torque_limit[order], + ) + task = G1WbtPolicyProcessor(profile.task, robot, _profile_motion(profile)) + base = _random_quaternion(np.random.default_rng(19)) + state = _state(robot, base, waist) + expected = _rotation(base) @ _waist_rotation(*waist) + np.testing.assert_allclose(_rotation(task.torso_orientation(state)), expected, atol=1e-6, rtol=0) + state.base_orientation_xyzw = -base + np.testing.assert_allclose(_rotation(task.torso_orientation(state)), expected, atol=1e-6, rtol=0) + + +def test_actor_orientation_uses_measured_state(profile): + task = G1WbtPolicyProcessor(profile.task, profile.robot, motion := _profile_motion(profile)) + state = _state(profile.robot, _random_quaternion(np.random.default_rng(37)), (0.8, -0.25, 0.3)) + context = ControlContext(0, 0.0, None, dt_s=0.02) + observation = task.build_observation(state, context) + expected = (_rotation(task.torso_orientation(state)).T @ _rotation(motion.reference_quaternion_xyzw[0]))[ + :2 + ].reshape(-1) + np.testing.assert_allclose(observation[58:64], expected, atol=1e-6, rtol=0) + + +def _set_fk_pose(runtime, backend, orientation, joints): + """Test-only pose injection through simulator APIs, not deployment contracts.""" + robot = runtime.scene.objs.robot + if backend == "mujoco": + model, data = runtime.model, runtime.data + root = model.body(robot.resolved_base_link_name).id + address = model.jnt_qposadr[model.body_jntadr[root]] + data.qpos[address : address + 3] = [0.2, -0.1, 2.0] + data.qpos[address + 3 : address + 7] = orientation[[3, 0, 1, 2]] + for name, position in zip(runtime.robot.spec.joint_names, joints): + data.qpos[model.jnt_qposadr[model.joint(robot.resolve_name(name)).id]] = position + runtime.mj.mj_forward(model, data) + else: + import motrixsim as mtx + + program = runtime.model.compile_write( + { + "position": mtx.write.BodyPosition((robot.resolved_base_link_name,)), + "orientation": mtx.write.BodyRotation((robot.resolved_base_link_name,)), + "joints": mtx.write.BodyJointPosition( + tuple(robot.resolve_name(name) for name in runtime.robot.spec.joint_names) + ), + }, + forward_kinematic=True, + ).allocate(runtime.data) + program["position"][:] = [0.2, -0.1, 2.0] + program["orientation"][:] = orientation + program["joints"][:] = joints + program.execute(runtime.data) + + +@pytest.mark.parametrize("backend,solver_iterations", [("mujoco", 100), ("motrixsim", 3)]) +def test_measured_fk_matches_randomized_simulator_world_orientation(profile, backend, solver_iterations): + pytest.importorskip(backend) + config = SimulationRuntimeConfig( + scene=SceneCfg(objs=_FlatG1Objs(robot=UnitreeG129Dof())), + physics=SimCfg(dt=0.005, solver_iterations=solver_iterations), + sensor_bindings=SensorBindings(base_angular_velocity="base_gyro", base_linear_acceleration="base_accel"), + ) + runtime = create_simulation_runtime(backend, config) + task = G1WbtPolicyProcessor(profile.task, profile.robot, motion := _profile_motion(profile)) + rng = np.random.default_rng(2026) + try: + profile.robot.validate_compatible(runtime.robot.spec) + runtime.open() + for case in range(64): + joints = rng.uniform(profile.robot.position_lower, profile.robot.position_upper).astype(np.float32) + # All three waist angles are independently sampled, not yaw-only probes. + _set_fk_pose(runtime, backend, _random_quaternion(rng), joints) + state = runtime.robot.read_state(0.1) + np.testing.assert_allclose(state.joint_position, joints, atol=1e-6, rtol=0) + # Direct simulator query is a test oracle, not public deployment state. + name = runtime.scene.objs.robot.resolve_name("torso_link") + if backend == "mujoco": + truth = runtime.data.xmat[runtime.model.body(name).id].reshape(3, 3).copy() + else: + import motrixsim as mtx + + query = runtime.model.compile_query({"truth": mtx.query.LinkRotation((name,))}).allocate(runtime.data) + query.execute(runtime.data) + truth = _rotation(query["truth"].reshape(4)) + np.testing.assert_allclose( + _rotation(task.torso_orientation(state)), truth, atol=1e-5, rtol=0, err_msg=f"{backend} case {case}" + ) + # Neither orientation nor position body queries are needed by actor I/O. + observation = task.build_observation(state, ControlContext(0, 0.0, None, dt_s=0.02)) + expected = (truth.T @ _rotation(motion.reference_quaternion_xyzw[0]))[:2].reshape(-1) + np.testing.assert_allclose(observation[58:64], expected, atol=1e-5, rtol=0) + finally: + runtime.close() diff --git a/motrix_deploy_tasks/tests/test_g1_wbt_task.py b/motrix_deploy_tasks/tests/test_g1_wbt_task.py new file mode 100644 index 00000000..bc1ff094 --- /dev/null +++ b/motrix_deploy_tasks/tests/test_g1_wbt_task.py @@ -0,0 +1,505 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Standard WBT deploy lifecycle and self-contained motion contracts.""" + +import numpy as np +import pytest +from pydantic import ValidationError as PydanticValidationError + +from motrix_deploy.contracts import RobotSpec, RobotState +from motrix_deploy.errors import ValidationError +from motrix_deploy.policy import NoOpPolicy +from motrix_deploy.runtime.context import ControlContext +from motrix_deploy_tasks.tasks.g1_wbt import G1WbtDeployTask, G1WbtMotion, G1WbtPolicyProcessor, G1WbtTaskSpec + + +def _motion(reference_quaternions=None): + return G1WbtMotion( + np.asarray([[0.0] * 29, [0.1] * 29], np.float32), + np.asarray([[0.0] * 29, [0.2] * 29], np.float32), + np.asarray(reference_quaternions or [[0, 0, 0, 1]] * 2, np.float32), + ) + + +def _task( + reference_quaternions=None, + *, + controller=False, + steps=None, + automatic=False, + preparation=None, +): + motion = _motion(reference_quaternions) + spec = G1WbtTaskSpec( + action_scale=[0.5] * 29, + kp=[10] * 29, + kd=[1] * 29, + motion_frames=len(motion), + termination_ref_orientation_threshold=0.4, + termination_joint_position_threshold=0.5, + termination_joint_velocity_threshold=10, + **(preparation or {}), + ) + robot = RobotSpec( + "pelvis", + tuple(["waist_yaw_joint", "waist_roll_joint", "waist_pitch_joint", *[f"joint_{i}" for i in range(26)]]), + np.zeros(29, np.float32), + np.full(29, -1, np.float32), + np.ones(29, np.float32), + np.full(29, 10, np.float32), + ) + return ( + G1WbtDeployTask(spec, robot, NoOpPolicy(29), steps=steps, automatic_start=automatic, motion=motion) + if controller + else G1WbtPolicyProcessor(spec, robot, motion) + ) + + +def _state(): + return RobotState( + 0, + 0, + np.zeros(29, np.float32), + np.zeros(29, np.float32), + np.array([0, 0, 0, 1], np.float32), + np.array([1, 2, 3], np.float32), + np.zeros(3, np.float32), + ) + + +# Ramp- and settle-free preparation for lifecycle tests that exercise handover timing. +_instant = {"preparation_ramp_duration_s": 0.0, "preparation_settle_duration_s": 0.0} + + +def test_standard_task_raw_history_servo_limits_frame_and_reset(): + task = _task() + state = _state() + context = ControlContext(1, 0.02, None, dt_s=0.02) + task.validate_command(None) + raw = np.full(29, 9, np.float32) + command = task.process_action(raw) + raw.fill(0) + np.testing.assert_array_equal(command.joint_position, task.robot.position_upper) + np.testing.assert_array_equal(command.kp, task.spec.kp) + observation = task.build_observation(state, context) + assert observation.shape == (154,) + np.testing.assert_allclose(observation[:29], task.motion.joint_pos[1]) + np.testing.assert_array_equal(observation[64:67], state.base_angular_velocity) + np.testing.assert_array_equal(observation[125:], 9) + assert task.check_termination(state) is None + task.reset(state, context) + np.testing.assert_array_equal(task.build_observation(state, context)[125:], 0) + assert G1WbtDeployTask.default_duration_s(task.spec) == 2 * task.spec.period_s + with pytest.raises(ValidationError, match="context.step"): + task.build_observation(state, ControlContext(2, 0.04, None, dt_s=0.02)) + + +def test_orientation_termination_uses_latest_observed_reference_frame(): + task = _task(reference_quaternions=[[0, 0, 0, 1], [1, 0, 0, 0]]) + state = _state() + task.build_observation(state, ControlContext(0, 0, None, dt_s=0.02)) + assert task.check_termination(state) is None + task.build_observation(state, ControlContext(1, 0.02, None, dt_s=0.02)) + assert task.check_termination(state) == "bad_ref_ori" + + +def test_measured_base_and_waist_orientation_and_joint_safety_termination(): + task = _task() + state = _state() + state.base_orientation_xyzw[:] = [1, 0, 0, 0] + assert task.check_termination(state) == "bad_ref_ori" + # Torso FK sees waist pitch, not only the pelvis quaternion. + state.base_orientation_xyzw[:] = [0, 0, 0, 1] + state.joint_position[2] = 1 + assert task.check_termination(state) == "bad_ref_ori" + state.joint_position.fill(0) + state.joint_position[0] = task.robot.position_upper[0] + 1 + assert task.check_termination(state) == "bad_dof_pos" + state.joint_position.fill(0) + state.joint_velocity[0] = task.spec.termination_joint_velocity_threshold + 1 + assert task.check_termination(state) == "bad_dof_vel" + + +def test_spec_roundtrip_and_motion_shape_validation(): + task = _task() + restored = G1WbtTaskSpec.model_validate_json(task.spec.model_dump_json()) + assert restored == task.spec + with pytest.raises(ValidationError, match="motion.joint_vel"): + G1WbtMotion(task.motion.joint_pos, task.motion.joint_vel[:1], task.motion.reference_quaternion_xyzw) + state = _state() + # Both actor input and safety checks use the same hardware-observable state. + assert task.build_observation(state, ControlContext(0, 0, None, dt_s=0.02)).shape == (154,) + assert task.check_termination(state) is None + + +def test_motion_validates_frame_counts_and_unit_quaternions(): + motion = _motion() + with pytest.raises(ValidationError, match="motion.joint_vel"): + G1WbtMotion(motion.joint_pos, motion.joint_vel[:1], motion.reference_quaternion_xyzw) + with pytest.raises(ValidationError, match="motion.reference_quaternion_xyzw"): + G1WbtMotion(motion.joint_pos, motion.joint_vel, motion.reference_quaternion_xyzw[:1]) + tilted = motion.reference_quaternion_xyzw.copy() + tilted[0] = [0, 0, 0, 2] + with pytest.raises(ValidationError, match="unit xyzw quaternions"): + G1WbtMotion(motion.joint_pos, motion.joint_vel, tilted) + + +def test_preparation_commands_joint_posture_not_root_state_or_motion_velocity(): + task = _task(controller=True, preparation={"preparation_ramp_duration_s": 0.0}) + state = _state() + ready = task.ready + ready.reset(state) + transition = ready.step(state, ControlContext(0, 0, None, dt_s=0.02)) + command = transition.command + np.testing.assert_array_equal(command.joint_position, task.motion.joint_pos[0]) + np.testing.assert_array_equal(command.kp, task.spec.kp) + np.testing.assert_array_equal(command.kd, task.spec.kd) + np.testing.assert_array_equal(command.joint_velocity, 0) + np.testing.assert_array_equal(command.feedforward_torque, 0) + assert command.joint_position.dtype == np.float32 + + +def test_preparation_ramps_from_first_step_measurement_then_requires_continuous_readiness(): + task = _task( + controller=True, + preparation={ + "preparation_ramp_duration_s": 0.4, + "preparation_settle_duration_s": 0.2, + "preparation_timeout_s": 2.0, + }, + ) + state = _state() + state.joint_position.fill(0.8) + controller = task.ready + state.joint_position.fill(0.6) + controller.reset(state) + first = controller.step(state, ControlContext(0, 0, None, dt_s=0.1)) + np.testing.assert_allclose(first.command.joint_position, 0.45) + np.testing.assert_array_equal(first.command.kp, task.spec.kp) + np.testing.assert_array_equal(first.command.kd, task.spec.kd) + state.joint_position.fill(0) + assert not controller.step( + state, ControlContext(0, 0.3, None, dt_s=0.02) + ).complete # Ready joints do not bypass the ramp. + assert not controller.step(state, ControlContext(0, 0.4, None, dt_s=0.02)).complete + state.joint_velocity.fill(2) + assert not controller.step(state, ControlContext(0, 0.5, None, dt_s=0.02)).complete + state.joint_velocity.fill(0) + assert not controller.step(state, ControlContext(0, 0.6, None, dt_s=0.02)).complete + assert not controller.step(state, ControlContext(0, 0.7, None, dt_s=0.02)).complete + ready = controller.step(state, ControlContext(0, 0.8, None, dt_s=0.02)) + assert ready.complete + assert ready.command is None + assert ready.error is None + + +def test_preparation_targets_standing_pose_and_clips_to_physical_joint_limits(): + base = _task(controller=True, preparation=_instant) + motion = G1WbtMotion( # Motion frame 0 must not drive preparation. + np.full((2, 29), 2.0, np.float32), + np.zeros((2, 29), np.float32), + np.tile([0, 0, 0, 1], (2, 1)).astype(np.float32), + ) + task = G1WbtDeployTask(base.spec, base.robot, NoOpPolicy(29), automatic_start=False, motion=motion) + state = _state() + controller = task.ready + controller.reset(state) + standing = controller.step(state, ControlContext(0, 0, None, dt_s=0.02)) + assert standing.complete # Standing readiness ignores the motion frame. + assert standing.command is None # Completion carries no command; the task holds. + hold = controller.hold_command() + np.testing.assert_array_equal(hold.joint_position, task.robot.default_joint_position) + np.testing.assert_array_equal(hold.kp, task.spec.kp) + np.testing.assert_array_equal(hold.kd, task.spec.kd) + np.testing.assert_array_equal(hold.joint_velocity, 0) + np.testing.assert_array_equal(hold.feedforward_torque, 0) + clipped = G1WbtDeployTask( + task.spec.model_copy(update={"preparation_joint_position": [2] * 29}), + task.robot, + NoOpPolicy(29), + motion=motion, + ) + np.testing.assert_array_equal(clipped.ready.hold_command().joint_position, task.robot.position_upper) + + +def test_preparation_rejects_unsafe_tilt_and_times_out_without_readiness(): + task = _task(controller=True) + state = _state() + controller = task.ready + controller.reset(state) + state.base_orientation_xyzw[:] = [1, 0, 0, 0] + unsafe = controller.step(state, ControlContext(0, 0, None, dt_s=0.02)) + assert "unsafe base tilt" in unsafe.error + assert unsafe.command is None + state.base_orientation_xyzw[:] = [0, 0, 0, 1] + state.joint_velocity.fill(2) + timeout = controller.step(state, ControlContext(0, 5, None, dt_s=0.02)) + assert "timed out" in timeout.error + assert not timeout.complete + assert timeout.command is None + + +@pytest.mark.parametrize( + "field,value", + [ + ("preparation_timeout_s", 0), + ("preparation_ramp_duration_s", -1), + ("preparation_settle_duration_s", -0.5), + ("preparation_timeout_s", float("nan")), + ], +) +def test_spec_validates_preparation_timing(field, value): + data = _task().spec.model_dump() + data[field] = value + with pytest.raises(PydanticValidationError, match=field): + G1WbtTaskSpec.model_validate(data) + + +def test_normal_motion_stopping_is_finite_measured_damping_without_position_hold(): + task = _task(controller=True) + state = _state() + controller = task.damping + state.joint_position.fill(0.4) + state.joint_velocity.fill(0.7) + state.base_orientation_xyzw[:] = [1, 0, 0, 0] # Damping does not demand a ready posture. + command = controller.step(state, ControlContext(0, 0, None, dt_s=0.02)).command + np.testing.assert_array_equal(command.joint_position, state.joint_position) + np.testing.assert_array_equal(command.kp, 0) + np.testing.assert_array_equal(command.kd, task.spec.kd) + np.testing.assert_array_equal(command.joint_velocity, 0) + np.testing.assert_array_equal(command.feedforward_torque, 0) + state.joint_position.fill(0.2) + np.testing.assert_array_equal( + controller.step(state, ControlContext(0, 0.2, None, dt_s=0.02)).command.joint_position, state.joint_position + ) + state.joint_position[0] = task.robot.position_upper[0] + 0.1 + state.joint_position[1] = task.robot.position_lower[1] - 0.1 + clipped = controller.step(state, ControlContext(0, 0.25, None, dt_s=0.02)).command + assert clipped.joint_position[0] == task.robot.position_upper[0] + assert clipped.joint_position[1] == task.robot.position_lower[1] + torque = ( + clipped.kp * (clipped.joint_position - state.joint_position) + + clipped.kd * (clipped.joint_velocity - state.joint_velocity) + + clipped.feedforward_torque + ) + np.testing.assert_array_equal(torque, -clipped.kd * state.joint_velocity) + complete = controller.step(state, ControlContext(0, 0.3, None, dt_s=0.02)) + assert complete.complete + assert complete.command is None + assert complete.error is None + + +def test_composite_handover_hold_playback_clocks_and_finite_damping(): + task = _task( + controller=True, preparation={"preparation_ramp_duration_s": 0.0, "preparation_settle_duration_s": 0.02} + ) + controller = task + state = _state() + seen = [] + observations = [] + observe = controller.policy_io.build_observation + + def observation(measurement, context): + record = observe(measurement, context) + seen.append((measurement, context.step, context.elapsed_time_s)) + observations.append(record) + return record + + controller.policy_io.build_observation = observation + controller.reset(state) + assert controller.step(state, ControlContext(0, 3.0, None, dt_s=0.02)).command is not None + assert controller.policy_controller.completed_steps == 0 + controller.request_policy_start() + # Readiness completion and the first held model decision use the same sample and tick. + assert controller.step(state, ControlContext(1, 3.02, None, dt_s=0.02)).command is not None + assert controller.phase == "policy_hold" + assert seen == [(state, 0, 0.0)] + np.testing.assert_allclose(observations[0][:29], 0.0) # Hold freezes reference frame 0. + assert controller.transitions[0].complete + assert controller.transitions[0].name == "prepare" + controller.request_motion_start() + assert controller.step(state, ControlContext(2, 3.04, None, dt_s=0.02)).command is not None + assert controller.phase == "playback" + # Inference history is preserved: the model clock continues from the hold origin. + assert seen[-1][:2] == (state, 1) + assert seen[-1][2] == pytest.approx(0.02) + assert controller.playback_steps == 1 + assert controller.policy_controller.completed_steps == 2 + assert controller.step(state, ControlContext(3, 3.06, None, dt_s=0.02)).command is not None + np.testing.assert_allclose(observations[2][:29], 0.1) # Only playback advances the frame. + assert controller.playback_steps == 2 + assert controller.policy_controller.completed_steps == 3 + # Budget completion starts damping immediately, not an empty interval. + damping = controller.step(state, ControlContext(4, 3.08, None, dt_s=0.02)) + np.testing.assert_array_equal(damping.command.kp, 0) + assert controller.policy_controller.completed_steps == 3 + assert controller.playback_steps == 2 + assert controller.transitions[-1].name == "damping" + assert controller.transitions[-1].time_s == 0.02 + for step in range(5, 19): + assert not controller.step(state, ControlContext(step, 3.0 + step * 0.02, None, dt_s=0.02)).complete + assert controller.step(state, ControlContext(19, 3.38, None, dt_s=0.02)).complete + assert controller.transitions[-1].complete + + +def test_composite_stop_request_during_ready_hold_enters_damping(): + controller = _task(controller=True, steps=2, preparation=_instant) + state = _state() + controller.reset(state) + assert controller.step(state, ControlContext(0, 0.0, None, dt_s=0.02)).command is not None + assert controller.preparation_ready + assert controller.phase == "prepare" + controller.request_stop() + decision = controller.step(state, ControlContext(1, 0.02, None, dt_s=0.02)) + np.testing.assert_array_equal(decision.command.kp, 0) + assert controller.phase == "damping" + assert controller.policy_controller.completed_steps == 0 # Stopped before takeover. + assert not controller.transitions[0].complete + assert controller.transitions[-1].name == "damping" + + +def test_early_latched_requests_wait_for_measured_readiness_and_hold_once(): + controller = _task( + controller=True, + preparation={"preparation_ramp_duration_s": 0.1, "preparation_settle_duration_s": 0.1}, + ) + state = _state() + controller.reset(state) + controller.request_policy_start() + controller.request_motion_start() + for step in range(0, 10): + decision = controller.step(state, ControlContext(step, step * 0.02, None, dt_s=0.02)) + assert controller.phase == "prepare" # Latched intent cannot bypass ramp or settle. + assert decision.command is not None + assert controller.policy_controller.completed_steps == 0 + assert not controller.preparation_ready # Settled readiness is not yet complete. + # Settled readiness hands over on the same tick, but playback waits one hold interval. + controller.step(state, ControlContext(10, 0.2, None, dt_s=0.02)) + assert controller.phase == "policy_hold" + assert controller.policy_controller.completed_steps == 1 + assert controller.playback_steps == 0 + controller.step(state, ControlContext(11, 0.22, None, dt_s=0.02)) + assert controller.phase == "playback" + assert controller.playback_steps == 1 + + +def test_task_preparation_times_out_before_first_readiness(): + controller = _task(controller=True, steps=2, preparation=_instant) + state = _state() + state.joint_velocity.fill(2) # Continuous readiness is never reached. + controller.reset(state) + controller.request_policy_start() # Latched intent does not bypass the gate. + assert controller.step(state, ControlContext(0, 0.0, None, dt_s=0.02)).command is not None + failed = controller.step(state, ControlContext(250, 5.0, None, dt_s=0.02)) # Stage-local 5 s timeout. + assert "timed out" in failed.error + assert failed.command is None + assert controller.phase == "prepare" + assert controller.policy_controller.completed_steps == 0 + + +def test_composite_checks_last_model_interval_before_damping(): + from motrix_deploy.errors import ControlFailure + + task = _task(controller=True, preparation=_instant) + controller = G1WbtDeployTask( + task.spec, task.robot, NoOpPolicy(29), steps=1, automatic_start=False, motion=task.motion + ) + state = _state() + controller.reset(state) + controller.request_policy_start() + controller.request_motion_start() + assert controller.step(state, ControlContext(0, 0.0, None, dt_s=0.02)).command is not None + assert controller.phase == "policy_hold" # At least one hold interval first. + assert controller.step(state, ControlContext(1, 0.02, None, dt_s=0.02)).command is not None + assert controller.phase == "playback" + assert controller.playback_steps == 1 + state.base_orientation_xyzw[:] = [1, 0, 0, 0] + # Termination is checked on the measured state before budget completion can finish. + with pytest.raises(ControlFailure, match="bad_ref_ori"): + controller.step(state, ControlContext(2, 0.04, None, dt_s=0.02)) + assert len(controller.transitions) == 3 # Faults do not enter normal damping. + assert controller.transitions[-1].name == "playback" + + +class _FakeKeyboard: + """Deliver per-frame press edges exactly as an event-framed device reports them.""" + + def __init__(self): + self._pending = {} + self._active = {} + + def press(self, *keys) -> None: + self._pending = dict.fromkeys(keys, True) + + def poll(self) -> None: + self._active, self._pending = self._pending, {} + + def is_key_down(self, key: str) -> bool: + return self._active.get(key, False) + + +def test_attached_keyboard_press_edges_drive_phase_requests(): + task = _task(controller=True, steps=2, preparation=_instant) + keyboard = _FakeKeyboard() + task.attach_keyboard(keyboard) + state = _state() + task.reset(state) + assert task.step(state, ControlContext(0, 0.0, None, dt_s=0.02)).command is not None + assert task.preparation_ready and task.phase == "prepare" # Ready, waiting for input. + keyboard.press("p") + decision = task.step(state, ControlContext(1, 0.02, None, dt_s=0.02)) + assert decision.command is not None and task.phase == "policy_hold" + # Default zero hold target: the next held tick enters playback by itself. + task.step(state, ControlContext(2, 0.04, None, dt_s=0.02)) + assert task.phase == "playback" + + +def test_attached_keyboard_stop_request_enters_damping(): + task = _task(controller=True, preparation=_instant) + keyboard = _FakeKeyboard() + task.attach_keyboard(keyboard) + state = _state() + task.reset(state) + task.step(state, ControlContext(0, 0.0, None, dt_s=0.02)) + task.step(state, ControlContext(1, 0.02, None, dt_s=0.02)) + keyboard.press("o") + decision = task.step(state, ControlContext(2, 0.04, None, dt_s=0.02)) + np.testing.assert_array_equal(decision.command.kp, 0) + assert task.phase == "damping" + assert task.policy_controller.completed_steps == 0 + + +def test_automatic_start_gates_on_readiness_and_hold_ticks(): + task = _task(controller=True, steps=2, preparation=_instant) + task.enable_automatic_start(hold_ticks=2) + state = _state() + task.reset(state) + task.step(state, ControlContext(0, 0.0, None, dt_s=0.02)) + assert task.phase == "prepare" and task.preparation_ready + task.step(state, ControlContext(1, 0.02, None, dt_s=0.02)) + assert task.phase == "policy_hold" # Takeover happens on the tick after readiness. + task.step(state, ControlContext(2, 0.04, None, dt_s=0.02)) + assert task.phase == "policy_hold" # First held tick below the target. + task.step(state, ControlContext(3, 0.06, None, dt_s=0.02)) + assert task.phase == "playback" + + +def test_operator_input_rejects_invalid_configuration(): + task = _task(controller=True) + with pytest.raises(ValidationError, match="operator.keyboard"): + task.attach_keyboard(None) + + +def test_default_automatic_start_progresses_after_measured_readiness(): + task = _task(controller=True, steps=2, automatic=True, preparation=_instant) + state = _state() + task.reset(state) + assert task.step(state, ControlContext(0, 0.0, None, dt_s=0.02)).command is not None + assert task.preparation_ready and task.phase == "prepare" + # Takeover happens on the tick after readiness without any request call. + task.step(state, ControlContext(1, 0.02, None, dt_s=0.02)) + assert task.phase == "policy_hold" + # Default zero hold target: the next held tick enters playback by itself. + task.step(state, ControlContext(2, 0.04, None, dt_s=0.02)) + assert task.phase == "playback" diff --git a/motrix_deploy_tasks/tests/test_go2_walk.py b/motrix_deploy_tasks/tests/test_go2_walk.py index 809a4b3a..03da6574 100644 --- a/motrix_deploy_tasks/tests/test_go2_walk.py +++ b/motrix_deploy_tasks/tests/test_go2_walk.py @@ -11,9 +11,11 @@ from motrix_deploy.artifact.schema import TaskSpec from motrix_deploy.contracts import RobotSpec, RobotState -from motrix_deploy.errors import ValidationError -from motrix_deploy.runtime import PolicyContext -from motrix_deploy_tasks.tasks.go2_walk import Go2WalkDeployTaskV1, Go2WalkTaskSpec +from motrix_deploy.errors import ControlFailure, ValidationError +from motrix_deploy.policy import NoOpPolicy +from motrix_deploy.runtime import ControlContext +from motrix_deploy.runtime.control import PolicyController +from motrix_deploy_tasks.tasks.go2_walk import Go2WalkDeployTask, Go2WalkPolicyProcessor, Go2WalkTaskSpec from motrix_env_core.input import PlanarVelocityCommand @@ -21,11 +23,12 @@ def _replace_spec(spec: Go2WalkTaskSpec, **overrides: object) -> Go2WalkTaskSpec return type(spec).model_validate({**spec.model_dump(), **overrides}) -def _context(step: int, elapsed_time_s: float, velocity: list[float] | np.ndarray) -> PolicyContext: - return PolicyContext( +def _context(step: int, elapsed_time_s: float, velocity: list[float] | np.ndarray) -> ControlContext: + return ControlContext( step=step, elapsed_time_s=elapsed_time_s, command=PlanarVelocityCommand(np.asarray(velocity, dtype=np.float32)[None, :]), + dt_s=0.02, ) @@ -62,7 +65,6 @@ def _task_spec() -> Go2WalkTaskSpec: gait_frequency_hz=2.0, standing_threshold=0.05, termination_min_up_z=0.25, - termination_min_base_height=None, kp=[35.0] * 12, kd=[0.5] * 12, action_lower=[-1.0] * 12, @@ -70,6 +72,22 @@ def _task_spec() -> Go2WalkTaskSpec: ) +def test_go2_missing_command_is_rejected_before_policy_and_action(monkeypatch): + robot = _robot() + task = Go2WalkPolicyProcessor(_task_spec(), robot) + policy = NoOpPolicy(robot.joint_count) + controller = PolicyController(task, policy, steps=1) + calls = [] + monkeypatch.setattr(policy, "infer", lambda observation: calls.append("infer")) + monkeypatch.setattr(task, "process_action", lambda action: calls.append("action")) + state = _state(robot) + controller.reset(state) + with pytest.raises(ControlFailure) as failure: + controller.step(state, ControlContext(0, 0.0, None, dt_s=0.02)) + assert failure.value.reason == "input_error" + assert not calls + + @pytest.mark.parametrize("up_z", [-1.0, 0.0, 0.75, 1.0]) def test_fall_orientation_uses_artifact_threshold(up_z: float) -> None: robot = _robot() @@ -77,7 +95,7 @@ def test_fall_orientation_uses_artifact_threshold(up_z: float) -> None: angle = np.arccos(up_z) state.base_orientation_xyzw = np.array([np.sin(angle / 2), 0.0, 0.0, np.cos(angle / 2)], dtype=np.float32) spec = _task_spec() - task = Go2WalkDeployTaskV1(spec, robot) + task = Go2WalkPolicyProcessor(spec, robot) reason = task.check_termination(state) assert (reason == "fall_orientation") == (up_z <= spec.termination_min_up_z) @@ -85,29 +103,11 @@ def test_fall_orientation_uses_artifact_threshold(up_z: float) -> None: def test_fall_orientation_includes_threshold_boundary() -> None: spec = _task_spec() robot = _robot() - task = Go2WalkDeployTaskV1(_replace_spec(spec, termination_min_up_z=1.0), robot) + task = Go2WalkPolicyProcessor(_replace_spec(spec, termination_min_up_z=1.0), robot) assert task.check_termination(_state(robot)) == "fall_orientation" -def test_enabled_fall_height_requires_position_and_uses_artifact_threshold() -> None: - robot = _robot() - state = _state(robot) - spec = _task_spec() - threshold = 0.25 # Exactly representable synthetic cutoff, not a tuned task default. - task = Go2WalkDeployTaskV1(_replace_spec(spec, termination_min_base_height=threshold), robot) - assert Go2WalkDeployTaskV1(spec, robot).check_termination(state) is None - with pytest.raises(ValidationError, match="state.base_position.*enabled base-height termination"): - task.check_termination(state) - state.base_position = np.array([0.0, 0.0, threshold - 0.1], dtype=np.float32) - assert task.check_termination(state) == "fall_height" - assert Go2WalkDeployTaskV1(spec, robot).check_termination(state) is None - state.base_position[2] = threshold - assert task.check_termination(state) == "fall_height" - state.base_position[2] = threshold + 0.1 - assert task.check_termination(state) is None - - -@pytest.mark.parametrize("key", ["termination_min_up_z", "termination_min_base_height", "standing_threshold"]) +@pytest.mark.parametrize("key", ["termination_min_up_z", "standing_threshold"]) def test_missing_required_artifact_field_is_rejected_during_decoding(key: str) -> None: wire = _task_spec().to_dict() del wire["config"][key] @@ -125,7 +125,7 @@ def test_typed_task_spec_roundtrips_through_common_codec() -> None: @pytest.mark.parametrize( ("key", "value"), - [("termination_min_up_z", 2.0), ("termination_min_up_z", True), ("termination_min_base_height", float("nan"))], + [("termination_min_up_z", 2.0), ("termination_min_up_z", True)], ) def test_termination_config_is_validated(key: str, value: object) -> None: with pytest.raises(PydanticValidationError, match=key): @@ -194,7 +194,7 @@ def test_invalid_wire_types_are_rejected_by_common_codec(key: str, value: object TaskSpec.from_dict(wire) -@pytest.mark.parametrize("key", ["gait_frequency_hz", "standing_threshold", "termination_min_base_height"]) +@pytest.mark.parametrize("key", ["gait_frequency_hz", "standing_threshold"]) def test_programmatic_numeric_fields_reject_booleans(key: str) -> None: with pytest.raises(PydanticValidationError, match=key): _replace_spec(_task_spec(), **{key: True}) @@ -283,7 +283,7 @@ def test_runtime_checks_robot_joint_count() -> None: torque_limit=robot.torque_limit[:-1], ) with pytest.raises(ValidationError, match="task.config.action_scale"): - Go2WalkDeployTaskV1(_task_spec(), short_robot) + Go2WalkPolicyProcessor(_task_spec(), short_robot) joint_count = short_robot.joint_count spec = _replace_spec( @@ -294,7 +294,7 @@ def test_runtime_checks_robot_joint_count() -> None: action_lower=[-1.0] * joint_count, action_upper=[1.0] * joint_count, ) - task = Go2WalkDeployTaskV1(spec, short_robot) + task = Go2WalkPolicyProcessor(spec, short_robot) command = task.process_action(np.zeros(joint_count, dtype=np.float32)) assert command.joint_position.shape == (joint_count,) assert command.joint_velocity.shape == (joint_count,) @@ -305,7 +305,7 @@ def test_runtime_checks_robot_joint_count() -> None: def test_go2_observation_has_exact_49_element_contract() -> None: robot = _robot() state = _state(robot) - task = Go2WalkDeployTaskV1(_task_spec(), robot) + task = Go2WalkPolicyProcessor(_task_spec(), robot) context = _context(0, 0.0, [0.5, 0.0, -0.2]) task.validate_command(context.command) task.reset(state, context) @@ -324,7 +324,7 @@ def test_go2_observation_has_exact_49_element_contract() -> None: def test_previous_action_and_trot_phase_advance_after_first_tick() -> None: robot = _robot() state = _state(robot) - task = Go2WalkDeployTaskV1(_task_spec(), robot) + task = Go2WalkPolicyProcessor(_task_spec(), robot) reset_context = _context(0, 0.0, [0.5, 0.0, 0.0]) task.validate_command(reset_context.command) task.reset(state, reset_context) @@ -340,7 +340,7 @@ def test_previous_action_and_trot_phase_advance_after_first_tick() -> None: def test_standing_command_freezes_deployment_gait_phase() -> None: robot = _robot() - task = Go2WalkDeployTaskV1(_task_spec(), robot) + task = Go2WalkPolicyProcessor(_task_spec(), robot) context = _context(10, 0.2, np.zeros(3, dtype=np.float32)) task.validate_command(context.command) @@ -364,7 +364,7 @@ def test_action_processing_applies_clip_scale_and_position_limits() -> None: action_lower=[-2.0] * 12, action_upper=[0.5] * 12, ) - task = Go2WalkDeployTaskV1(spec, robot) + task = Go2WalkPolicyProcessor(spec, robot) reset_context = _context(0, 0.0, np.zeros(3, dtype=np.float32)) task.validate_command(reset_context.command) task.reset(state, reset_context) @@ -382,15 +382,35 @@ def test_action_processing_applies_clip_scale_and_position_limits() -> None: def test_go2_task_rejects_non_singleton_command_batch() -> None: - task = Go2WalkDeployTaskV1(_task_spec(), _robot()) + task = Go2WalkPolicyProcessor(_task_spec(), _robot()) with pytest.raises(ValidationError, match="command.batch_size"): task.validate_command(PlanarVelocityCommand(np.zeros((2, 3), dtype=np.float32))) def test_go2_task_scales_command_range_for_deployment_input_mapping() -> None: - task = Go2WalkDeployTaskV1(_task_spec(), _robot()) + task = Go2WalkPolicyProcessor(_task_spec(), _robot()) np.testing.assert_array_equal(task.command_lower, [-0.5, -0.5, -0.5]) np.testing.assert_array_equal(task.command_upper, [0.5, 0.5, 0.5]) task.validate_command(PlanarVelocityCommand(np.array([[0.75, 0.0, 0.0]], dtype=np.float32))) + + +def test_go2_root_task_executes_policy_budget_and_normal_stop(): + robot = _robot() + task = Go2WalkDeployTask(_task_spec(), robot, NoOpPolicy(robot.joint_count), steps=2) + state = _state(robot) + task.reset(state) + for step in range(2): + decision = task.step(state, _context(step, step * 0.02, np.zeros(3, dtype=np.float32))) + assert decision.command is not None and decision.policy_tick + completed = task.step(state, _context(2, 0.04, np.zeros(3, dtype=np.float32))) + assert completed.complete and completed.success + assert task.policy_controller.completed_steps == 2 + + task.reset(state) + assert task.step(state, _context(0, 0.0, np.zeros(3, dtype=np.float32))).policy_tick + task.request_stop() + stopped = task.step(state, _context(1, 0.02, np.zeros(3, dtype=np.float32))) + assert stopped.complete and not stopped.success + assert task.policy_controller.completed_steps == 1 diff --git a/motrix_deploy_tasks/tests/test_training_parity.py b/motrix_deploy_tasks/tests/test_training_parity.py index 985bf19e..8a7431e4 100644 --- a/motrix_deploy_tasks/tests/test_training_parity.py +++ b/motrix_deploy_tasks/tests/test_training_parity.py @@ -1,16 +1,18 @@ # Copyright Motphys Technology Co., Ltd. 2025, 2026 # SPDX-License-Identifier: Apache-2.0 -"""Golden parity between Go2 training and deployment observation/action semantics.""" +"""Training/deployment observation, action and embedded motion parity.""" + +import io import numpy as np import pytest import motrix_deploy_tasks from motrix_deploy.contracts import RobotState -from motrix_deploy.runtime import PolicyContext -from motrix_deploy.task import create_task -from motrix_deploy_tasks.tasks.go2_walk import Go2WalkTaskSpec +from motrix_deploy.runtime import ControlContext +from motrix_deploy_tasks.tasks.g1_wbt import G1WbtTaskSpec +from motrix_deploy_tasks.tasks.go2_walk import Go2WalkPolicyProcessor, Go2WalkTaskSpec from motrix_env_core import registry from motrix_env_core.input import PlanarVelocityCommand from motrix_envs.deploy import build_deployment_profile @@ -25,12 +27,8 @@ def test_go2_training_and_deployment_task_golden_probe(env_name: str) -> None: env_state = env.init_state() probe = _make_env_probe(env) robot_state = _robot_state_from_env(env, env_state, probe) - context = PolicyContext( - step=0, - elapsed_time_s=0.0, - command=PlanarVelocityCommand(env._commands), - ) - task = create_task(profile.task, profile.robot) + context = ControlContext(step=0, elapsed_time_s=0.0, command=PlanarVelocityCommand(env._commands), dt_s=0.02) + task = Go2WalkPolicyProcessor(profile.task, profile.robot) assert isinstance(profile.task, Go2WalkTaskSpec) command_scale = np.asarray(profile.task.command_scale, dtype=np.float32) assert command_scale.shape == (3,) @@ -59,10 +57,8 @@ def test_go2_training_and_deployment_task_golden_probe(env_name: str) -> None: stepped = env.step(raw_action[None, :]) next_state = _robot_state_from_env(env, stepped, probe) - next_context = PolicyContext( - step=1, - elapsed_time_s=profile.control.period_s, - command=PlanarVelocityCommand(env._commands), + next_context = ControlContext( + step=1, elapsed_time_s=profile.control.period_s, command=PlanarVelocityCommand(env._commands), dt_s=0.02 ) task.validate_command(next_context.command) np.testing.assert_allclose( @@ -73,6 +69,40 @@ def test_go2_training_and_deployment_task_golden_probe(env_name: str) -> None: ) +def test_g1_profile_uses_config_not_environment_and_embeds_named_motion(monkeypatch): + pytest.importorskip("motrix_envs") + from motrix_envs.deploy.g1_wbt import build_g1_wbt_profile + from motrix_envs.motion.library import expand_motion_paths + from motrix_envs.motion.loader import MotrixMotion + + def no_environment(*args, **kwargs): + pytest.fail("profile compilation must not construct a training environment") + + monkeypatch.setattr(registry, "make", no_environment) + profile = build_g1_wbt_profile("g1-wbt-dance") + cfg = registry.make_env_config("g1-wbt-dance") + motion = MotrixMotion(expand_motion_paths(cfg.commands.motion.motion_files)[0]) + restored = G1WbtTaskSpec.model_validate_json(profile.task.model_dump_json()) + indices = motion.joint_indices(list(profile.robot.joint_names)) + torso = motion.body_index(cfg.commands.motion.reference_body_name) + payload = np.load(io.BytesIO(next(iter(profile.payloads.values()))), allow_pickle=False) + np.testing.assert_array_equal(payload["joint_pos"], motion.joint_pos[:, indices]) + np.testing.assert_array_equal(payload["joint_vel"], motion.joint_vel[:, indices]) + np.testing.assert_array_equal(payload["reference_quaternion_xyzw"], motion.body_quat_w[:, torso]) + assert restored.motion_frames == len(motion.joint_pos) + assert restored.termination_ref_orientation_threshold == cfg.terminations.bad_ref_ori.threshold + assert restored.termination_joint_position_threshold == cfg.terminations.bad_dof_pos.threshold + assert restored.termination_joint_velocity_threshold == cfg.terminations.bad_dof_vel.threshold + kp = np.asarray(restored.kp) + expected_scale = np.zeros_like(kp) + np.divide(profile.robot.torque_limit, kp, out=expected_scale, where=kp != 0) + expected_scale *= cfg.actions.joint_position.action_scale + np.testing.assert_allclose(restored.action_scale, expected_scale) + assert profile.observation_size == 154 # Actor interface, not task tuning. + assert profile.action_size == profile.robot.joint_count == 29 + assert profile.control.period_s == restored.period_s + + def _make_env_probe(env): """Side compiler reading the imu site pose and live actuator controls.""" diff --git a/motrix_envs/src/motrix_envs/deploy/__init__.py b/motrix_envs/src/motrix_envs/deploy/__init__.py index 4f903eb7..9816b89b 100644 --- a/motrix_envs/src/motrix_envs/deploy/__init__.py +++ b/motrix_envs/src/motrix_envs/deploy/__init__.py @@ -3,7 +3,9 @@ """Deployment profile compilers for built-in MotrixLab environments.""" +# g1_wbt is imported for registration, not as a second public API facade. from motrix_deploy.profile import build_deployment_profile, registered_profile_compilers +from motrix_envs.deploy import g1_wbt as _g1_wbt from motrix_envs.deploy.go2_walk import build_go2_walk_profile __all__ = ["build_deployment_profile", "build_go2_walk_profile", "registered_profile_compilers"] diff --git a/motrix_envs/src/motrix_envs/deploy/g1_wbt.py b/motrix_envs/src/motrix_envs/deploy/g1_wbt.py new file mode 100644 index 00000000..bcacbed1 --- /dev/null +++ b/motrix_envs/src/motrix_envs/deploy/g1_wbt.py @@ -0,0 +1,88 @@ +# Copyright Motphys Technology Co., Ltd. 2025, 2026 +# SPDX-License-Identifier: Apache-2.0 + +"""Compile G1 WBT config and one motion clip without constructing an environment.""" + +import io as io_module + +import numpy as np + +from motrix_deploy.artifact.schema import ControlSpec +from motrix_deploy.profile import DeploymentProfile, register_profile_compiler +from motrix_deploy_tasks.tasks.g1_wbt import G1WbtMotion, G1WbtTaskSpec +from motrix_env_core import registry +from motrix_envs.deploy.robot import build_robot_model, build_robot_spec, read_position_servo_gains +from motrix_envs.locomotion.wbt.g1.common import G1WbtEnvCfg +from motrix_envs.motion.library import expand_motion_paths +from motrix_envs.motion.loader import MotrixMotion + + +@register_profile_compiler("g1-wbt-dance") +def build_g1_wbt_profile(env_name: str) -> DeploymentProfile: + """Embed actor reference channels and hardware-observable safety thresholds.""" + cfg = registry.make_env_config(env_name) + if not isinstance(cfg, G1WbtEnvCfg): + raise TypeError(f"Expected G1WbtEnvCfg, got {type(cfg).__name__}") + motion_cfg = cfg.commands.motion + paths = expand_motion_paths(motion_cfg.motion_files) + if len(paths) != 1: + raise ValueError("G1 WBT deployment v1 requires exactly one motion clip") + motion = MotrixMotion(paths[0]) + if not np.isclose(motion.fps * cfg.ctrl_dt, 1): + raise ValueError("Motion fps must match the deployment control period") + robot_cfg = cfg.scene.objs.robot + model = build_robot_model(robot_cfg) + robot = build_robot_spec(robot_cfg, key_pose_name="default", model=model) + kp, kd = read_position_servo_gains(model, robot.joint_names) + action = cfg.actions.joint_position + if not action.action_scales_by_effort_limit_over_p_gain: + raise ValueError("G1 WBT deployment requires effort/kp action scaling") + scale = np.zeros(robot.joint_count, dtype=np.float32) + np.divide(robot.torque_limit, kp, out=scale, where=kp != 0) + scale *= action.action_scale + joint_indices = motion.joint_indices(list(robot.joint_names)) + reference_index = motion.body_index(motion_cfg.reference_body_name) + term = cfg.terminations + # Standing-hold servo gains for physical preparation, in robot.joint_names order + # (12 legs, 3 waist, 14 arms). Training gains are dynamic whole-body tracking + # gains (legs 28-99) and cannot hold a static standing pose; these firmer gains + # are empirically validated to reach preparation readiness with unchanged safety + # gates (tilt/error/velocity/timeout) and complete the full deployment sequence. + preparation_kp = ([350.0, 200.0, 200.0, 300.0, 300.0, 150.0] * 2) + [200.0] * 3 + [40.0] * 14 + preparation_kd = ([5.0, 5.0, 5.0, 10.0, 5.0, 5.0] * 2) + [5.0] * 3 + [3.0] * 14 + joint_pos = motion.joint_pos[:, joint_indices] + joint_vel = motion.joint_vel[:, joint_indices] + reference_quaternion = motion.body_quat_w[:, reference_index] + clip = G1WbtMotion(joint_pos, joint_vel, reference_quaternion) + # The validated motion clip travels as an artifact NPZ payload; the manifest + # spec keeps only the payload path and the frame count. The task reloads and + # revalidates the clip at construction. + buffer = io_module.BytesIO() + np.savez( + buffer, + joint_pos=clip.joint_pos, + joint_vel=clip.joint_vel, + reference_quaternion_xyzw=clip.reference_quaternion_xyzw, + ) + motion_payload_path = "payloads/motion.npz" + task = G1WbtTaskSpec( + period_s=cfg.ctrl_dt, + action_scale=scale.tolist(), + kp=kp.tolist(), + kd=kd.tolist(), + preparation_kp=preparation_kp, + preparation_kd=preparation_kd, + motion_frames=len(clip), + reference_body_name=motion_cfg.reference_body_name, + termination_ref_orientation_threshold=term.bad_ref_ori.threshold, + termination_joint_position_threshold=term.bad_dof_pos.threshold, + termination_joint_velocity_threshold=term.bad_dof_vel.threshold, + ) + return DeploymentProfile( + robot=robot, + task=task, + control=ControlSpec(period_s=cfg.ctrl_dt, state_timeout_s=0.1), + observation_size=154, + action_size=robot.joint_count, + payloads={motion_payload_path: buffer.getvalue()}, + ) diff --git a/motrix_envs/src/motrix_envs/deploy/go2_walk.py b/motrix_envs/src/motrix_envs/deploy/go2_walk.py index b8b8f0b8..8110273f 100644 --- a/motrix_envs/src/motrix_envs/deploy/go2_walk.py +++ b/motrix_envs/src/motrix_envs/deploy/go2_walk.py @@ -63,7 +63,6 @@ def build_go2_walk_profile(env_name: str) -> DeploymentProfile: standing_threshold=env_cfg.commands.velocity.standing_threshold, # Match training's orientation-only fall termination. termination_min_up_z=env_cfg.termination_min_up_z, - termination_min_base_height=None, kp=kp.tolist(), kd=kd.tolist(), action_lower=action_lower.tolist(), diff --git a/motrix_rl/src/motrix_rl/deploy/service.py b/motrix_rl/src/motrix_rl/deploy/service.py index c1609026..b92e8e56 100644 --- a/motrix_rl/src/motrix_rl/deploy/service.py +++ b/motrix_rl/src/motrix_rl/deploy/service.py @@ -13,6 +13,7 @@ sha256_bytes, write_artifact, ) +from motrix_deploy.artifact.schema import PayloadSpec from motrix_deploy.contracts import TensorSpec from motrix_deploy.profile import DeploymentProfile from motrix_rl import checkpoints @@ -80,8 +81,11 @@ def export_deploy_run( robot=profile.robot, task=profile.task, control=profile.control, + payloads=tuple( + PayloadSpec(path=path, sha256=sha256_bytes(data)) for path, data in sorted(profile.payloads.items()) + ), ) - artifact = write_artifact(output, manifest, {"policy/model.onnx": policy_bytes}) + artifact = write_artifact(output, manifest, {"policy/model.onnx": policy_bytes, **profile.payloads}) return DeploymentExportResult( artifact=artifact, validation_samples=exported.report.parity.samples, diff --git a/motrix_rl/src/motrix_rl/deploy/source_rollout.py b/motrix_rl/src/motrix_rl/deploy/source_rollout.py index 1257b87a..b360eafe 100644 --- a/motrix_rl/src/motrix_rl/deploy/source_rollout.py +++ b/motrix_rl/src/motrix_rl/deploy/source_rollout.py @@ -9,7 +9,7 @@ import numpy as np from motrix_deploy.artifact import read_artifact -from motrix_deploy.policy import OnnxPolicyRuntime +from motrix_deploy.policy import OnnxPolicy from motrix_env_core import registry from motrix_rl.deploy.api import SourceRolloutResult @@ -29,7 +29,7 @@ def validate_motrixsim_source_rollout( if command.shape != (3,) or not np.isfinite(command).all(): raise ValueError(f"command must contain three finite values, got {command}") artifact = read_artifact(artifact_path) - policy = OnnxPolicyRuntime(artifact.policy_path, artifact.manifest.policy.input, artifact.manifest.policy.output) + policy = OnnxPolicy(artifact.policy_path, artifact.manifest.policy.input, artifact.manifest.policy.output) np.random.seed(seed) env = registry.make(env_name, num_envs=1) env.cfg.noise_config.level = 0.0 diff --git a/motrix_rl/tests/test_deploy_export.py b/motrix_rl/tests/test_deploy_export.py index ac11c0b6..9ffab614 100644 --- a/motrix_rl/tests/test_deploy_export.py +++ b/motrix_rl/tests/test_deploy_export.py @@ -28,14 +28,14 @@ class TestDeployTask(DeployTask): __test__ = False spec_type = TestTaskSpec - def reset(self, state, context) -> None: + def reset(self, state) -> None: pass - def build_observation(self, state, context): + def step(self, state, context): raise NotImplementedError - def process_action(self, action): - raise NotImplementedError + def request_stop(self) -> None: + pass def validate_command(self, command) -> None: pass @@ -67,6 +67,7 @@ def _profile() -> DeploymentProfile: ), task=TestTaskSpec(), control=ControlSpec(period_s=0.02, state_timeout_s=0.1), + payloads={"payloads/motion.npz": b"motion-clip-npz-bytes"}, observation_size=4, action_size=2, ) @@ -137,6 +138,10 @@ def test_deployment_export_injects_profile_builder_selected_by_run_metadata( assert result.artifact.manifest.policy.input.shape == (1, _profile().observation_size) assert result.artifact.manifest.policy.output.shape == (1, _profile().action_size) assert result.artifact.manifest.source.framework == "skrl.ppo/torch" + # Task payloads are declared in the manifest and written next to the policy. + (payload,) = result.artifact.manifest.payloads + assert payload.path == "payloads/motion.npz" + assert (result.artifact.root / "payloads" / "motion.npz").read_bytes() == b"motion-clip-npz-bytes" assert result.artifact.policy_path.read_bytes() == model.model_bytes assert result.validation_samples == 8 assert not checkpoint.with_name("policy.onnx").exists() diff --git a/wiki/design/deploy-command-input.md b/wiki/design/deploy-command-input.md index 2baa60cc..096894cd 100644 --- a/wiki/design/deploy-command-input.md +++ b/wiki/design/deploy-command-input.md @@ -22,11 +22,11 @@ runtime,因此 batch 维度是 command contract 的一部分。 | 契约 | 数据方向 | 语义 | | --- | --- | --- | -| 高层 command | input mechanism → policy task | 策略要完成的目标,例如 `PlanarVelocityCommand` | -| `RobotCommand` | policy task → robot backend | 关节位置、速度、力矩和 gains 等低层执行命令 | +| 高层 command | input mechanism → task/controller | 策略要完成的目标,例如 `PlanarVelocityCommand` | +| `RobotCommand` | controller → robot backend | 关节位置、速度、力矩和 gains 等低层执行命令 | 本文只定义 input mechanism 到高层 command 的路径。observation 拼接、policy inference 和 action processing 仍由 -[Motrix Deploy 框架设计](./motrix-deploy.md) 中的 `DeployTask`、`PolicyRuntime` 和 `RobotInterface` 负责。 +[Motrix Deploy 框架设计](./motrix-deploy.md) 中的 task-owned `PolicyProcessor`、`PolicyController` 与 `Policy` 负责,机器人 I/O 属于 `ControlSession` 与 `RobotInterface`。 ## 2. 最小概念模型 @@ -51,7 +51,7 @@ range + RNG ──> RandomPlanarVelocityBinding ──> PlanarVelocityComm 1. `InputDevice` 不得 import 或构造 command。 2. command dataclass 不得包含 key code、gamepad axis 或设备实现。 3. device 与 command 的组合只出现在 concrete device-backed binding 中;binding 本身不要求 device。 -4. `ControlLoop` 只调用 `CommandBinding.read_command(batch_size=1)`,不包含设备或任务分支。 +4. runtime 只调用 `CommandBinding.read_command(batch_size=1)`,不包含设备或任务分支。 5. Go2 使用的通用平面速度 command 与 device/constant bindings 放在 `motrix_env_core`;带训练采样策略的 binding 放在 `motrix_envs` 对应任务模块。 @@ -146,7 +146,7 @@ command scale 属于 binding。第一版先定义 ABC;具体 provider 等实 ### 4.1 不定义公共 Command ABC -command 是普通 immutable dataclass,不继承公共 base。`CommandT` 只用于 `CommandBinding`、`PolicyContext` 和 +command 是普通 immutable dataclass,不继承公共 base。`CommandT` 只用于 `CommandBinding`、`ControlContext` 和 `DeployTask` 之间的静态类型关联。 是否放入 core 由语义复用范围决定,而不是由运行时继承层次决定。当前设计只增加 Go2 所需的公共平面速度类型。 @@ -321,26 +321,43 @@ physics/control step 无条件重新采样。partial reset 时传入 `batch_size ## 6. Runtime 组合 -`PolicyContext` 只携带 control-loop metadata 与具体 command: +执行层级为 Runtime → ControlSession → DeployTask → phase controllers。Policy(`Policy`)只表示 observation → action;DeployTask 是完整任务 Controller,将机器人状态与控制输入映射为 `RobotCommand`,并编排具体任务需要的 Prepare/Policy/Stop 阶段。`PolicyController` 通过 `PolicyProcessor` 适配模型,不反向引用完整 task。 + +`ControlSession.period_s` 是唯一执行周期来源,Runtime 据此调度;`ControlContext.dt_s` 携带该周期,`elapsed_time_s` 携带连续执行时间。Controller 在阶段开始时记录时间原点以形成局部时钟,不另设执行周期。Task/artifact 的参考采样周期只定义参考数据语义,不承担调度。 + +`ControlContext` 携带 control-loop metadata 与具体 command: ```python @dataclass(frozen=True) -class PolicyContext(Generic[CommandT]): +class ControlContext(Generic[CommandT]): step: int elapsed_time_s: float - command: CommandT + command: CommandT | None + dt_s: float ``` 每个 tick 的 command input 路径只有两步: ```text -1. command = command_binding.read_command(batch_size=1) -2. context = PolicyContext(step=step, elapsed_time_s=elapsed_time_s, command=command) +1. command = command_binding.read_command(batch_size=1) if command_binding is not None else None +2. context = ControlContext(step=step, elapsed_time_s=elapsed_time_s, dt_s=session.period_s, command=command) ``` -随后 `DeployTask.validate_command()` 和 `build_observation()` 消费同一个 command。binding/device 异常统一作为 -`input_error` 结束 rollout;`KeyboardInterrupt` 映射为 `interrupted`。更细的 timeout、disconnect、stale input -错误等真实设备需要区分时再加入。 +ControlSession 的 `command_binding` 默认 `None`;有 binding 时读取指令,没有时直接将 +`ControlContext.command` 设为 `None`。G1 自主播放不创建占位 binding;Go2 仍需外部速度 +binding,并由 task 语义校验拒绝缺失指令,不回退到零速度。Task 不提供 binding factory。 +CLI 从 task 的速度范围组装输入;无速度输入的自主任务校验 `None` 并拒绝 command 配置, +不引入额外 capability 或 registry。 +ControlSession 负责读取可选 binding、构造 context、backend open/enable、状态校验、命令写入、清理和统计。 +`DeployTask.step(state, context)` 消费实测状态和输入,返回 `ControllerStep`; +其 `PolicyController` 通过 `PolicyProcessor` 调用 command 校验、observation 构造、模型推理与动作转换, +不持有 backend handle。`G1WbtDeployTask` 自行管理 ready、policy 与 damping,不让 ControlSession 或 Runtime 解释阶段名;DeploymentRuntime 负责会话调度、异常处理、清理与宿主生命周期;物理周期配置、推进、时间测量、viewer 与仿真世界资源仅属于 SimulationRuntime。 +binding/device 异常统一作为 `input_error` 结束 rollout;`KeyboardInterrupt` 映射为 `interrupted`。 +更细的 timeout、disconnect、stale input 错误等真实设备需要区分时再加入。 + +`ControllerStep.policy_tick` 只标记实际模型推理/actor 决策,不计 ready 或 damping 命令。根 `ControllerStep.error` 对应 `controller_error`;`policy_error` 只用于推理失败。Session 提供 `ControlContext.dt_s` 与 `elapsed_time_s`;Controller 不持有独立执行周期。 + +`ControlSession.result()` 只返回通用 RolloutResult:success、exit reason、模型完成步数、wall time、overrun、trace、error 与 latency。硬件结果不携带仿真指标。SimulationRuntime 返回 SimulationRolloutResult,增加 policy_simulation_time_s(模型命令下实际推进的物理时间,含故障前部分推进,不含 ready/damping)及其与 wall time 的比值 real_time_factor。该指标不是整个世界时钟;通用循环只通过窄的内部宿主 interval hook 执行宿主工作,不识别 physics。 仿真 realtime/fixed-step scheduler 由 `runtime.realtime` 选择,`null` 跟随 `runtime.viewer`;硬件内部始终实时调度,不从 device capabilities 推断。 @@ -349,8 +366,15 @@ class PolicyContext(Generic[CommandT]): `KeyboardDeviceProvider` 与 `GamePadDeviceProvider` 定义在 `motrix_deploy.robot.interface`,是可选输入设备 capability protocol,不是 runtime 插件 factory;返回设备的生命周期由 provider 管理。 deploy 应用在 runtime factory 返回 prepared host 后,从 runtime 的可选 `KeyboardDeviceProvider` 取得 GLFW keyboard device 并创建 binding, -再显式构造 `ControlSession(robot=runtime.robot, ...)`,通过 `runtime.bind_control_session(control)` 绑定; -`with runtime` 打开资源后调用 `runtime.run(steps=...)`。Runtime factory 不承担控制器构造。应用 +在外部加载 Policy,再以 `task = create_task(spec, runtime.robot.spec, policy, steps=50)` 注入任务。 +应用创建 `session = ControlSession(robot=runtime.robot, controller=task, command_binding=binding, period_s=0.02, state_timeout_s=0.1)`, +Task 满足构造时必需的 Controller 契约;调用 `runtime.bind_session(session)`, +通过 `runtime.session` 与 `session.controller` 访问会话及 task,在 `with runtime` 中执行 `runtime.run()`。 +Task 负责自己的阶段编排,通用 DeployTask 不强制阶段顺序;正常停止由 task 决定,故障立即走 backend fallback。 +现有 `motrix_deploy.tasks` entry points 直接提供 task class;`load_task_type` 选择 task 与 spec codec, +`create_task(spec, robot, policy, steps=None)` 构造完整任务,`default_duration_s(spec)` 无需构造 task 即可读取预算。 +PolicyController 持有 `policy_io` 与 Policy,不持有完整 task,避免循环依赖。模型预算在 task 构造时传入, +不传给 run。Runtime factory 不承担任务或控制器构造。应用 不建立 input registry;headless CLI 使用 `command.velocity` 配置 constant command。Go2 task 从 artifact 读取 `command_lower`、`command_upper` 和与 `[vx, vy, yaw_rate]` 对齐的三维 `command_scale`,向 factory 暴露逐元素 `range * scale` 后的映射端点;scale 属于 artifact 的 task contract,不在 runtime recipe 重复配置。内置交互式 @@ -382,7 +406,7 @@ motrix_env_core/src/motrix_env_core/ └── bindings.py # CommandBinding、built-in bindings motrix_deploy/src/motrix_deploy/ -└── runtime/ # PolicyContext;调用 CommandBinding.read_command() +└── runtime/ # ControlContext;调用 CommandBinding.read_command() motrix_deploy_tasks/src/motrix_deploy_tasks/ └── tasks/ @@ -441,7 +465,7 @@ contract,并在四足训练模块中实现带训练分布语义的 random bind ### 9.5 Runtime integration - fake `CommandBinding` 可以驱动 control loop,不需要真实 device; -- 替换 keyboard、gamepad 或 constant binding 不修改 `ControlLoop`、`DeployTask` 或 backend; +- 替换 keyboard、gamepad 或 constant binding 不修改 `Controller`、`DeployTask` 或 backend; - training 使用 random binding 不依赖 `InputDevice` 或 deploy runtime; - Go2 task 直接消费公共 `PlanarVelocityCommand`; - binding 异常产生 `input_error`,用户中断产生 `interrupted`。 diff --git a/wiki/design/motrix-deploy.md b/wiki/design/motrix-deploy.md index eb2dcc83..1ffab01c 100644 --- a/wiki/design/motrix-deploy.md +++ b/wiki/design/motrix-deploy.md @@ -6,7 +6,7 @@ sim2real vertical slice。`motrix_deploy` 是独立于训练框架的策略部署包:训练侧先通过统一的 [ONNX policy exporter](./onnx-export.md) 把 metadata-backed run 转换为经过 parity 验证的自包含 ONNX, 再由 `motrix_envs.deploy` compiler 补全 robot、task 和 control 契约并写出 artifact。部署侧使用带版本的 -`DeployTask`、`PolicyRuntime` 和通用控制循环驱动仿真或真实机器人。运行时 command input 的 +`DeployTask`、`Policy` 和通用控制循环驱动仿真或真实机器人。运行时 command input 的 `InputDevice`、公共 `PlanarVelocityCommand` 和 `CommandBinding` 契约由独立的 [Deploy Runtime Command Input 分层设计](./deploy-command-input.md) 定义。sim2sim 与 sim2real 只替换 `RobotInterface`,不得分别维护 policy tensor 拼接、command mapping 或 action 后处理逻辑。 @@ -38,12 +38,12 @@ motrix_rl checkpoint + run metadata + task snapshot CommandBinding.read_command(batch_size=1) -> PlanarVelocityCommand | v - PolicyContext + ControlContext | - RobotState ----------------------------+----> DeployTask.build_observation + RobotState ----------------------------+----> PolicyProcessor.build_observation | v - DeployTask -> PolicyRuntime -> DeployTask.process_action + DeployTask -> Policy -> PolicyProcessor.process_action ^ | | v +----- RobotInterface <---------- RobotCommand @@ -190,10 +190,10 @@ motrix_deploy/ │ ├── profile.py # DeploymentProfile、compiler registry 和统一 build 入口 │ ├── task.py # DeployTask 接口与版本化 task entry-point discovery │ ├── env.py # robot-free 世界 discovery 与 assemble_deploy_scene(env ID, robot ID) -│ ├── policy/ # PolicyRuntime 与 runtime registry -│ ├── runtime/ # PolicyContext、lifecycle、control loop、scheduler、result/metrics -│ │ ├── base.py # DeploymentRuntime / SimulationRuntime、bind_control_session -│ │ ├── control.py # ControlSession:共享 start/tick/stop +│ ├── policy/ # Policy 与 runtime registry +│ ├── runtime/ # ControlContext、lifecycle、control loop、scheduler、result/metrics +│ │ ├── base.py # DeploymentRuntime / SimulationRuntime、bind_session +│ │ ├── control.py # ControlSession 执行器与 PolicyController 策略控制器 │ │ ├── hardware.py # HardwareRuntime:墙钟 scheduler │ │ └── factory.py # motrix_deploy.backends discovery;返回 prepared runtime │ ├── robot/ # robot I/O 与可选 input-device capability;精简 initializer @@ -223,7 +223,7 @@ motrix_deploy_unitree/ motrix_deploy_tasks/ ├── src/motrix_deploy_tasks/ │ ├── tasks/ -│ │ └── go2_walk.py # Go2WalkTaskSpec 与 Go2WalkDeployTaskV1 同置 +│ │ └── go2_walk.py # Go2WalkTaskSpec 与 Go2WalkDeployTask 同置 │ ├── envs/ # flat.py / rough.py:独立、robot-free 部署世界 │ ├── config/task/ # go2-walk-flat/{sim,hardware}.yaml、go2-walk-rough/sim.yaml │ └── __init__.py # 精简 package initializer;task 类由 entry point 声明 @@ -282,28 +282,26 @@ class RobotState: base_orientation_xyzw: np.ndarray base_angular_velocity: np.ndarray base_linear_acceleration: np.ndarray - base_position: np.ndarray | None = None base_linear_velocity: np.ndarray | None = None - extras: Mapping[str, np.ndarray] = field(default_factory=dict) ``` - joint 数组使用 `RobotSpec.joint_names` 顺序。 - `sample_time_ns` 表示底层采样时间;没有可靠设备时钟时可等于本机接收时间。 - `receive_time_ns` 使用本机单调时钟,用于 timeout 判断。 -- optional 字段只有在 observation 或 metric 需要时才成为 backend 必需能力。 -- `extras` 用稳定名称承载足底力、里程计等扩展;artifact 必须声明实际消费的 key、shape、dtype 和单位。 +- `base_linear_velocity` 是可选 world-frame sensor/estimator 输出;当前 Unitree 接口不提供,样本保持 `None`,Go2/G1 部署 task 不依赖它。 +- world-frame base position 不属于通用 `RobotState`;Go2 fall termination 使用 IMU 姿态,不使用世界高度。仿真 ground truth 只能保留在 simulator-specific diagnostics。 ### 6.3 Command input 机器人状态不是 observation 的唯一输入。Go2 速度跟踪策略还需要平面目标速度。runtime 使用以下单向数据流: ```text -CommandBinding.read_command(batch_size=1) -> PlanarVelocityCommand -> PolicyContext -> DeployTask +CommandBinding.read_command(batch_size=1) -> PlanarVelocityCommand -> ControlContext -> DeployTask ``` 最小 device/binding 接口、包归属、配置和测试边界统一由 [Deploy Runtime Command Input 分层设计](./deploy-command-input.md) 定义。本框架只要求 `ControlLoop` 调用已经装配的 -binding,不直接读取 device,也不解释 `PlanarVelocityCommand` 字段。公共 command 始终携带显式 batch 维;当前 +可选 binding;未提供 binding 的自主控制会话直接将 `ControlContext.command=None` 交给 controller,不创建占位输入对象。Go2 等需要外部输入的 task 在输入边界拒绝缺失 command,不能静默补零。Session 不直接读取 device,也不解释 `PlanarVelocityCommand` 字段。公共 command 始终携带显式 batch 维;当前 deploy runtime 只接受 `values.shape == (1, 3)`,Go2 task 校验 batch size 后取出唯一一行。 ### 6.4 RobotCommand @@ -325,7 +323,7 @@ tau = kp * (q_target - q) + kd * (qd_target - qd) + tau_ff ``` backend 可以把该命令传给原生 hybrid controller,也可以在本地计算 torque,但必须声明相应 capability。 -`DeployTask.process_action()` 在写入 backend 前完成 action 和目标 position 裁剪,并生成显式 gain。backend 仍需执行最后 +`PolicyProcessor.process_action()` 在写入 backend 前完成 action 和目标 position 裁剪,并生成显式 gain。backend 仍需执行最后 一道设备级硬限制,不能扩大 artifact 的限幅。 ### 6.5 RobotInterface 与 capability @@ -360,7 +358,7 @@ class RobotInterface(ABC): `RobotCapabilities` 至少声明: - 支持的控制模式; -- 可用 state 字段和 extra sensors; +- 支持的 state 字段; - 是否支持渲染; - 最大推荐 command rate; - 是否需要显式 enable,以及 stop 的安全语义。 @@ -368,8 +366,28 @@ class RobotInterface(ABC): 仿真 backend 在 `open()` 中完成自身的确定性初始化;真机 backend 建立通信后由 `read_state()` 返回当前状态。 `enable()` 不接收 initial command;Unitree backend 自行构造到 `RobotSpec.default_joint_position` 的姿态过渡, 目标速度与 feedforward torque 为零,使用解析后的 `runtime.kp` / `runtime.kd`,`null` 时保留 artifact 增益。 -不通过 task action 推导启动命令。`ControlSession.start()` 不调用 task `process_action()` 生成零动作启动命令; -初始状态的 safety/termination 检查仍先于 enable,Start/A 门控与 enable 后新状态检查保持有效。 +不通过 task action 推导启动命令。Runtime 不调用 task `process_action()` 生成零动作启动命令; +无 task 准备阶段时,初始状态的 termination 检查先于 enable;有准备阶段时使用 enable 后的实测状态准备,准备完成后才检查 policy 接管条件。Start/A 门控保持有效。 + +#### Runtime 驱动的控制生命周期 + +Policy 专指 observation → action 的映射,模型运行接口为 `Policy`。Controller 指实测 `RobotState` + 外部输入 → `RobotCommand`,控制级 `Controller` 返回 `ControllerStep` 命令、完成状态及指标;共享输入上下文为 `ControlContext`。 +DeployTask 是完整任务控制入口,满足 Controller 契约,拥有任务阶段和正常停止逻辑。应用加载 Policy 后注入 task 构造函数;Session 直接执行 task。G1 task 按 `prepare → policy_hold → playback → damping` 编排,对齐真实部署流程;Go2 task 内部委托 PolicyController,通用 Task 不固定阶段序列,不引入状态机 registry 或 DSL。 +`PolicyController` 包装独立 PolicyProcessor 的 observation/action 语义与 Policy 推理,只生成命令,不持有完整 Task、robot handle 或 backend;Task → PolicyController → PolicyProcessor 避免 Task 与策略控制器的循环依赖。prepare 与 damping 是确定性 controller,不伪造 observation/action。 + +G1 四阶段语义: + +- **prepare**:从实测关节姿态 ramp 到独立站立姿态(robot 默认站立位,非 motion 第 0 帧),使用 artifact 中独立的 preparation kp/kd(训练增益是动态跟踪增益,过软无法静态保持)与时序(spec 字段 `preparation_ramp_duration_s`/`preparation_settle_duration_s`/`preparation_timeout_s`,profile 编译期定值)。就绪门(误差/速度/倾角连续满足 settle 时长)不变;首次就绪后超时解除但每 tick 重新评估,倾角故障立即失败。就绪后按接管模式决定是否等待:默认自动接管,manual 模式保持等待操作员请求。 +- **policy_hold**:实测就绪且接管请求置位(默认 `automatic_start=True` 时就绪后下一 tick 自动置位;manual 模式由显式 `request_policy_start()` 置位)后,同一份实测状态立即切换;policy 以冻结的 motion 起始帧推理,更新 action 历史,不消耗 playback 预算。至少执行一个 hold 周期后才可能进入 playback。 +- **playback**:motion 参考帧在 hold 驻留目标到达或显式 `request_motion_start()` 后开始推进;policy 历史连续不重置,仅将剩余播放预算设为有限值。playback 步数由 task 单独统计(`playback_steps`),通用 `completed_steps` 包含 hold 推理。舞蹈以后倾姿态结束,只有跟踪中的 policy 能维持平衡,播放预算完成后直接进入 damping;以站立收场需要 motion 本身以站立姿态结束。 +- **damping/complete**:播放预算完成前仍执行最终实测状态检查;正常停止请求立即进入 damping,故障由 Session 兜底绕过正常停止。 + +操作员输入是任务语义,由 task 自身响应,CLI 不路由任何任务特有选项(`DeployRunConfig` 不含任务选项通道)。G1 task 构造时以 `automatic_start` 选择接管模式:默认 `True`,实测就绪后下一 tick 自动置位接管请求;`False` 为 manual 模式,阶段切换完全由请求方法驱动。程序化应用可通过 `attach_keyboard(keyboard, hold_ticks=...)` 接入 viewer 键盘(`p` 接管 / `m` 提前播放 / `o` 停止,在 `step()` 开头翻译为内部请求标志)或 `enable_automatic_start(hold_ticks=...)` 脚本化驻留接管。请求只置位,实际切换在下一个控制 tick 由 task 依据实测就绪状态决定;不引入通用 phase command registry。 +采用 Runtime → ControlSession → Controller:Runtime 持有世界/宿主、scheduler、物理推进和 viewer,bind_session(session);阶段无关的 ControlSession 表示一次控制执行会话,构造时接收必需的 Controller,持有机器人 I/O、binding、状态与命令边界校验、命令写入、故障停机及统计。Session 不存在未绑定 controller 的中间状态,不识别 ready/model/damping,不创建 task controller,不自行等待或推进物理。DeploymentRuntime 的共享循环只通过 `_check_running()` 检查宿主是否允许继续,并通过窄的 `_advance_interval()` 执行宿主区间扩展;不查询或累计物理时间。物理推进、physics timestep 比例校验、物理时钟与 viewer 检查接口属于 SimulationRuntime,HardwareRuntime 不暴露这些仿真方法。 +现有任务插件 entry point 直接关联 DeployTask 类型,codec 使用 task_type.spec_type;CLI 调用 create_task(spec, robot_spec, policy, steps=...) 得到完整任务控制入口,不需要外部 controller builder 或插件描述对象。Controller 契约不要求持有 Policy:纯确定性 controller 同样可由 ControlSession 执行。 +子 controller 完成时,复合 controller 用同一份实测状态切换并执行下一 controller,不消耗空周期;最终 controller 完成后退出。每个未完成的控制决策经历一个控制周期。阶段诊断仅由具体复合 controller 持有,不进入 ControllerStep、ControlSession 或通用 RolloutResult;通用执行器不透传状态机历史。 +最后一个模型命令作用周期结束后,PolicyController 检查实际状态,再转入 damping。准备/停止命令不计 policy budget。执行 period_s 仅由 ControlSession 持有,并通过 ControlContext.dt_s 与 elapsed_time_s 提供给 controller;Controller 不保存执行周期、不按 steps × 自己的周期重算时间。各子 controller 以进入时刻为原点建立局部时钟,history 在进入时归零,runtime deadline 连续。Task/artifact 的参考采样周期保留为模型或 motion 数据语义,不是 controller 的调度配置。 +故障由 ControlSession 执行 backend 停机,Runtime 清理世界/宿主资源,跳过正常 damping;正常停止请求由复合 controller 决定具体转换。Controller 不保存 runtime 回调,不创建 scheduler 或调用 sleep。 `stop()` 和 `close()` 必须幂等,任何启动后异常都按 `stop -> close` 收尾。`HealthStatus` 包含状态、原因和最后 成功通信时间,不能只返回无语义的 bool。 @@ -379,39 +397,53 @@ class RobotInterface(ABC): class DeployTask(ABC, Generic[CommandT]): spec_type: ClassVar[type[TaskSpec]] - def reset(self, state: RobotState, context: PolicyContext[CommandT]) -> None: ... - def build_observation(self, state: RobotState, context: PolicyContext[CommandT]) -> np.ndarray: ... + @classmethod + def default_duration_s(cls, spec: TaskSpec) -> float | None: ... + def reset(self, state: RobotState) -> None: ... + def step(self, state: RobotState, context: ControlContext[CommandT]) -> ControllerStep: ... + def request_stop(self) -> None: ... + def validate_command(self, command: CommandT | None) -> None: ... + +class PolicyProcessor(ABC, Generic[CommandT]): + @abstractmethod + def reset(self, state: RobotState, context: ControlContext[CommandT]) -> None: ... + @abstractmethod + def build_observation(self, state: RobotState, context: ControlContext[CommandT]) -> np.ndarray: ... + @abstractmethod def process_action(self, action: np.ndarray) -> RobotCommand: ... - def validate_command(self, command: CommandT) -> None: ... + @abstractmethod + def validate_command(self, command: CommandT | None) -> None: ... + def check_termination(self, state: RobotState) -> str | None: + return None ``` artifact 的 task wire format 只记录版本化 task 标识和 config;内存中的 `TaskSpec` 是具体任务的 Pydantic model, 其 codec 与 class discovery 见 [Manifest 内容](#82-manifest-内容)。observation/action 维度只记录在 `policy.input/output.shape`。 `DeployTask` 不声明 `observation_size` 或 `action_size`;实际 observation 数组由 policy 输入边界校验, -实际 action 数组由 task 的 `process_action()` 边界校验,CLI 不提前比较 task 维度。具体 observation 顺序、 +实际 action 数组由 PolicyProcessor 的 `process_action()` 边界校验,CLI 不提前比较 task 维度。具体 observation 顺序、 previous action、phase 与 action 后处理算法由 `motrix_deploy_tasks` 中一个带版本的 task 类直接实现,不在 manifest 中构造通用计算 DSL。修改已有语义必须新增 task version,不能静默改变旧实现。部署时关闭训练 observation noise; 训练框架的 observation normalizer 必须烘焙进 ONNX。 -### 6.7 PolicyRuntime +### 6.7 Policy ```python -class PolicyRuntime(ABC): +class Policy(ABC): def reset(self) -> None: ... def infer(self, observation: np.ndarray) -> np.ndarray: ... ``` -第一版内置 `OnnxPolicyRuntime`,使用确定性 action 输出。runtime 创建时验证模型输入输出名称、dtype 和 shape; +第一版内置 `OnnxPolicy`,使用确定性 action 输出。runtime 创建时验证模型输入输出名称、dtype 和 shape; 每次 `infer()` 验证输出无 NaN/Inf。接口保留 `reset()` 以支持未来 recurrent policy,但第一版 artifact 只接受 单输入、单输出、无隐藏状态的 ONNX policy。 -`DeployTask.build_observation()` 的输出是训练环境的原始 actor observation。训练框架的 observation normalizer 和 deterministic +`PolicyProcessor.build_observation()` 的输出是训练环境的原始 actor observation。训练框架的 observation normalizer 和 deterministic policy head 必须烘焙进 ONNX,不能在 runtime 外保留 framework-specific preprocessor;不满足自包含约束的模型 拒绝导出为第一版 artifact。 ### 6.8 Task-specific action -第一版 `go2_walk/v1` 在自己的 `DeployTask` 中实现 joint-position target:raw action 经过 finite check、clip、 +第一版 `go2_walk/v1` 在自己的 `Go2WalkPolicyProcessor` 中实现 joint-position target:raw action 经过 finite check、clip、 per-joint scale 和 default pose offset,再应用 position limit,生成零目标速度、零 feed-forward torque 和配置的 KP/KD。task 同时保存 previous action;sim2sim 与 sim2real 必须复用同一版本化 task 标识及 config。 @@ -430,13 +462,13 @@ event-based device 执行一次 `poll()`。`ControlLoop.run()` 的单步顺序 ```text 1. LoopScheduler 到达当前 tick deadline -2. CommandBinding.read_command(batch_size=1) 产生 PlanarVelocityCommand,并构造经过 task 校验的 PolicyContext +2. CommandBinding.read_command(batch_size=1) 产生 PlanarVelocityCommand,并构造经过 task 校验的 ControlContext 3. 从 RobotInterface 读取 RobotState,检查 backend health、状态时效、shape 和 finite values -4. DeployTask.build_observation(state, context) -5. PolicyRuntime.infer(obs) -6. DeployTask.process_action(action) -7. safety limiter 验证 RobotCommand,RobotInterface.write_command(command) -8. 记录 input / binding / read / obs / inference / action / write / loop timing +4. DeployTask.step(state, context) 选择当前 controller 并返回 ControllerStep + policy phase 内部执行 PolicyProcessor.build_observation → Policy.infer → PolicyProcessor.process_action +5. Session 验证 RobotCommand,RobotInterface.write_command(command) +6. Runtime 执行宿主区间并等待下一 deadline(仿真推进物理,硬件仅等待) +7. 记录 input / read / observation / inference / action / write / loop timing ``` `ControlLoop` 接收 `LoopScheduler`,但不判断当前是否为仿真: @@ -445,7 +477,7 @@ event-based device 执行一次 `poll()`。`ControlLoop.run()` 的单步顺序 - `FixedStepScheduler` 每次推进 artifact 定义的固定 `dt`,不执行 wall-clock sleep,用于默认 headless sim2sim 和确定性 CI。 -两种 scheduler 向 `PolicyContext` 提供相同的 step 和 elapsed control time;wall-clock latency 单独计量。 +两种 scheduler 向 `ControlContext` 提供相同的 step 和 elapsed control time;wall-clock latency 单独计量。 仿真的 realtime/fixed-step scheduler 由 `runtime.realtime` 选择;`null` 跟随 `runtime.viewer`。硬件始终在内部实时调度,不从 device 推断。 Fixed-step 模式记录“若实时运行是否 overrun”,但默认不因此终止 rollout。第一版 policy rate 与 command rate 相同;未来需要多速率时通过 scheduler 扩展,不能由 backend 私自重复或插值 policy action。 @@ -541,10 +573,10 @@ manifest 至少包含以下部分。下面是结构节选,为便于阅读省 frozen 字段赋值和有限数值约束;提供公共 `to_dict()` / `from_dict()` codec。具体 spec 声明 `task_name: ClassVar[str]`,通过 `Annotated` / `Field` 约束字段,通过 `model_validator` 约束跨字段关系。 构造与 `model_validate()` 自动校验,不另设手写 `validate()` 或 dataclass `__post_init__`。 -- `Go2WalkTaskSpec` 与 `Go2WalkDeployTaskV1` 同置于 `motrix_deploy_tasks.tasks.go2_walk`;task 类通过 +- `Go2WalkTaskSpec` 与 `Go2WalkDeployTask` 同置于 `motrix_deploy_tasks.tasks.go2_walk`;task 类通过 `spec_type = Go2WalkTaskSpec` 关联配置类型。`action_scale` 是按 canonical joint order 排列的 `list[float]` 向量;训练侧 compiler 在导出时把 scalar scale 展开为逐关节向量,codec 不接受 scalar fallback。 -- manifest 读取按 `task.name` 加载唯一 `motrix_deploy.tasks` entry point 指向的 task **类**,不构造 runtime task, +- manifest 读取按 `task.name` 加载唯一 `motrix_deploy.tasks` entry point 的 entry point 关联的 task **类**,不构造 runtime task, 再按其 `spec_type.model_validate()` 解码、校验具体 model。只使用这一组 task entry points,不增加独立 spec entry point, 也不保留原始 dict fallback。未知或重复插件、未知字段、缺少必需字段和非法类型在读取边界拒绝。 @@ -574,7 +606,7 @@ deployment export 不得再按 `(rllib, train_backend, algo)` 实现 `export_rsl task/robot/action 语义时,在 `motrix_envs.deploy` 增加 profile compiler,在 `motrix_deploy_tasks` 增加 task 实现, compiler 通过 import-time 注册接入 profile registry,并直接构造该 task 的具体 spec;task 类通过唯一的 `motrix_deploy.tasks` entry point 接入,如 -`"go2_walk/v1" = "motrix_deploy_tasks.tasks.go2_walk:Go2WalkDeployTaskV1"`,由类上的 `spec_type` 同时支持 +`"go2_walk/v1" = "motrix_deploy_tasks.tasks.go2_walk:Go2WalkDeployTask"`,由类上的 `spec_type` 同时支持 manifest 解码和运行时构造,不另设 spec 插件。 组合导出接口直接消费经过验证的 ONNX model bytes 和 `OnnxExportReport`。独立导出 `.onnx` 的用户入口继续 @@ -849,7 +881,7 @@ profile compiler registry;`motrix_envs.deploy` import 具体 compiler 时通 `register_profile_compiler()` 装饰器按环境名自动注册。task runtime 通过 `motrix_deploy.tasks` Python entry-point group 按版本化 task 标识发现。`available_tasks()` 只读取已安装插件元数据;`load_task_type()` 懒加载唯一 `DeployTask` 类,manifest codec 读取其 `spec_type` 而不实例化 task。`create_task()` 再将已解码的具体 -`TaskSpec` 和 `RobotSpec` 传给该类构造运行时 task。未知名称或重复插件报错,不按 import 顺序选择实现。 +`TaskSpec`、`RobotSpec`、已加载的 `Policy` 和可选 `steps` 传给该类构造完整 task controller。未知名称或重复插件报错,不按 import 顺序选择实现。 `motrix_deploy` core 发布指向 `motrix_deploy.cli:main` 的 console script,不反向 import 具体环境、task 或 SDK; 具体部署 recipe 通过已安装 Hydra search-path plugin 提供的 `task` group 选择;外部应用也可显式指定 Hydra config path/name。 @@ -862,7 +894,7 @@ policy runtime 由 CLI 装配;observation 与 action 语义由具体 `DeployTa term/processor registry。 注册冲突、未知组件和版本不兼容在 artifact validation 阶段报错。注册的具体实现只获得公共 contract,不获得 -`PolicyRuntime` 或 raw observation,因此无法绕过统一 task 路径。 +`Policy` 或 raw observation,因此无法绕过统一 task 路径。 ## 11. MuJoCo sim2sim 设计 @@ -878,8 +910,8 @@ rollout 支持平地与确定性 procedural height-field 世界,分别通过 ```text CommandBinding.read_command(batch_size=1) -> PlanarVelocityCommand --+ v -MuJoCo state -> RobotState -> Go2WalkDeployTaskV1 -> ONNX PolicyRuntime - -> Go2WalkDeployTaskV1 -> RobotCommand -> MuJoCo torque/actuator +MuJoCo state -> RobotState -> Go2WalkDeployTask -> ONNX Policy + -> Go2WalkDeployTask -> RobotCommand -> MuJoCo torque/actuator ``` 不允许为了尽快跑通而直接调用 `QuadrupedWalkTask._compute_obs()` 或 `apply_action()`;deployment @@ -964,32 +996,30 @@ config = SimulationRuntimeConfig( ``` Runtime factory 只选择并准备宿主,不通过回调构造控制器。创建返回后,`runtime.robot` 及其只读 -`spec` 在 `open()` 之前已可用;应用显式构造自己的 task、policy、binding 和 `ControlSession`: +`spec` 在 `open()` 之前已可用;应用显式构造自己的 task、policy、binding 和控制器: ```python from motrix_deploy.runtime.control import ControlSession +from motrix_deploy.task import create_task from motrix_deploy.runtime.factory import create_simulation_runtime runtime = create_simulation_runtime("mujoco", config) robot = runtime.robot -control = ControlSession( - robot=robot, - task=task, - policy=policy, - command_binding=command_binding, - period_s=0.02, +task = create_task(task_spec, robot.spec, policy, steps=50) +session = ControlSession( + robot=robot, controller=task, command_binding=command_binding, + period_s=0.02, state_timeout_s=0.1, ) -runtime.bind_control_session(control) +runtime.bind_session(session) with runtime: - result = runtime.run(steps=50) + result = runtime.run() ``` 这里的 task、policy 与 command_binding 由应用持有;依赖机器人契约的 task 可在 runtime 创建后从 `robot.spec` 构造。硬件由 `create_hardware_runtime(name, config, context)` 返回 prepared host 后,使用同样的 -显式组装和绑定流程。`run(control, steps=...)` 仍可直接接收 session;绑定和传入的 session 必须属于该 -runtime 的 robot,不能覆盖另一个已绑定的 session。`ControlSession.period_s` 是控制周期的唯一来源; -`SimulationRuntimeConfig` 不重复声明控制周期,仿真宿主在绑定或解析 session 时校验它与 physics timestep 的整数倍关系。 -Task 只由 control session 持有,不重复传给 runtime。 +显式组装和绑定流程。Runtime 只绑定属于自身 robot 的 ControlSession;ControlSession 在构造时接收必需的 controller 与可选输入 binding。G1 自主播放不传 binding;task 不创建输入适配器,应用仅为需要外部命令的 task 组装 binding。 +预算在创建 Task 时传入并交给内部 PolicyController,不重复传给 run。ControlSession.period_s 是调度周期,仿真绑定时验证其为 physics timestep 的整数倍。 +Task 作为 session.controller 执行;PolicyController 只使用 PolicyProcessor。 `motrix_deploy` core 不查询训练环境 registry,也不依赖仿真器。MuJoCo plugin 将完整场景与 `config.physics` 直接传给 `MuJoCoSceneCompiler.create_spec()`,编译 terrain、robot、sensor 与视觉配置, @@ -1028,14 +1058,14 @@ sim2sim 的 Hydra 配置将 artifact、duration_s 和 command 放在顶层,仿 - 使用 task 从 artifact 读取的 command range 乘以 scale 后创建 keyboard binding; - reset 后从 step 0 重新初始化 phase、previous action 和 scheduler; - 用户中断时受控停止; -- 输出 JSON-compatible `RolloutResult`; -- 可配置任务指标:base height、fall、速度跟踪误差等,但这些指标不进入通用控制循环。 +- 硬件输出通用 `RolloutResult`:成功状态、退出原因、完成步数、墙钟时间、overrun、trace、错误和 latency;ControlSession 只构造此通用结果; +- 仿真输出 `SimulationRolloutResult`,额外携带 `policy_simulation_time_s` 和 `real_time_factor`。前者只累计模型命令作用期间实际推进的物理时间(包括失败前的部分区间),不包含 ready/damping;后者为此时间与墙钟运行时间之比。SimulationRuntime 独立累计并添加这些指标,硬件不生成仿真指标; +- 可配置任务指标:IMU fall、速度跟踪误差等,但这些指标不进入通用控制循环,也不引入不可观测的世界高度。 deployment backend 使用最小 GLFW viewer:每次 `sync()` 只更新 MuJoCo scene 并 render,不拥有仿真步进;同一 window 的 callbacks 提供 keyboard event frame 与 mouse camera control,失焦后立即释放 held keys。viewer 模式默认使用 realtime scheduler,可通过 `runtime.realtime=false` 关闭实时节奏控制。headless CLI 使用配方中的 constant command,可通过 `command.velocity` 覆盖; -`runtime.realtime=null` 时跟随 `runtime.viewer`,也可显式配置实时节奏。`ControlLoop.run(steps=...)` 保留为 -程序化确定步数运行能力,不进入 CLI 配置。 +`runtime.realtime=null` 时跟随 `runtime.viewer`,也可显式配置实时节奏。程序化确定步数运行在 Task 构造时传入 `steps=...` 设置内部模型控制器预算,随后由 `runtime.run()` 执行。 ### 11.5 原生 MotrixSim runtime @@ -1048,8 +1078,8 @@ motrix-deploy task=go2-walk-flat/sim artifact=artifacts/go2-walk-flat.deploy \ ``` 粗糙地形同样使用 `task=go2-walk-rough/sim`,不复制 backend-specific recipe。程序化 factory 使用 -`create_simulation_runtime("motrixsim", config)`,返回 prepared `runtime.robot` 后显式构造并绑定 session。 -`ControlSession.period_s` 是唯一控制周期来源,绑定或解析 session 时验证 physics timestep 的整数倍关系。 +`create_simulation_runtime("motrixsim", config)`,返回 prepared `runtime.robot` 后显式构造并绑定 ControlSession。 +绑定 ControlSession 时确定控制周期并验证 physics timestep 的整数倍关系。 `MotrixSimRuntime` 持有 `MotrixSimSceneCompiler` 产生的 MSD world、原生 model/data、reset、physics loop 与 SDK `RenderApp` viewer,不借用 MuJoCo runtime,不实例化训练环境。Native robot port 只读状态、缓存控制目标, @@ -1071,7 +1101,7 @@ receive timestamp 与 realtime pacing 使用 monotonic clock。Native viewer 提 ```text motrix_deploy_motrixsim/src/motrix_deploy_motrixsim/ ├── plugin.py # motrixsim entry point;共享 SimulationRuntimeConfig / artifact context -├── runtime.py # native world/model/data、physics、reset 与 ControlSession 调度 +├── runtime.py # native world/model/data、physics、reset 与 Controller 调度 ├── interface.py # semantic sensor binding、query/write、非 owning RobotInterface └── viewer.py # SDK RenderApp 与 viewer-owned KeyboardDevice ``` @@ -1106,7 +1136,7 @@ Hydra 配置的公共执行字段是 artifact、duration_s 和 command;task 不是嵌套配置映射或 Hydra 配置组;场景、physics、sensor_bindings、network_interface、kp、kd 等字段也直接位于 runtime 下。viewer 和 realtime 仅用于仿真,硬件由 runtime 在内部强制实时调度。 application 从 runtime 的可选 keyboard device capability 创建 binding。真机不使用静态确认布尔值, 必须保留 adapter 的启动等待、enable、急停和安全停止流程;默认配置等待操作员按下启动和使能按钮。 -duration_s 换算为控制 tick 上限,不是墙钟超时;程序化 runtime.run(steps=...) 保留确定步数运行。 +duration_s 换算为模型 policy 的控制 tick 预算,不是墙钟超时;程序化创建 Task 时用 steps 设置内部模型决策预算,runtime.run() 不重复接收步数。 具体 task/runtime recipe 属于应用层,由 `motrix_deploy_tasks` 插件安装,提供 flat/rough 场景、机器人和 command 默认值。 `motrix_deploy` 包内保留通用配置;任务 defaults 选择 runtime/sim 或 runtime/hardware 配置组。 @@ -1149,7 +1179,7 @@ deployment-enabled task 必须在 `motrix_deploy_tasks` 提供一个带版本的 标识和 config。profile 单独保留编译环境的 observation/action 维度供导出校验,不写入 task serialization; artifact 的维度以 policy tensor shapes 为唯一来源。compiler 不恢复 policy checkpoint,也不执行 ONNX 导出。 每个 task version 至少有一组 golden state/context/action probe, -同时在训练环境和具体 `DeployTask` 上运行,断言 observation 和 command 数值一致。 +同时在训练环境和具体 `PolicyProcessor` 上运行,断言 observation 和 command 数值一致。 这项一致性检查防止训练环境继续演进后 deployment profile 静默落后。reward、critic observation 和训练噪声 不属于部署 profile;训练框架的 observation normalizer 已由 policy exporter 烘焙进 ONNX,`DeployTask` @@ -1219,7 +1249,7 @@ Go2 vertical slice 的验收基线为:确定性初始化的 1000-tick headless 1. 建立包含通用 CLI 的 `motrix_deploy` library,以及通过 `motrix_deploy.tasks` entry points 提供具体任务类的 `motrix_deploy_tasks` workspace package。 2. 实现公共 contracts、artifact schema/reader/validator 和 component registry。 -3. 实现 `DeployTask` 接口、ONNX `PolicyRuntime` 和直接编码 obs/action 的 `go2_walk/v1`。 +3. 实现 `DeployTask` 接口、ONNX `Policy` 和直接编码 obs/action 的 `go2_walk/v1`。 4. 实现统一 control loop、scheduler、metrics、fake backend 与 contract tests。 5. 为一个现有 `go2-walk-rough/rslrl.ppo` checkpoint 生成可验证 artifact,并完成训练/部署 golden probe。 6. 实现 entry-point MuJoCo backend plugin、SceneCfg backend config,以及 headless/GLFW-viewer deployment run。