diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/events.out.tfevents.1784628548.worker-4.3037675.0 b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/events.out.tfevents.1784628548.worker-4.3037675.0 index ba6657a5c6a2f3b67ff270831ef13f69ca4ae98b..52a98cb5722f1633474e3c8e5ad38b5118212974 100644 --- a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/events.out.tfevents.1784628548.worker-4.3037675.0 +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/events.out.tfevents.1784628548.worker-4.3037675.0 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd6cb7bdaa9f89d3893652f72ea431d6975a18f8f4ff2d1d4d7c14c62d4203dc -size 145620285 +oid sha256:4f76fd3dfdafb8a9daba608d2cbec646c1e75206026d82e065f04656a70d9fae +size 163782720 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_35000.pt b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_35000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e2ec52aafcb6104975b06739f617642740b3e1f1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_35000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac81e504d2c7fedaa03a7d2cd010957b93748dd5f1633286d4704dbbb7dcdee6 +size 125694769 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_36000.pt b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_36000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8a74d3d4a6945a3d742f4845d2a952cedff8687c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_36000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f383fae86efeae40153742686f03e233a19f2a7cdaa6f320a17db7b063bc11a +size 125694769 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_37000.pt b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_37000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a6ea0829590fc03b8b1404f57e6a5fa207ce8690 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_37000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cac29475622ca8c330a29f5dbb932a888695d6267310f9810325a850299fe5ad +size 125694769 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_38000.pt b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_38000.pt new file mode 100644 index 0000000000000000000000000000000000000000..cecbee6cff613713a69e8c9e87164a7f122ce69c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_38000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5acb466818936f28e897c637322a1ba1d3455a09febce389cd1baa0fba67d4a +size 125694769 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_39000.pt b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_39000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4eabd8346896ebad29cb96471e776d24e647e572 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/model_39000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0fe6b36b4f354371c3ea8a42632c1f4b74f1e0a943692b294d324219bc14e6e +size 125694769 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/policy.onnx b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/policy.onnx index aef96885277747e225e9e4998f94b78cf288f1f5..ebcdf7c1b98bf3860cb35c872de0f9120c8d23a0 100644 --- a/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/policy.onnx +++ b/vr_m3_12dof_foothold/2026-07-21_17-08-58_vr_m3_12dof_foothold/policy.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:684e77196cdb14cca6121bc17fb1f7db1eb98c47ada9cd1b23993868e4972d75 +oid sha256:bbbe2f4274184d10b581cf3036cec53d45237638e39ef4cbaf163fe698d76d83 size 18840689 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/events.out.tfevents.1784629198.worker-4.3078255.0 b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/events.out.tfevents.1784629198.worker-4.3078255.0 index 54219c41b035c6f8b282b45ec75c0b829dc1e96d..4c7cb38b65875384b101fba726490217a74f0210 100644 --- a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/events.out.tfevents.1784629198.worker-4.3078255.0 +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/events.out.tfevents.1784629198.worker-4.3078255.0 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:69f28b20e1dd5d35b5b643b82ab4dc40be99a1341015ac45d8978a5bf388b452 -size 175112640 +oid sha256:2a47857e5b6af5b8b7bb766c3ea0d2b24db58dbe254532e319ef760c75d9724b +size 197034855 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_42000.pt b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_42000.pt new file mode 100644 index 0000000000000000000000000000000000000000..341e458323c5ab0776d75f1098dbd33eec9a5d44 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_42000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85425cb924b2f004b0e387756d1463a3545d3c3f2c8593d094ba54e5c3715a9b +size 42038065 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_43000.pt b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_43000.pt new file mode 100644 index 0000000000000000000000000000000000000000..15dcdd3433ea226cbe3fdc974fa93579c2545ad4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_43000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c736615687fa63e177f207f39da3aa1bf40799e0272591378ea97ecb707cf92 +size 42038065 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_44000.pt b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_44000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e19c89fc79f27040f7436349ee1fdc8d300eb5c3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_44000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08db5b7fb2eba33f1d1ff5b686696b57367ad7b7045842e91d76e4c9b2327121 +size 42038065 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_45000.pt b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_45000.pt new file mode 100644 index 0000000000000000000000000000000000000000..57d8f9d381b2a68c94cbf5ca5f29c74c6eb55bbd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_45000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd3e49ec9a519e57d743e13c94fbd475aa40a32a7dafab14a49c9ae3b795cd92 +size 42038065 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_46000.pt b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_46000.pt new file mode 100644 index 0000000000000000000000000000000000000000..dba008773b5200df2785b8b2db673e3e2671777b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/model_46000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1f208ac72f5e8c6a694f87f425f52b501499712a7d19eae61728bd8f42485e2 +size 42038065 diff --git a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/policy.onnx b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/policy.onnx index f7d185cf6a579eca2830bbed3d24c31aface2601..1e3cb778e7f16c955f3eb817492d01dcd3f3e099 100644 --- a/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/policy.onnx +++ b/vr_m3_12dof_foothold/2026-07-21_17-19-47_vr_m3_12dof_foothold/policy.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d278ad6ac34d10de164668c96fd303ce23dfd27aba4064674eede40a8333583 +oid sha256:7789fe632f0f950416d0e8dcb00a5a09520057261af20ded63688357d47bce04 size 4897902 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/events.out.tfevents.1784716148.worker-4.3314176.0 b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/events.out.tfevents.1784716148.worker-4.3314176.0 index 62aa188ff25bed7b8038d9e27023b52e8070e564..142809dd4f03b15d9f0926a1af473518f91f7fe6 100644 --- a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/events.out.tfevents.1784716148.worker-4.3314176.0 +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/events.out.tfevents.1784716148.worker-4.3314176.0 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c402c6c01b0c37a3a7b77e031816998ed77310153a920a53c77facd31b21122 -size 72089610 +oid sha256:77bb14302dd68d0a7c7b204e37f52a3756c6165e8737568c0c6a464079713fa0 +size 92856915 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_18000.pt b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_18000.pt new file mode 100644 index 0000000000000000000000000000000000000000..87c3d16c1cf931350c4441cd6b9095309efff08c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_18000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d619ffa2a25b97ed7b33d1beb784c944bd3cbfb7a4940f14046d1960b65165cb +size 59339569 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_19000.pt b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_19000.pt new file mode 100644 index 0000000000000000000000000000000000000000..cd3a905272b376ac1f9beeca8288f4aba02c4f34 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_19000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4868ad5c135514c4d46d1b5785edb72e6ff45eec2886fbfd1a38ed7e3dbc6a73 +size 59339569 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_20000.pt b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_20000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7f6f782aba2ad6f3ebb4ae545ec02d71e7d7d7bb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_20000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a915b6e8a41f193d2ccde095f1d0c3aad66732a9265fb0153146adfb63bfc8d8 +size 59339569 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_21000.pt b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_21000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a178b7709270a636817992421a37edf2cc660b8a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_21000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea762658bc6b21667aba628b7fcd697edfe52f5e2c9a39281e596e3f489a72a7 +size 59339569 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_22000.pt b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_22000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5b05e539112c8d96389e20815d2908805f732b16 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/model_22000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d5f08d4fab16f06898d3dffa090594517bdc1a73cc4b2fa1c90a70aecc1e41c +size 59339569 diff --git a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/policy.onnx b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/policy.onnx index 7d5a9bb3fef2dd7cec106a0a9ed20432b0bbd9c3..942e2233779720006ba84678212d634da60caf0b 100644 --- a/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/policy.onnx +++ b/vr_m3_12dof_foothold/2026-07-22_17-28-58_vr_m3_12dof_foothold/policy.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67b21439f9069b38e703aae8810f6c4ef28e7a34bd3c36cc849c7347db652776 +oid sha256:943547df8f9a98b4ea3472cbd0b946c6332e6c61961b07beada8c06126b59e18 size 7781488 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/events.out.tfevents.1784803596.worker-4.3966956.0 b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/events.out.tfevents.1784803596.worker-4.3966956.0 new file mode 100644 index 0000000000000000000000000000000000000000..d60fd61a508343aabc64c23ffd9fe0f13a55f5b6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/events.out.tfevents.1784803596.worker-4.3966956.0 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ee65986e5c3855b20a6f22db5c847eb68310a2bf3d7f507dac0b999c3820dfa +size 420480435 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/git/mjlab_perceptive_dwt.diff b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/git/mjlab_perceptive_dwt.diff new file mode 100644 index 0000000000000000000000000000000000000000..f53577859646d145c7add78cdd4ba25f4acaadcf --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/git/mjlab_perceptive_dwt.diff @@ -0,0 +1,47 @@ +--- git commit --- +e65c39ad411f02915c105a9fac46e251d35e3a1d + + +--- git status --- +On branch dev/fdf +Your branch is up to date with 'origin/dev/fdf'. + +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py + +no changes added to commit (use "git add" and/or "git commit -a") + + +--- git diff --- +diff --git a/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py b/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py +index 6dca059..29e7432 100644 +--- a/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py ++++ b/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py +@@ -1590,7 +1590,7 @@ def vr_m3_12dof_foothold_env_cfg(play: bool = False) -> VelocityEnvCfg: + "crop_and_resize": CropAndResizeCfg( + # (top, bottom, left, right), height/2 and centering width/2 + crop_region=(0, 0, 10, 10), +- resize_shape=(30, 30), ++ resize_shape=(7, 7), + ), + "gaussian_blur": GaussianBlurNoiseCfg(kernel_size=3, sigma=1), + "depth_normalization": DepthNormalizationCfg( +@@ -1691,11 +1691,11 @@ def vr_m3_12dof_foothold_env_cfg(play: bool = False) -> VelocityEnvCfg: + cfg.observations["actor"].concatenate_terms = False + cfg.observations["critic"].concatenate_terms = False + +- cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( +- func=envs_mdp.height_scan, +- params={"sensor_name": "terrain_scan", "miss_value": 2.0}, +- clip=(0.0, 2.0), +- ) ++ # cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( ++ # func=envs_mdp.height_scan, ++ # params={"sensor_name": "terrain_scan", "miss_value": 2.0}, ++ # clip=(0.0, 2.0), ++ # ) + + # Privileged critic observation: planner output (body frame). + cfg.observations["critic"].terms["foothold_target"] = ObservationTermCfg( \ No newline at end of file diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/git/vr_rsl_rl.diff b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/git/vr_rsl_rl.diff new file mode 100644 index 0000000000000000000000000000000000000000..7d752229105146469e937c736f4169b4e7cde8e5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/git/vr_rsl_rl.diff @@ -0,0 +1,12 @@ +--- git commit --- +13b0b308e7cd73f7d4188a8a3cde9a98db717e0f + + +--- git status --- +On branch main +Your branch is up to date with 'origin/main'. + +nothing to commit, working tree clean + + +--- git diff --- diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_0.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_0.pt new file mode 100644 index 0000000000000000000000000000000000000000..da4c38b00c0c2350ad535c179e3ddb021fc2c636 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_0.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae06f1067137756b70414709e665db705a8e565f931b950ceeada67e64df7dae +size 30659557 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_1000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_1000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f9a7f6299c57ea6fb256ea2c98948661c9e92c07 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_1000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dcbc6f6b9a1ffbaffa7859fae7605057068d54cbf1f778486e27a40bb5c181f +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_10000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_10000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b972c90a54411829d32104555bbd164b9bccf6d6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_10000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76413733f27ca30650180b790ed6f24342224e902676521d0fd626557968e473 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_100000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_100000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9e25957cfd08554ea4342268d2b0b1d4d059f1e0 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_100000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa152677e2297ee7b58bbcddec593c1235f5b7be451559e7a8465682969559ab +size 30660708 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_11000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_11000.pt new file mode 100644 index 0000000000000000000000000000000000000000..af3951e68751c6b2ff1350f896122c482c9642f7 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_11000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d3d9ebd3d61634a4bd2c3723dd048d903e278528da5b43f8328ca4720014bc9 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_12000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_12000.pt new file mode 100644 index 0000000000000000000000000000000000000000..62a9716b153198e6bfe0dd1764a0242163b8c929 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_12000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e77d5a754fbb9085b499a3c27bb6ac8fe2e6f93034ac76d6cfd4f8d1d9f7d74 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_13000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_13000.pt new file mode 100644 index 0000000000000000000000000000000000000000..26cb09ec78da6a57a165268ff851b476af483af3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_13000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb1a50be60f6f18c0df4b473bef23f6653ff318982494dced80154f9fb09429d +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_14000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_14000.pt new file mode 100644 index 0000000000000000000000000000000000000000..27aebb885c6a7b125b1a33208edbdcfc20cc84f3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_14000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5eaf2b70f8cef64bac2f797fbf6b24d151f711580b0f27f87da832764fade1e4 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_15000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_15000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c4e42815dfff20cf18ffc595ad849111b9ed6a89 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_15000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c786331987b753888f3b9e94138bf808a90546b0dbd7326517895138b19e885 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_16000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_16000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fb80d6c9150a8aef98b3a845e30268f63af4b7fa --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_16000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f7638b094577ecf559f3f93a9c3aa9c18b85cb1bcbbbf09dc441fda6308aeef +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_17000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_17000.pt new file mode 100644 index 0000000000000000000000000000000000000000..27a2b05fad4efdb7809fbfa2e7c247fd7375e153 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_17000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca60bbb0f66569bd018b1a615a2128ed397942253451c40e8e83643048a58516 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_18000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_18000.pt new file mode 100644 index 0000000000000000000000000000000000000000..adbd3fd5633326b190034b0c8ce031c6c6d1e71f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_18000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b67a3558beefe4e7597adc0d7702ef21173c97f76e08a912434896d886c6e51b +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_19000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_19000.pt new file mode 100644 index 0000000000000000000000000000000000000000..2dd582c0e01d254ae6bc7d265d08649fcbf5befb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_19000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4131d2c4ca140efc303e94dc4c530063ca8cbb22720067afe72eb32c3ce090df +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_2000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_2000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7206f525a6d872562777d525357edd285ae5e3af --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_2000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b181e24710e2c61a84ce251d85f9e4dc371cf75be21a9e8cb06d4d054cfd0326 +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_20000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_20000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1412ab0c54806adc6204616b50cb14b2ee7d057c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_20000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5d23103a2e90f8a6972091711090a2da20e11b61adadd19f6bec824246ba419 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_21000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_21000.pt new file mode 100644 index 0000000000000000000000000000000000000000..94988d6697f40ce38218b91407a10033c4060862 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_21000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:177069b673b4e65d258a9b84a19c73bdc9e26e77ff4c6ef04d5c121b62531995 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_22000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_22000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a40992beba91f13d1dbd44c67851673f94a23a50 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_22000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a084f9248b66491fa859251e5165021034933bb435587089fea62a0f124918e +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_23000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_23000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7b24851d7375c87afd2179772a3c6a73b901a615 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_23000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43d898c2b2dd12e02e966e296c15e237f6e0e96e6b69b2d1fc4d752491593374 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_24000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_24000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4d51c79e4b354143c948c779b466154e5950d134 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_24000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7df81dc946bd7a8d85afaae296ea948dbc0af812cb416619d44179275e6c7e0 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_25000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_25000.pt new file mode 100644 index 0000000000000000000000000000000000000000..57d381375d7ec28d5a315fc2b1836a5b9f0d5105 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_25000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f50982df7db2b0e632739729f993107880333732a7515d4476ba3baf589c2dd7 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_26000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_26000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1fc2702ef3563de29516093a7fc34bf8dc7cbcbd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_26000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f761c1f6a654a70078f2c7e67b9f3925e919cd8096bfce8900250a4df58c091 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_27000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_27000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9e844fe23f72f5c28d277cda426fff1a7e5fe627 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_27000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edec30bb14c6c004c0e4b19872784b63d44c383793b92d6c13842dac8086db5f +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_28000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_28000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ff3813fac095ec7691f02f88c899a839ded396ea --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_28000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d9647f784185aca368a482f96b61b81af128c751aa893280886f8a931d07415 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_29000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_29000.pt new file mode 100644 index 0000000000000000000000000000000000000000..78695cfe8ef970c5efc3c589caaf7412cf430597 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_29000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac1c2e4e3d43d07b8de969cc533c2d7e4dcf90c4ed6d0b7ee70ac7460435c274 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_3000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_3000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1f68e8b6eddbce9f92bfb09cdcefcba99e59be3a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_3000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:649215037dc43f9ed290a4be9c63e2a7d4535e0490bf3c0f9cdfad23db9a2971 +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_30000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_30000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ed10209973652655f797579014c0838523408477 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_30000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4ed39826bfadae5dd30af18440d5531a2bd083857f14875a3b1fffca58aff8e +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_31000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_31000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7f9ffabce98437661b92312f6f0e2574e9df9aba --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_31000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a03d9a1fee5fed9b24e8527390ddbb4ea283262a38be3adafef98956464e3ab +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_32000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_32000.pt new file mode 100644 index 0000000000000000000000000000000000000000..eaaab8720cfd6a3c2075322678dc759142107df7 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_32000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b50615b573808f36bada0df7f3687ba57b7c68248538df789fc6e8ef08d0b706 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_33000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_33000.pt new file mode 100644 index 0000000000000000000000000000000000000000..0726bf17667fa8215f12e960ec8c47b2159625ff --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_33000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0884b7144085c3fc2957ef80eab52a1679f22a356427b663a4e1a9afe94d98fd +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_34000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_34000.pt new file mode 100644 index 0000000000000000000000000000000000000000..492fa6624701d06e94d3975fc2a29b71cda85d47 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_34000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb1fa62b95d464400ac5c8f36c65a32d3eb0489534215979a89e7f345a9cb006 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_35000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_35000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b57f7d36b3a79adc355abedff477f54167665a1f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_35000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b11b9a3fe534a889f1b90af8b5b2c1f46c28d1d6eb3d1bc53bb956f6cab28aa4 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_36000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_36000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c0caac7b5d563687c278bb71be5b2278fa1da7c9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_36000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f995d7f11cb84e752eba2f072dac943afb8bb5a939e04f4717742608e956059 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_37000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_37000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8d140e1d287a3adc6f3597b9165fe5f36f25abd8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_37000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8c3b8d189b0b9628662c426e3f2724ece7340a268690bc53385c35ec259b428 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_38000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_38000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b6531d6e45940217dc68f33e35f25883cdec11ca --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_38000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73626cedc3f651afbd71eb1ec6aba6d9fc4f53dbb3c8c9961752592afa25c86c +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_39000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_39000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ed3dad3014e5b1134d06768be4ae6f0dc5e2ec3f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_39000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:027fe5a156d0f55ada67edd5bfd7390e395bb050b3029c8077819f06432167ae +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_4000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_4000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c6eff5619d278d5d774544d5a187027373e0b5cf --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_4000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7f6ec6f9f5284adedac46bab5610df9b211568778d6c94e39f0dd61e71b03a2 +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_40000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_40000.pt new file mode 100644 index 0000000000000000000000000000000000000000..bbb36213a1774871d1215618d8c3da270dcb8494 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_40000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56aa851d87067891ba61e91f5d5d65ff6808da220d27b9f965384824ff0a1b17 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_41000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_41000.pt new file mode 100644 index 0000000000000000000000000000000000000000..dc862c4095e448b91f666e3a77386ef94515dc98 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_41000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e9bef260d6986861fbe6a2b403e4931f220c4f42c2c5609a99cfee63a8a9946 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_42000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_42000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fbec3a34623c652c9aac6ffcd397674a373ab4e5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_42000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c0548833c25162d1e2bfbcc846a23290422bb6f93704c5874eabcafdcf08503 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_43000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_43000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1fa3125fa67ea62aa329d21f44a2c34467f47b49 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_43000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccb1cbb43d2ccaef67ec266876ffdd6ce7567c570ea1ed01f73e240222b1e415 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_44000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_44000.pt new file mode 100644 index 0000000000000000000000000000000000000000..763ea52daa5e7b3945b5d925932aa29dd2b878fe --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_44000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83843921729127d1aea03599d4398223327ec1ec087c8051e476ded96303e85e +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_45000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_45000.pt new file mode 100644 index 0000000000000000000000000000000000000000..53717f2edf3caf2e50cdf0a3be4bc18a8e8efe6c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_45000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:662bfcdc54ae6077b4fbaa22773c026630ce03dc366aa509e064c4ba312a2ac5 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_46000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_46000.pt new file mode 100644 index 0000000000000000000000000000000000000000..47f503f49103f0b08821369212f48d188b28fd0e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_46000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a9c528bca5b6d5ac2c60607adc3567d00b6012867cdc120aafed1496867323b +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_47000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_47000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4075e1e208755f8820355efc99bd50c02e87aa01 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_47000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:375dc74ca4ffc04dd6525e104f8b44ec52a7670575d1be5ccedeadc82decc38e +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_48000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_48000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7de465109ab1a8045c1c2c8fe183797ce945f233 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_48000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1909d8303ec97b80414c0fe25e127d6dc266fc464e036d02be8a66ec01e6b14 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_49000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_49000.pt new file mode 100644 index 0000000000000000000000000000000000000000..507b5d2b569868b4248f0e7d24d03bbad97322e0 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_49000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:816c883e6e3182dd218686dbaa4a424574b25c5e879702bef9fb42fc4a87ede5 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_5000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_5000.pt new file mode 100644 index 0000000000000000000000000000000000000000..425106998f5f9a405138075d6c9f6c02e8cd5bc1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_5000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:350d6189081f37095ed6767be5764c3a4333f2049802aa90e42cca1f1dca735b +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_50000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_50000.pt new file mode 100644 index 0000000000000000000000000000000000000000..aab8e5f587185a6243f53fed3e364d957be6b6e2 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_50000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f98d051a58b9ea4e64a5c6bd23c89b6090e6b9f9bb0375bb36f9b030a360d9c0 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_51000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_51000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3d7e0f258841cda29c62281cdb20ec75f61dac3b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_51000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc96a325030be2d877d81ed53638f978ec5b9590d613412c3a9aefeb71ff17f7 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_52000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_52000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a5285e332c3237268caef9a208d214e8346f1fc4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_52000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d562bf9b0802b11c292ef1c8fac6abe65eeab78d0036e8c998765a3788b37d1 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_53000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_53000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1ba78875cabf973a2ef9bd11e350d65ac1cfd09e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_53000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d234a12fd79ca8d129ccb8ab3c30bebbb3d30cf0da6b520ca1d65d23e7c8ad47 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_54000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_54000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f415eb3144f05711f43e5579c4067fa1d8b85937 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_54000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:060c76107c06aea506e332dc9f28371029bca199f077e0173ea59d8fc4448be4 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_55000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_55000.pt new file mode 100644 index 0000000000000000000000000000000000000000..2f5abc5dc1fa0b5e4e3033bea3d2b604bf0941f1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_55000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76dede81303054fc340b7abb281d6acaab3ae7b582118ba831f496921d49d825 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_56000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_56000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7508cad13f8272d4b4a34e805a699e2ac75483a1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_56000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b270c063307f4218d19ced1831167a96453e228550d8c2e52c277a44f0667cd0 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_57000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_57000.pt new file mode 100644 index 0000000000000000000000000000000000000000..130bfe0d725540e1bacab290dda494f6671745bb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_57000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1bfa905c12021b0652de0884ca825768ade63f1b82731a235d4264da52a73f48 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_58000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_58000.pt new file mode 100644 index 0000000000000000000000000000000000000000..77505b8b23d9e1a03a8dbbe56c77843f25d405b5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_58000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14066d53a407f5279e734fcb8b8b9080837b0c9addb8ba203ae0c98c6ee9d6ca +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_59000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_59000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3cecf4cb7cff73635729b2d134a40624faaa17fc --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_59000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b65ec2379dde8c80ead6948f487363429484f7b225f7a0989015abdeda60f45 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_6000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_6000.pt new file mode 100644 index 0000000000000000000000000000000000000000..79659417188e3ba065e9bd3f806e5936a8735399 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_6000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfab55348d147ec89ae22043a7aa7bf14b86a2e308045a03d45319fcb7720488 +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_60000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_60000.pt new file mode 100644 index 0000000000000000000000000000000000000000..137b9f9623be99913240af1005d4df5b741734d4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_60000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:354c428731aa6b4c64f1ffdc62bb336a6aec8ef7aa9706696eee57502c9d6c45 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_61000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_61000.pt new file mode 100644 index 0000000000000000000000000000000000000000..77d3aaee8d028f2d9c36dda10efb0efcff76f0c9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_61000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ccff8ec8698cbb7b2b70cef784d42984daaabe051a79e3d3b6a15931135cc1b +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_62000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_62000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6fb4d3d14450560e801e9fd42a8a1dbdc7e90b49 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_62000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69c977be4fb8943736bbb519cc00e3023587866e37caaeeffe960de26c708058 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_63000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_63000.pt new file mode 100644 index 0000000000000000000000000000000000000000..82563fc53c14a37863269a850d69602bd7c5dd45 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_63000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1dc1fa6a37d8b9df90193a05ae51f8186f96e54976e7c8e5c805f6b936bf5c9 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_64000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_64000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5439d4e293afb7dc2aeb099c177db7a140cac713 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_64000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7e8d8a103ac35167ea1d689d0d0ce3fc5b98a23b5cbb4831cb4d5bc5e03d333 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_65000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_65000.pt new file mode 100644 index 0000000000000000000000000000000000000000..034aaac1dd225952ab3951a5942f1e926c189610 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_65000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dc10e844b053e2d671270be62a7b9bf9b66630a292394bc5f94a8c9bce03d40 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_66000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_66000.pt new file mode 100644 index 0000000000000000000000000000000000000000..58ac0a2a878ff2ef8358fead4366e7c34d373019 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_66000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef93997b5bed38bf673122fac54aeb5b664d9c4fd8ec5e814e998d02c89c937b +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_67000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_67000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fe0b05d9902b7e911d25d6ee57611c9a69687d4e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_67000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df4ae63833bd5c800f559fb0e5c02677cdee1bbd9d261f7a9548774317421cc4 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_68000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_68000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ac2d105959a3ded8d629915c4dea945e8d094073 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_68000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bc571ee10495e17bcc16447525e84693939dcddeebd2e7b4403a5aa7fd191c3 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_69000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_69000.pt new file mode 100644 index 0000000000000000000000000000000000000000..63f755c08e980d51c0bfaccdfdb6dfe04dd1d1bd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_69000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f361792124de6e9de39680180727a3309a710c6f336dd2fe04b77005c775b22 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_7000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_7000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ea8d27195197d70b7601c24f2f9ff0043940cfbc --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_7000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03f4d04f7155335db1378bb0c4215b57f62e778738c8f6cf3c748dc18e4aa0c8 +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_70000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_70000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ed3c72e476d6508c29be3374051148fd4859e93c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_70000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fba2aa6e015660a604be0cb716637385b8423789e8677fe68e296635fb7868c +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_71000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_71000.pt new file mode 100644 index 0000000000000000000000000000000000000000..df78f1f59705b1aa4f4861986c9bf5a71309e156 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_71000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:243879d426cd427327feb693021101668bba2515d46281668cc6a3c88a1d21b0 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_72000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_72000.pt new file mode 100644 index 0000000000000000000000000000000000000000..07dddad612b54fd8652690c17e3d3893b4ee14f1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_72000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c45188959a4d17a245b8a0fc5e397db4f5938ec4b32054b4a9479823a0ecf3e1 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_73000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_73000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f2ec3b4b99cfcaa0c35482c0d04049541a180cb9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_73000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ee76c9630a0bf897c23b4f23052489b272a12abe68a7fc5a36eaa955ad12591 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_74000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_74000.pt new file mode 100644 index 0000000000000000000000000000000000000000..12d96a53f4b96ebc00f2fad79c5cee322a9a3890 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_74000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65929c37fbec042b93ea3982776c2895f8cc6b8b3ad1f1cfe08fa8232ba5643e +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_75000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_75000.pt new file mode 100644 index 0000000000000000000000000000000000000000..00f722e5f8465198c245de9cb5e196a032aebeef --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_75000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:822ec0c947fbd559a0f0419427bdac05a22c7fdee156df9b26a8ca10cb4dd668 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_76000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_76000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fc51d58f07d1489ac13b94b305f059a10649db36 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_76000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07a0aa34126d7a8feba0199def853c7b6093e750463137cba8a2c0d3de3d4682 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_77000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_77000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7ca254bd5b1716d92d634808dbc604c052897072 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_77000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fbcf90d1f131bbe4058cd80d2ad57d439f86b11bf69541de8ce4a8184cd6d25 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_78000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_78000.pt new file mode 100644 index 0000000000000000000000000000000000000000..0b452f37561ecdff6104efccd7ba8ff69bfc249e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_78000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f13642d2c7f14017773fab5c86b0e4f1800a484a748919bab0fe68b3524e1e26 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_79000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_79000.pt new file mode 100644 index 0000000000000000000000000000000000000000..94e0b9b02d2139a7abb28698e7bb039a8ba09968 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_79000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04a53467824c50228a99c5685b5ea4eb06d21ca2057d6cd32c3b1ab87e350000 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_8000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_8000.pt new file mode 100644 index 0000000000000000000000000000000000000000..11a4984183b9ac5734a71d5f3ecf7e018de32bd2 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_8000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b40caa2e5a10367caef2aef58979c83bf7806cc9828c7172074ee8314119250a +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_80000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_80000.pt new file mode 100644 index 0000000000000000000000000000000000000000..cd70f896b1bdd3ef1858ca5df56d9ca4a1bf600e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_80000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5593aa1dc26d255997c195e2e509f1ba53a7d61e059ec15ef031b4c130cce5f3 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_81000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_81000.pt new file mode 100644 index 0000000000000000000000000000000000000000..18e87b002aac6957ad7a1437527870409fbc9b92 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_81000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78cd3647334b5b744697d2665fe8656e09ccc1fa36ad9f6d750fb7f4d609ebff +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_82000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_82000.pt new file mode 100644 index 0000000000000000000000000000000000000000..838c5985017b77a3ac1714993983ba419949e35e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_82000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8267caaaf3e9309df96505bc82713737747bf164f6bdc3dedff5c2648902a77 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_83000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_83000.pt new file mode 100644 index 0000000000000000000000000000000000000000..cbb013f5298bb8390729e5dd9eac24df9e6d2686 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_83000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0aad56b8f4bbbf7ac02f7e85bcb263933cb4d6b1faa7f0102f3c65cfb95534ef +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_84000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_84000.pt new file mode 100644 index 0000000000000000000000000000000000000000..53581c1f89dda3e43df54ed01bfef2df846257a6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_84000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d960719db7fb975decc232a53c5214b4204c6c6fd6914c5236010f394449cb9 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_85000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_85000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a81a286251c14330bd0aea932e176fe5725c5c27 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_85000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6c5796f807b933f4df3c737bc48f55dfa62a397dbb03d8d83d76c158ed4d2e5 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_86000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_86000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1b86a485b796433a0a4b9b70d11100f7fda82f64 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_86000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb647dfd2d77a361a10b23298809fbaab8212a1d6b8a254a37224119c42854ef +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_87000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_87000.pt new file mode 100644 index 0000000000000000000000000000000000000000..398c2e3ef813e01ffdf5144dddd7d95f76b038ca --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_87000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2dab81987696adf1da44b83ffb8108f1ad92ecbd5d6135528caa5a1ecc9f438 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_88000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_88000.pt new file mode 100644 index 0000000000000000000000000000000000000000..713abf15308894fe9937880daab64d282b90649e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_88000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dc6a1c0f4fe9440035938fe3e93ce7d7bde011b868764cb547199b8605349ea +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_89000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_89000.pt new file mode 100644 index 0000000000000000000000000000000000000000..14385002215ee3b64096b97d786379008ce0faba --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_89000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a43a5e3a0fdf9e925b68f50c8e373a6f333ce4b32a48ae77a1573843aab79791 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_9000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_9000.pt new file mode 100644 index 0000000000000000000000000000000000000000..bbe500bea5b9b223aa6dc30dbb90c42e46a3109a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_9000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6cde5923d7a7515197cdf30eb0bbfe76503eff65660bceb1fb8617033027dae +size 30660350 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_90000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_90000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a3ad3cff9a64a95c78288d99f748e7b683c07eab --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_90000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:913062ba6cf903a3b1fc212526a4b2065ce86720415e5347b2e6f03951a3ae19 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_91000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_91000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c318582507af9ca1a50e3b1d74b04857ac540193 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_91000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ab5ed8f44bcddc02a65e7d1714ddbc3f6641f05c947150daf8b5971a39f08ef +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_92000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_92000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b93e6492da3e1561bfd7808b6fe07111d4acbe08 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_92000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04b04728d7620e2e17b00479ab1557ee681dd6f0a413aad337fab16bc7671e59 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_93000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_93000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1da8bba87391313dbee45e7510528cb62916f8a6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_93000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89282c4ad586d4f949567940682e5e5895c1e6b95d1f85e9b848470dbdae635c +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_94000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_94000.pt new file mode 100644 index 0000000000000000000000000000000000000000..63e1cd2453cb1a88a3ef4949f357179388153f97 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_94000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ac922c27cc3661bb160b3ac9289da695aa7d4c0d77e2bd3dcaa15eb9b1860d7 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_95000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_95000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3a13dcc6e3f40820fb6d0eeb48f4f0dfbab6ef8f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_95000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c653ecd6fd9ea98ec862494deef259be690cbedd2ac3b3bce60baec46a3a715c +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_96000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_96000.pt new file mode 100644 index 0000000000000000000000000000000000000000..35fc85f4898576b036269e93597e5b79d1804ba0 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_96000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e133ac134ec1cc6b5f575e355f617c6579e4fc3407ca1b7497670c015ae924f9 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_97000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_97000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a0d75ffc205db171165a2028d031e6ad9fd32c96 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_97000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c6b52f92b9eff2381d2ee6cfe950eff4a8553e7e7a3af43ce2e11a558ac1ac8 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_98000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_98000.pt new file mode 100644 index 0000000000000000000000000000000000000000..31a21801a8efedc39ff85dcc3a4d21b07a288ddd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_98000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b20269dcbc0bb8153a6e16ee4a6d64cf14e6da9947d0975b07de81a2c740e4fe +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_99000.pt b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_99000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a387764d9f76bbdac8e917d6f904a645307919ee --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/model_99000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:528fdbe01fd2926c9435783785f4c598779ba188aaee3984160f71def6722ee1 +size 30660529 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/agent.yaml b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/agent.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6dfb919242fb5760e45c65147d32d365a3dd5cf9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/agent.yaml @@ -0,0 +1,138 @@ +seed: 42 +num_steps_per_env: 24 +max_iterations: 100001 +obs_groups: + actor: + - base_ang_vel + - projected_gravity + - velocity_commands + - joint_pos_rel + - joint_vel_rel + - last_action + - gait_phase + - depth_image + critic: + - base_ang_vel + - projected_gravity + - velocity_commands + - joint_pos_rel + - joint_vel_rel + - last_action + - gait_phase + - base_lin_vel + - true_base_velocity + - foot_height + - foot_air_time + - foot_contact + - foot_contact_forces + - knee_reference + - foothold_target + - depth_image +save_interval: 1000 +experiment_name: vr_m3_12dof_foothold +run_name: vr_m3_12dof_foothold +logger: wandb +wandb_project: vr_m3_12dof +wandb_tags: !!python/tuple [] +resume: false +load_run: .* +load_checkpoint: model_.*.pt +clip_actions: null +upload_model: true +class_name: OnPolicyRunner +actor: + hidden_dims: !!python/tuple + - 1024 + - 512 + - 256 + - 128 + activation: elu + obs_normalization: true + cnn_cfg: + output_channels: !!python/tuple + - 32 + - 32 + kernel_size: !!python/tuple + - 3 + - 3 + stride: !!python/tuple + - 1 + - 1 + dilation: !!python/tuple + - 1 + - 1 + padding: 1 + padding_mode: replicate + norm: none + activation: relu + max_pool: false + max_pool_kernel_size: 3 + max_pool_stride: 2 + max_pool_padding: 0 + global_pool: none + head_output_dim: 64 + head_hidden_dims: + - 128 + - 64 + head_activation: relu + head_last_activation: relu + distribution_cfg: + init_std: 1.0 + std_type: scalar +critic: + hidden_dims: !!python/tuple + - 1024 + - 512 + - 256 + - 128 + activation: elu + obs_normalization: true + cnn_cfg: + output_channels: !!python/tuple + - 32 + - 32 + kernel_size: !!python/tuple + - 3 + - 3 + stride: !!python/tuple + - 1 + - 1 + dilation: !!python/tuple + - 1 + - 1 + padding: 1 + padding_mode: replicate + norm: none + activation: relu + max_pool: false + max_pool_kernel_size: 3 + max_pool_stride: 2 + max_pool_padding: 0 + global_pool: none + head_output_dim: 64 + head_hidden_dims: + - 128 + - 64 + head_activation: relu + head_last_activation: relu + distribution_cfg: + init_std: 1.0 + std_type: scalar +algorithm: + num_learning_epochs: 5 + num_mini_batches: 4 + learning_rate: 0.001 + schedule: adaptive + gamma: 0.99 + lam: 0.95 + entropy_coef: 0.005 + desired_kl: 0.01 + max_grad_norm: 1.0 + value_loss_coef: 1.0 + use_clipped_value_loss: true + clip_param: 0.2 + normalize_advantage_per_mini_batch: false + optimizer: adam + rnd_cfg: null + symmetry_cfg: null +multi_gpu: null diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/deploy.yaml b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/deploy.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e9baf3a3bdd55aa2eb0ad7e68553f68865d0b94c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/deploy.yaml @@ -0,0 +1,92 @@ +joint_name: [left_hip_pitch_joint, left_hip_roll_joint, left_hip_yaw_joint, left_knee_pitch_joint, + left_ankle_pitch_joint, left_ankle_roll_joint, right_hip_pitch_joint, right_hip_roll_joint, + right_hip_yaw_joint, right_knee_pitch_joint, right_ankle_pitch_joint, right_ankle_roll_joint] +joint_ids_map: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +step_dt: 0.02 +stiffness: [150.0, 150.0, 120.0, 200.0, 200.0, 200.0, 150.0, 150.0, 120.0, 200.0, + 200.0, 200.0] +damping: [25.0, 25.0, 4.0, 10.0, 8.0, 8.0, 25.0, 25.0, 4.0, 10.0, 8.0, 8.0] +default_joint_pos: [-0.1, 0.0, 0.0, 0.2, -0.1, 0.0, -0.1, 0.0, 0.0, 0.2, -0.1, 0.0] +commands: + twist: + ranges: + lin_vel_x: [0.0, 1.0] + lin_vel_y: [0.0, 0.0] + ang_vel_z: [-0.5, 0.5] + heading: null +actions: + JointPositionAction: + clip: null + scale: [0.6, 0.6, 0.271, 0.45, 0.15, 0.15, 0.6, 0.6, 0.271, 0.45, 0.15, 0.15] + offset: [-0.1, 0.0, 0.0, 0.2, -0.1, 0.0, -0.1, 0.0, 0.0, 0.2, -0.1, 0.0] + joint_names: [.*] + joint_ids: null +observations: + base_ang_vel: + params: {sensor_name: robot/imu_ang_vel} + clip: null + scale: [0.25, 0.25, 0.25] + history_length: 5 + projected_gravity: + params: {} + clip: null + scale: [1.0, 1.0, 1.0] + history_length: 5 + velocity_commands: + params: {command_name: twist} + clip: null + scale: [1.0, 1.0, 1.0] + history_length: 5 + joint_pos_rel: + params: {} + clip: null + scale: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + history_length: 5 + joint_vel_rel: + params: {} + clip: null + scale: [0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05] + history_length: 5 + last_action: + params: {} + clip: null + scale: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] + history_length: 5 + gait_phase: + params: {period: 0.9, command_name: twist} + clip: null + scale: [1.0, 1.0] + history_length: 5 + depth_image: + params: + data_type: distance_to_image_plane_noised_history + sensor_cfg: + name: camera + joint_names: null + joint_ids: !!python/object/apply:builtins.slice [null, null, null] + body_names: null + body_ids: !!python/object/apply:builtins.slice [null, null, null] + geom_names: null + geom_ids: !!python/object/apply:builtins.slice [null, null, null] + site_names: null + site_ids: !!python/object/apply:builtins.slice [null, null, null] + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice [null, null, null] + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice [null, null, null] + camera_names: null + camera_ids: !!python/object/apply:builtins.slice [null, null, null] + light_names: null + light_ids: !!python/object/apply:builtins.slice [null, null, null] + material_names: null + material_ids: !!python/object/apply:builtins.slice [null, null, null] + pair_names: null + pair_ids: !!python/object/apply:builtins.slice [null, null, null] + preserve_order: false + history_skip_frames: 5 + num_output_frames: 4 + delayed_frame_ranges: [0, 1] + debug_vis: false + clip: null + scale: [1.0, 1.0, 1.0, 1.0] + history_length: 1 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/env.yaml b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/env.yaml new file mode 100644 index 0000000000000000000000000000000000000000..06a78c709191b057eeed976065e6d39466878122 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/env.yaml @@ -0,0 +1,3768 @@ +decimation: 4 +scene: + num_envs: 1024 + env_spacing: 2.0 + terrain: + init_state: + pos: !!python/tuple + - 0.0 + - 0.0 + - 0.0 + rot: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.0 + lin_vel: !!python/tuple + - 0.0 + - 0.0 + - 0.0 + ang_vel: !!python/tuple + - 0.0 + - 0.0 + - 0.0 + joint_pos: + .*: 0.0 + joint_vel: + .*: 0.0 + spec_fn: !!python/name:mjlab.entity.entity.%3Clambda%3E '' + articulation: null + sort_actuators: false + lights: !!python/tuple + - name: sun + body: world + mode: fixed + target: null + type: directional + castshadow: true + pos: !!python/tuple + - 0.0 + - 0.0 + - 1.5 + dir: !!python/tuple + - 0.0 + - 0.0 + - -1.0 + cutoff: 45.0 + exponent: 10.0 + cameras: !!python/tuple [] + textures: !!python/tuple + - name: groundplane + type: 2d + builtin: checker + rgb1: !!python/tuple + - 0.2 + - 0.3 + - 0.4 + rgb2: !!python/tuple + - 0.1 + - 0.2 + - 0.3 + width: 300 + height: 300 + mark: edge + markrgb: !!python/tuple + - 0.8 + - 0.8 + - 0.8 + materials: !!python/tuple + - name: groundplane + rgba: !!python/tuple + - 1.0 + - 1.0 + - 1.0 + - 1.0 + texuniform: true + texrepeat: !!python/tuple + - 4.0 + - 4.0 + reflectance: 0.2 + texture: groundplane + geom_names_expr: !!python/tuple + - terrain$ + collisions: !!python/tuple [] + terrain_type: generator + terrain_generator: + seed: null + curriculum: true + size: !!python/tuple + - 8.0 + - 8.0 + border_width: 1.0 + border_height: 1.0 + num_rows: 10 + num_cols: 14 + color_scheme: height + sub_terrains: + flat: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: null + pyramid_stairs: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 20 + patch_radius: 0.15 + max_height_diff: 0.02 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + border_width: 1.0 + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width: 0.3 + platform_width: 3.0 + holes: false + pyramid_stairs_med: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 20 + patch_radius: 0.15 + max_height_diff: 0.02 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + border_width: 1.0 + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width: 0.45 + platform_width: 3.0 + holes: false + pyramid_stairs_wide: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 20 + patch_radius: 0.15 + max_height_diff: 0.02 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + border_width: 1.0 + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width: 0.6 + platform_width: 3.0 + holes: false + pyramid_stairs_inv: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 20 + patch_radius: 0.15 + max_height_diff: 0.02 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + border_width: 1.0 + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width: 0.3 + platform_width: 3.0 + holes: false + pyramid_stairs_inv_med: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 20 + patch_radius: 0.15 + max_height_diff: 0.02 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + border_width: 1.0 + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width: 0.45 + platform_width: 3.0 + holes: false + pyramid_stairs_inv_wide: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 20 + patch_radius: 0.15 + max_height_diff: 0.02 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + border_width: 1.0 + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width: 0.6 + platform_width: 3.0 + holes: false + open_stairs_pyramid: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: null + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width_range: !!python/tuple + - 0.3 + - 0.6 + platform_width: 3.0 + border_width: 1.0 + step_thickness: 0.05 + inverted: false + open_stairs_bowl: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: null + step_height_range: !!python/tuple + - 0.05 + - 0.2 + step_width_range: !!python/tuple + - 0.3 + - 0.6 + platform_width: 3.0 + border_width: 1.0 + step_thickness: 0.05 + inverted: true + hf_pyramid_slope: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: null + slope_range: !!python/tuple + - 0.0 + - 0.4 + platform_width: 2.0 + inverted: false + border_width: 0.25 + horizontal_scale: 0.2 + vertical_scale: 0.005 + base_thickness_ratio: 1.0 + hf_pyramid_slope_inv: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: null + slope_range: !!python/tuple + - 0.0 + - 0.4 + platform_width: 2.0 + inverted: true + border_width: 0.25 + horizontal_scale: 0.2 + vertical_scale: 0.005 + base_thickness_ratio: 1.0 + stepping_stones: + proportion: 0.1 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: + target: + num_patches: 30 + patch_radius: 0.2 + max_height_diff: 0.03 + x_range: !!python/tuple + - -1000000.0 + - 1000000.0 + y_range: !!python/tuple + - -1000000.0 + - 1000000.0 + z_range: !!python/tuple + - -1000000.0 + - 1000000.0 + grid_resolution: null + stone_size_range: !!python/tuple + - 0.4 + - 0.8 + stone_distance_range: !!python/tuple + - 0.2 + - 0.5 + stone_height: 0.2 + stone_height_variation: 0.05 + stone_size_variation: 0.1 + floor_depth: 2.0 + displacement_range: 0.1 + platform_width: 1.0 + border_width: 0.0 + uniform_noise: + proportion: 0.15 + size: !!python/tuple + - 8.0 + - 8.0 + flat_patch_sampling: null + noise_range: !!python/tuple + - 0.02 + - 0.1 + noise_step: 0.02 + downsampled_scale: null + horizontal_scale: 0.1 + vertical_scale: 0.005 + base_thickness_ratio: 1.0 + border_width: 0.25 + difficulty_range: !!python/tuple + - 0.0 + - 1.0 + add_lights: true + env_spacing: 2.0 + max_init_terrain_level: 5 + num_envs: 1024 + entities: + robot: + init_state: + pos: !!python/tuple + - 0 + - 0 + - 0.9 + rot: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.0 + lin_vel: !!python/tuple + - 0.0 + - 0.0 + - 0.0 + ang_vel: !!python/tuple + - 0.0 + - 0.0 + - 0.0 + joint_pos: + .*_hip_pitch_joint: -0.1 + .*_hip_roll_joint: 0.0 + .*_hip_yaw_joint: 0.0 + .*_knee_pitch_joint: 0.2 + .*_ankle_pitch_joint: -0.1 + .*_ankle_roll_joint: 0.0 + joint_vel: + .*: 0.0 + spec_fn: !!python/name:src.assets.robots.vr_m3.vr_m3_12dof_constants.get_spec '' + articulation: + actuators: !!python/tuple + - target_names_expr: !!python/tuple + - .*_hip_pitch_joint + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + armature: 0.1404 + frictionloss: 0.1 + viscous_damping: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + stiffness: 150.0 + damping: 25.0 + effort_limit: 360.0 + - target_names_expr: !!python/tuple + - .*_hip_roll_joint + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + armature: 0.1404 + frictionloss: 0.1 + viscous_damping: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + stiffness: 150.0 + damping: 25.0 + effort_limit: 360.0 + - target_names_expr: !!python/tuple + - .*_hip_yaw_joint + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + armature: 0.02864 + frictionloss: 0.1 + viscous_damping: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + stiffness: 120.0 + damping: 4.0 + effort_limit: 130.0 + - target_names_expr: !!python/tuple + - .*_knee_pitch_joint + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + armature: 0.1404 + frictionloss: 0.1 + viscous_damping: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + stiffness: 200.0 + damping: 10.0 + effort_limit: 360.0 + - target_names_expr: !!python/tuple + - .*_ankle_pitch_joint + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + armature: 0.03006 + frictionloss: 0.1 + viscous_damping: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + stiffness: 200.0 + damping: 8.0 + effort_limit: 120.0 + - target_names_expr: !!python/tuple + - .*_ankle_roll_joint + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + armature: 0.03006 + frictionloss: 0.1 + viscous_damping: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + stiffness: 200.0 + damping: 8.0 + effort_limit: 120.0 + soft_joint_pos_limit_factor: 0.9 + sort_actuators: false + lights: !!python/tuple [] + cameras: !!python/tuple [] + textures: !!python/tuple [] + materials: !!python/tuple [] + collisions: !!python/tuple + - geom_names_expr: !!python/tuple + - .*_collision_\d+ + contype: 1 + conaffinity: 1 + condim: + ^(left|right)_ankle_roll_link_collision_\d+$: 3 + .*_collision_\d+: 1 + priority: + ^(left|right)_ankle_roll_link_collision_\d+$: 1 + friction: + ^(left|right)_ankle_roll_link_collision_\d+$: !!python/tuple + - 0.6 + solref: null + solimp: null + margin: null + gap: null + solmix: null + disable_other_geoms: true + sensors: !!python/tuple + - name: feet_ground_contact + primary: + mode: subtree + pattern: ^(left_ankle_roll_link|right_ankle_roll_link)$ + entity: robot + exclude: !!python/tuple [] + secondary: + mode: body + pattern: terrain + entity: null + exclude: !!python/tuple [] + fields: !!python/tuple + - found + - force + reduce: netforce + num_slots: 1 + secondary_policy: first + track_air_time: true + global_frame: false + history_length: 4 + debug: false + - name: self_collision + primary: + mode: subtree + pattern: pelvis + entity: robot + exclude: !!python/tuple [] + secondary: + mode: subtree + pattern: pelvis + entity: robot + exclude: !!python/tuple [] + fields: !!python/tuple + - found + - force + reduce: none + num_slots: 1 + secondary_policy: first + track_air_time: false + global_frame: false + history_length: 4 + debug: false + - name: pelvis_height_measure + frame: + type: body + name: pelvis + entity: robot + pattern: + size: !!python/tuple + - 0.0 + - 0.0 + resolution: 0.1 + direction: !!python/tuple + - 0.0 + - 0.0 + - -1.0 + ray_alignment: yaw + max_distance: 2.0 + exclude_parent_body: true + include_geom_groups: !!python/tuple + - 0 + debug_vis: false + viz: + hit_color: !!python/tuple + - 0.0 + - 1.0 + - 0.0 + - 0.8 + miss_color: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.4 + hit_sphere_color: !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + hit_sphere_radius: 0.5 + show_rays: false + show_normals: false + normal_color: !!python/tuple + - 1.0 + - 1.0 + - 0.0 + - 1.0 + normal_length: 5.0 + - name: left_height_scanner + frame: + type: site + name: left_foot + entity: robot + pattern: + size: !!python/tuple + - 0.0 + - 0.0 + resolution: 0.1 + direction: !!python/tuple + - 0.0 + - 0.0 + - -1.0 + ray_alignment: yaw + max_distance: 1.0 + exclude_parent_body: true + include_geom_groups: !!python/tuple + - 0 + debug_vis: false + viz: + hit_color: !!python/tuple + - 0.0 + - 1.0 + - 0.0 + - 0.8 + miss_color: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.4 + hit_sphere_color: !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + hit_sphere_radius: 0.5 + show_rays: false + show_normals: false + normal_color: !!python/tuple + - 1.0 + - 1.0 + - 0.0 + - 1.0 + normal_length: 5.0 + - name: right_height_scanner + frame: + type: site + name: right_foot + entity: robot + pattern: + size: !!python/tuple + - 0.0 + - 0.0 + resolution: 0.1 + direction: !!python/tuple + - 0.0 + - 0.0 + - -1.0 + ray_alignment: yaw + max_distance: 1.0 + exclude_parent_body: true + include_geom_groups: !!python/tuple + - 0 + debug_vis: false + viz: + hit_color: !!python/tuple + - 0.0 + - 1.0 + - 0.0 + - 0.8 + miss_color: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.4 + hit_sphere_color: !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + hit_sphere_radius: 0.5 + show_rays: false + show_normals: false + normal_color: !!python/tuple + - 1.0 + - 1.0 + - 0.0 + - 1.0 + normal_length: 5.0 + - name: terrain_scan + frame: + type: body + name: pelvis + entity: robot + pattern: + size: !!python/tuple + - 1.8 + - 1.2 + resolution: 0.05 + direction: !!python/tuple + - 0.0 + - 0.0 + - -1.0 + ray_alignment: yaw + max_distance: 2.0 + exclude_parent_body: true + include_geom_groups: !!python/tuple + - 0 + debug_vis: false + viz: + hit_color: !!python/tuple + - 0.0 + - 1.0 + - 0.0 + - 0.8 + miss_color: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.4 + hit_sphere_color: !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + hit_sphere_radius: 0.5 + show_rays: false + show_normals: true + normal_color: !!python/tuple + - 1.0 + - 1.0 + - 0.0 + - 1.0 + normal_length: 5.0 + - name: camera + frame: + type: body + name: pelvis + entity: robot + pattern: + width: 80 + height: 60 + fovy: 63.668103675039276 + _camera_name: null + ray_alignment: base + max_distance: 2.5 + exclude_parent_body: false + include_geom_groups: !!python/tuple + - 0 + - 1 + - 2 + debug_vis: false + viz: + hit_color: !!python/tuple + - 0.0 + - 1.0 + - 0.0 + - 0.8 + miss_color: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 0.4 + hit_sphere_color: !!python/tuple + - 0.0 + - 1.0 + - 1.0 + - 1.0 + hit_sphere_radius: 0.5 + show_rays: false + show_normals: false + normal_color: !!python/tuple + - 1.0 + - 1.0 + - 0.0 + - 1.0 + normal_length: 5.0 + class_type: !!python/name:instinct_mj.sensors.noisy_camera.noisy_grouped_raycaster_camera.NoisyGroupedRayCasterCamera '' + min_distance: 0.1 + mesh_prim_paths: [] + aux_mesh_and_link_names: {} + mesh_filter_max_hops: 24 + mesh_filter_epsilon: 0.0001 + offset: + pos: !!python/tuple + - 0.0 + - 0.018 + - -0.1 + rot: !!python/tuple + - 0.8660254037844387 + - 0.0 + - 0.49999999999999994 + - 0.0 + convention: world + data_types: + - distance_to_image_plane + update_period: 0.03333333333333333 + depth_clipping_behavior: max + focal_length: 1.0 + horizontal_aperture: 1.6555983034386739 + vertical_aperture: 1.2416987275790055 + horizontal_aperture_offset: 0.0 + vertical_aperture_offset: 0.0 + visualizer_cfg: + prim_path: /Visuals/RayCaster + markers: + hit: !!python/object/apply:types.SimpleNamespace + state: + radius: 0.02 + color: !!python/tuple + - 1.0 + - 0.0 + - 0.0 + - 1.0 + frame: !!python/object/apply:types.SimpleNamespace + state: + scale: !!python/tuple + - 0.1 + - 0.1 + - 0.1 + noise_pipeline: + crop_and_resize: + func: !!python/name:instinct_mj.utils.noise.noise_model.crop_and_resize '' + device: cuda:0 + crop_region: !!python/tuple + - 0 + - 0 + - 10 + - 10 + resize_shape: !!python/tuple + - 7 + - 7 + gaussian_blur: + func: !!python/name:instinct_mj.utils.noise.noise_model.gaussian_blur_noise '' + device: cuda:0 + kernel_size: 3 + sigma: 1 + depth_normalization: + func: !!python/name:instinct_mj.utils.noise.noise_model.depth_normalization '' + device: cuda:0 + depth_range: !!python/tuple + - 0.0 + - 2.5 + normalize: true + output_range: !!python/tuple + - 0.0 + - 1.0 + data_histories: + distance_to_image_plane_noised: 17 + - name: undesired_contact_forces + primary: + mode: body + pattern: .* + entity: robot + exclude: !!python/tuple + - left_ankle_roll_link + - right_ankle_roll_link + secondary: null + fields: !!python/tuple + - found + - force + reduce: netforce + num_slots: 1 + secondary_policy: first + track_air_time: false + global_frame: false + history_length: 3 + debug: false + extent: 2.0 + spec_fn: null +observations: + critic: + terms: + base_ang_vel: + func: &id001 !!python/name:mjlab.envs.mdp.observations.builtin_sensor '' + params: + sensor_name: robot/imu_ang_vel + noise: + operation: add + _tensor_cache: {} + n_min: -0.25 + n_max: 0.25 + clip: null + scale: 0.25 + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + projected_gravity: + func: &id002 !!python/name:mjlab.envs.mdp.observations.projected_gravity '' + params: {} + noise: + operation: add + _tensor_cache: {} + n_min: -0.05 + n_max: 0.05 + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + velocity_commands: + func: &id003 !!python/name:mjlab.envs.mdp.observations.generated_commands '' + params: + command_name: twist + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + joint_pos_rel: + func: &id004 !!python/name:mjlab.envs.mdp.observations.joint_pos_rel '' + params: {} + noise: + operation: add + _tensor_cache: {} + n_min: -0.05 + n_max: 0.05 + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + joint_vel_rel: + func: &id005 !!python/name:mjlab.envs.mdp.observations.joint_vel_rel '' + params: {} + noise: + operation: add + _tensor_cache: {} + n_min: -1.5 + n_max: 1.5 + clip: null + scale: 0.05 + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + last_action: + func: &id006 !!python/name:mjlab.envs.mdp.observations.last_action '' + params: {} + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + gait_phase: + func: &id007 !!python/name:src.tasks.velocity.mdp.observations.phase '' + params: + period: 0.9 + command_name: twist + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + base_lin_vel: + func: *id001 + params: + sensor_name: robot/imu_lin_vel + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + true_base_velocity: + func: !!python/name:mjlab.envs.mdp.observations.base_lin_vel '' + params: {} + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + foot_height: + func: !!python/name:src.tasks.velocity.mdp.observations.foot_height '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: !!python/tuple + - left_foot + - right_foot + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + foot_air_time: + func: !!python/name:src.tasks.velocity.mdp.observations.foot_air_time '' + params: + sensor_name: feet_ground_contact + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + foot_contact: + func: !!python/name:src.tasks.velocity.mdp.observations.foot_contact '' + params: + sensor_name: feet_ground_contact + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + foot_contact_forces: + func: !!python/name:src.tasks.velocity.mdp.observations.foot_contact_forces '' + params: + sensor_name: feet_ground_contact + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + knee_reference: + func: !!python/name:src.tasks.velocity.mdp.rewards.get_desired_knee_angle '' + params: + period: 0.9 + offset: + - 0.0 + - 0.5 + command_name: twist + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + foothold_target: + func: !!python/name:src.tasks.velocity.mdp.observations.foothold_target '' + params: + command_name: foothold + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 0 + flatten_history_dim: true + depth_image: + func: &id008 !!python/name:instinct_mj.envs.mdp.observations.exteroception.delayed_visualizable_image '' + params: + data_type: distance_to_image_plane_noised_history + sensor_cfg: + name: camera + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + history_skip_frames: 5 + num_output_frames: 4 + delayed_frame_ranges: !!python/tuple + - 0 + - 1 + debug_vis: false + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 0 + flatten_history_dim: true + concatenate_terms: false + concatenate_dim: -1 + enable_corruption: false + history_length: null + flatten_history_dim: true + nan_policy: sanitize + nan_check_per_term: true + actor: + terms: + base_ang_vel: + func: *id001 + params: + sensor_name: robot/imu_ang_vel + noise: + operation: add + _tensor_cache: {} + n_min: -0.25 + n_max: 0.25 + clip: null + scale: 0.25 + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + projected_gravity: + func: *id002 + params: {} + noise: + operation: add + _tensor_cache: {} + n_min: -0.05 + n_max: 0.05 + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + velocity_commands: + func: *id003 + params: + command_name: twist + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + joint_pos_rel: + func: *id004 + params: {} + noise: + operation: add + _tensor_cache: {} + n_min: -0.05 + n_max: 0.05 + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + joint_vel_rel: + func: *id005 + params: {} + noise: + operation: add + _tensor_cache: {} + n_min: -1.5 + n_max: 1.5 + clip: null + scale: 0.05 + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + last_action: + func: *id006 + params: {} + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + gait_phase: + func: *id007 + params: + period: 0.9 + command_name: twist + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 5 + flatten_history_dim: true + depth_image: + func: *id008 + params: + data_type: distance_to_image_plane_noised_history + sensor_cfg: + name: camera + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + history_skip_frames: 5 + num_output_frames: 4 + delayed_frame_ranges: !!python/tuple + - 0 + - 1 + debug_vis: false + noise: null + clip: null + scale: null + delay_min_lag: 0 + delay_max_lag: 0 + delay_per_env: true + delay_hold_prob: 0.0 + delay_update_period: 0 + delay_per_env_phase: true + history_length: 0 + flatten_history_dim: true + concatenate_terms: false + concatenate_dim: -1 + enable_corruption: true + history_length: null + flatten_history_dim: true + nan_policy: sanitize + nan_check_per_term: true +actions: + joint_pos: + entity_name: robot + clip: null + transmission_type: !!python/object/apply:mjlab.actuator.actuator.TransmissionType + - joint + actuator_names: !!python/tuple + - .* + scale: + .*_hip_pitch_joint: 0.6 + .*_hip_roll_joint: 0.6 + .*_hip_yaw_joint: 0.2708333333333333 + .*_knee_pitch_joint: 0.45 + .*_ankle_pitch_joint: 0.15 + .*_ankle_roll_joint: 0.15 + offset: 0.0 + preserve_order: false + use_default_offset: true +events: + reset_base: + func: !!python/name:mjlab.envs.mdp.events.reset_root_state_uniform '' + params: + pose_range: + x: !!python/tuple + - -0.5 + - 0.5 + y: !!python/tuple + - -0.5 + - 0.5 + z: !!python/tuple + - 0.0 + - 0.0 + yaw: !!python/tuple + - -3.14 + - 3.14 + mode: reset + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + reset_robot_joints: + func: !!python/name:mjlab.envs.mdp.events.reset_joints_by_offset '' + params: + position_range: !!python/tuple + - -0.1 + - 0.1 + velocity_range: !!python/tuple + - -0.5 + - 0.5 + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + mode: reset + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + push_robot: + func: !!python/name:mjlab.envs.mdp.events.push_by_setting_velocity '' + params: + velocity_range: + x: !!python/tuple + - -0.5 + - 0.5 + y: !!python/tuple + - -0.5 + - 0.5 + z: !!python/tuple + - -0.4 + - 0.4 + roll: !!python/tuple + - -0.52 + - 0.52 + pitch: !!python/tuple + - -0.52 + - 0.52 + yaw: !!python/tuple + - -0.78 + - 0.78 + mode: interval + interval_range_s: !!python/tuple + - 5.0 + - 6.0 + is_global_time: false + min_step_count_between_reset: 0 + foot_friction: + func: !!python/name:mjlab.envs.mdp.dr.geom.geom_friction '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: !!python/tuple + - left_ankle_roll_link_collision_1 + - left_ankle_roll_link_collision_2 + - left_ankle_roll_link_collision_3 + - left_ankle_roll_link_collision_4 + - left_ankle_roll_link_collision_5 + - left_ankle_roll_link_collision_6 + - left_ankle_roll_link_collision_7 + - left_ankle_roll_link_collision_8 + - left_ankle_roll_link_collision_9 + - left_ankle_roll_link_collision_10 + - right_ankle_roll_link_collision_1 + - right_ankle_roll_link_collision_2 + - right_ankle_roll_link_collision_3 + - right_ankle_roll_link_collision_4 + - right_ankle_roll_link_collision_5 + - right_ankle_roll_link_collision_6 + - right_ankle_roll_link_collision_7 + - right_ankle_roll_link_collision_8 + - right_ankle_roll_link_collision_9 + - right_ankle_roll_link_collision_10 + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: abs + ranges: !!python/tuple + - 0.3 + - 1.6 + shared_random: true + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + encoder_bias: + func: !!python/name:mjlab.envs.mdp.dr.joint.encoder_bias '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + bias_range: !!python/tuple + - -0.015 + - 0.015 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + base_com: + func: &id009 !!python/name:mjlab.envs.mdp.dr.body.body_com_offset '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - waist_yaw_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: add + ranges: + 0: !!python/tuple + - -0.05 + - 0.05 + 1: !!python/tuple + - -0.05 + - 0.05 + 2: !!python/tuple + - -0.05 + - 0.05 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + body_com: + func: *id009 + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - ^(?!waist_yaw_link$).* + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: add + ranges: + 0: !!python/tuple + - -0.03 + - 0.03 + 1: !!python/tuple + - -0.03 + - 0.03 + 2: !!python/tuple + - -0.03 + - 0.03 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + base_mass: + func: &id010 !!python/name:mjlab.envs.mdp.dr.body.body_mass '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - waist_yaw_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: add + ranges: !!python/tuple + - -4.0 + - 4.0 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + body_mass: + func: *id010 + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - ^(?!waist_yaw_link$).* + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + ranges: !!python/tuple + - 0.9 + - 1.1 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_actuator_gains: + func: !!python/name:mjlab.envs.mdp.dr.actuator.pd_gains '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + kp_range: !!python/tuple + - 0.7 + - 1.1 + kd_range: !!python/tuple + - 0.7 + - 1.1 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_joint_limit: + func: !!python/name:mjlab.envs.mdp.dr.joint.joint_limits '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + ranges: !!python/tuple + - 0.94 + - 1.06 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_joint_stiffness: + func: !!python/name:mjlab.envs.mdp.dr.joint.joint_stiffness '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + ranges: !!python/tuple + - 0.7 + - 1.3 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_joint_frictionloss: + func: !!python/name:mjlab.envs.mdp.dr.joint.joint_friction '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + ranges: !!python/tuple + - 0.1 + - 1.3 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_joint_armature: + func: !!python/name:mjlab.envs.mdp.dr.joint.joint_armature '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + ranges: !!python/tuple + - 0.2 + - 5.0 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_joint_damping: + func: !!python/name:mjlab.envs.mdp.dr.joint.joint_damping '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + operation: scale + ranges: !!python/tuple + - 0.7 + - 1.3 + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 + randomize_ray_offsets: + func: !!python/name:instinct_mj.envs.mdp.events.randomization.randomize_ray_offsets '' + params: + asset_cfg: + name: camera + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + offset_pose_ranges: + x: !!python/tuple + - -0.01 + - 0.01 + y: !!python/tuple + - -0.01 + - 0.01 + z: !!python/tuple + - -0.03 + - 0.01 + roll: !!python/tuple + - -0.03490658503988659 + - 0.03490658503988659 + pitch: !!python/tuple + - -0.17453292519943295 + - 0.17453292519943295 + yaw: !!python/tuple + - -0.03490658503988659 + - 0.03490658503988659 + distribution: uniform + mode: startup + interval_range_s: null + is_global_time: false + min_step_count_between_reset: 0 +seed: 42 +sim: + nconmax: 128 + njmax: 700 + ls_parallel: true + contact_sensor_maxmatch: 500 + mujoco: + timestep: 0.005 + integrator: implicitfast + impratio: 1.0 + cone: pyramidal + jacobian: auto + solver: newton + iterations: 10 + tolerance: 1.0e-08 + ls_iterations: 20 + ls_tolerance: 0.01 + ccd_iterations: 500 + gravity: !!python/tuple + - 0.0 + - 0.0 + - -9.81 + disableflags: !!python/tuple [] + enableflags: !!python/tuple [] + nan_guard: + enabled: false + buffer_size: 100 + output_dir: /tmp/mjlab/nan_dumps + max_envs_to_dump: 5 +viewer: + lookat: !!python/tuple + - 0.0 + - 0.0 + - 0.0 + distance: 3.0 + fovy: null + elevation: -5.0 + azimuth: 90.0 + origin_type: !!python/object/apply:mjlab.viewer.viewer_config.OriginType + - 4 + entity_name: robot + body_name: waist_yaw_link + env_idx: 0 + max_extra_envs: 2 + enable_reflections: true + enable_shadows: true + height: 240 + width: 320 +episode_length_s: 20.0 +rewards: + track_linear_velocity: + func: !!python/name:src.tasks.velocity.mdp.rewards.track_linear_velocity '' + params: + command_name: twist + std: 0.5 + weight: 3.5 + track_angular_velocity: + func: !!python/name:src.tasks.velocity.mdp.rewards.track_angular_velocity '' + params: + command_name: twist + std: 0.7071067811865476 + weight: 3.0 + flat_orientation: + func: !!python/name:mjlab.envs.mdp.rewards.flat_orientation_l2 '' + params: {} + weight: -7.0 + pelvis_orientation_l2: + func: !!python/name:src.tasks.velocity.mdp.instinct_reward.link_orientation '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: pelvis + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -3.0 + joint_deviation_hip: + func: !!python/name:src.tasks.velocity.mdp.instinct_reward.joint_deviation_square '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .*_hip_yaw_joint + - .*_hip_roll_joint + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -0.3 + ang_vel_xy_l2: + func: !!python/name:src.tasks.velocity.mdp.instinct_reward.ang_vel_xy_l2 '' + params: {} + weight: -0.1 + dof_torques_l2: + func: !!python/name:mjlab.envs.mdp.rewards.joint_torques_l2 '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .*_hip_.* + - .*_knee_.* + - .*_ankle_.* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -1.0e-08 + dof_vel_l2: + func: !!python/name:mjlab.envs.mdp.rewards.joint_vel_l2 '' + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -5.0e-07 + feet_flat_ori: + func: !!python/name:src.tasks.velocity.mdp.instinct_reward.feet_orientation_contact '' + params: + sensor_name: feet_ground_contact + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - left_ankle_roll_link + - right_ankle_roll_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -0.01 + body_ang_vel: + func: !!python/name:src.tasks.velocity.mdp.rewards.body_angular_velocity_penalty '' + params: + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - waist_yaw_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -0.05 + angular_momentum: + func: !!python/name:src.tasks.velocity.mdp.rewards.angular_momentum_penalty '' + params: + sensor_name: robot/root_angmom + weight: -0.001 + is_terminated: + func: !!python/name:mjlab.envs.mdp.rewards.is_terminated '' + params: {} + weight: -200.0 + joint_acc_l2: + func: !!python/name:mjlab.envs.mdp.rewards.joint_acc_l2 '' + params: {} + weight: -5.0e-07 + joint_pos_limits: + func: &id011 !!python/name:mjlab.envs.mdp.rewards.joint_pos_limits '' + params: {} + weight: -1.0 + action_rate_l2: + func: !!python/name:mjlab.envs.mdp.rewards.action_rate_l2 '' + params: {} + weight: -0.8 + foot_gait: + func: !!python/name:src.tasks.velocity.mdp.rewards.feet_gait '' + params: + period: 0.9 + offset: + - 0.0 + - 0.5 + threshold: 0.6 + command_threshold: 0.1 + command_name: twist + sensor_name: feet_ground_contact + weight: 2.0 + feet_double_support: + func: !!python/name:src.tasks.velocity.mdp.rewards.feet_double_support '' + params: + sensor_name: feet_ground_contact + period: 0.9 + offset: + - 0.0 + - 0.5 + threshold: 0.6 + command_name: twist + cmd_threshold: 0.1 + ds_match_weight: 1.0 + weight: 1.5 + foot_slip: + func: !!python/name:src.tasks.velocity.mdp.rewards.feet_slip '' + params: + sensor_name: feet_ground_contact + command_name: twist + command_threshold: 0.1 + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: !!python/tuple + - left_foot + - right_foot + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -0.4 + feet_close_xy: + func: !!python/name:src.tasks.velocity.mdp.rewards.feet_close_xy_gauss '' + params: + threshold: 0.2 + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - left_ankle_roll_link + - right_ankle_roll_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + std: 0.22360679774997896 + weight: 1.0 + soft_landing: + func: !!python/name:src.tasks.velocity.mdp.rewards.soft_landing '' + params: + sensor_name: feet_ground_contact + command_name: twist + command_threshold: 0.1 + weight: -0.001 + dont_wait: + func: !!python/name:src.tasks.velocity.mdp.rewards.dont_wait '' + params: + command_name: twist + cmd_threshold: 0.1 + weight: -1.0 + stand_still: + func: !!python/name:src.tasks.velocity.mdp.rewards.stand_still '' + params: + command_name: twist + command_threshold: 0.1 + asset_cfg: + name: robot + joint_names: .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -1.0 + self_collisions: + func: !!python/name:src.tasks.velocity.mdp.rewards.self_collision_cost '' + params: + sensor_name: self_collision + force_threshold: 10.0 + weight: -2.0 + feet_air_time: + func: !!python/name:src.tasks.velocity.mdp.rewards.feet_air_time '' + params: + sensor_name: feet_ground_contact + threshold: 0.36000000000000004 + command_name: twist + command_threshold: 0.1 + weight: 1.0 + feet_air_time_biped: + func: !!python/name:src.tasks.velocity.mdp.rewards.feet_air_time_positive_biped '' + params: + command_name: twist + sensor_name: feet_ground_contact + threshold: 0.52 + weight: 2.0 + terrain_foot_clearance: + func: !!python/name:src.tasks.velocity.mdp.rewards.terrain_foot_clearance_cost '' + params: + target_clearance: 0.06 + left_terrain_sensor: left_height_scanner + right_terrain_sensor: right_height_scanner + command_name: twist + command_threshold: 0.05 + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: !!python/tuple + - left_foot + - right_foot + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -0.5 + terrain_stumble: + func: !!python/name:src.tasks.velocity.mdp.rewards.terrain_stumble_cost '' + params: + sensor_cfg: + name: feet_ground_contact + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - left_ankle_roll_link + - right_ankle_roll_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + velocity_threshold: 0.15 + weight: -0.5 + terrain_base_height: + func: !!python/name:src.tasks.velocity.mdp.rewards.terrain_base_height_l2_cost '' + params: + target_height: 0.9 + base_terrain_sensor: pelvis_height_measure + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -1.5 + feet_slide: + func: !!python/name:instinct_mj.tasks.parkour.mdp.rewards.feet_slide '' + params: + sensor_name: feet_ground_contact + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - left_ankle_roll_link + - right_ankle_roll_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + threshold: 1.0 + weight: -0.4 + dof_pos_limits: + func: *id011 + params: + asset_cfg: + name: robot + joint_names: !!python/tuple + - .* + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: null + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: null + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + weight: -1.0 + foothold_tracking: + func: !!python/name:src.tasks.velocity.mdp.rewards.foothold_tracking '' + params: + command_name: foothold + sigma_stages: + - !!python/tuple + - 10.0 + - 5.0 + - !!python/tuple + - 20.0 + - 10.0 + - !!python/tuple + - 30.0 + - 15.0 + stage_step_counts: + - 0 + - 96000 + - 192000 + asset_cfg: + name: robot + joint_names: null + joint_ids: !!python/object/apply:builtins.slice + - null + - null + - null + body_names: !!python/tuple + - left_ankle_roll_link + - right_ankle_roll_link + body_ids: !!python/object/apply:builtins.slice + - null + - null + - null + geom_names: null + geom_ids: !!python/object/apply:builtins.slice + - null + - null + - null + site_names: !!python/tuple + - left_foot + - right_foot + site_ids: !!python/object/apply:builtins.slice + - null + - null + - null + actuator_names: null + actuator_ids: !!python/object/apply:builtins.slice + - null + - null + - null + tendon_names: null + tendon_ids: !!python/object/apply:builtins.slice + - null + - null + - null + camera_names: null + camera_ids: !!python/object/apply:builtins.slice + - null + - null + - null + light_names: null + light_ids: !!python/object/apply:builtins.slice + - null + - null + - null + material_names: null + material_ids: !!python/object/apply:builtins.slice + - null + - null + - null + pair_names: null + pair_ids: !!python/object/apply:builtins.slice + - null + - null + - null + preserve_order: false + sensor_name: feet_ground_contact + velocity_command_name: twist + velocity_command_threshold: 0.1 + weight: 2.1 +terminations: + time_out: + func: !!python/name:mjlab.envs.mdp.terminations.time_out '' + params: {} + time_out: true + fell_over: + func: !!python/name:mjlab.envs.mdp.terminations.bad_orientation '' + params: + limit_angle: 1.2217304763960306 + time_out: false + nan_term: + func: !!python/name:mjlab.envs.mdp.terminations.nan_detection '' + params: {} + time_out: false + base_height: + func: !!python/name:src.tasks.velocity.mdp.rewards.root_height_below_minimum_terrain '' + params: + minimum_height: 0.3 + terrain_sensor_name: pelvis_height_measure + time_out: false +commands: + twist: + resampling_time_range: !!python/tuple + - 3.0 + - 8.0 + debug_vis: true + entity_name: robot + heading_command: false + heading_control_stiffness: 0.5 + rel_standing_envs: 0.05 + rel_heading_envs: 1.0 + rel_world_envs: 0.0 + rel_forward_envs: 0.0 + init_velocity_prob: 0.0 + ranges: + lin_vel_x: !!python/tuple + - 0.0 + - 1.0 + lin_vel_y: !!python/tuple + - 0.0 + - 0.0 + ang_vel_z: !!python/tuple + - -0.5 + - 0.5 + heading: null + viz: + z_offset: 1.15 + scale: 0.5 + foothold: + resampling_time_range: !!python/tuple + - 1000000000.0 + - 1000000000.0 + debug_vis: false + entity_name: robot + terrain_sensor_name: terrain_scan + contact_sensor_name: feet_ground_contact + velocity_command_name: twist + foot_site_names: !!python/tuple + - left_foot + - right_foot + gait_period: 0.9 + gait_action_name: gait_freq + nominal_height_m: 0.9 + lateral_inter_foot_m: 0.22 + foot_footprint_m: !!python/tuple + - 0.25 + - 0.1 + search_window_m: !!python/tuple + - 0.6 + - 0.6 + elevation_size_m: !!python/tuple + - 1.8 + - 1.2 + elevation_resolution_m: 0.05 + alpha_pos: 1.0 + alpha_dcm: 0.5 + alpha_steepness: 0.6 + alpha_flatness: 4.0 + alpha_height: 6.0 + alpha_climb_bonus: 1.5 + lateral_pos_weight: 2.5 + max_step_height_m: 0.25 + climb_velocity_threshold: 0.1 + standing_threshold: 0.1 + min_step_height_m: 0.05 + max_step_velocity_m_s: 0.5 + apex_clearance_m: 0.05 + clearance_scale: 0.5 + max_clearance_m: 0.2 + pre_apex_lower_window: 0.05 + pre_apex_upper_window: 0.05 + post_apex_lower_window: 0.1 + post_apex_upper_window: 0.15 + terrain_decision_threshold: 0.1 +curriculum: + terrain_levels: + func: !!python/name:src.tasks.velocity.mdp.curriculums.terrain_levels_vel '' + params: + command_name: twist + command_vel: + func: !!python/name:src.tasks.velocity.mdp.curriculums.commands_vel '' + params: + command_name: twist + velocity_stages: + - step: 0 + lin_vel_x: !!python/tuple + - 0.0 + - 0.6 + lin_vel_y: !!python/tuple + - 0.0 + - 0.0 + ang_vel_z: !!python/tuple + - -0.2 + - 0.2 + - step: 120000 + lin_vel_x: !!python/tuple + - 0.0 + - 1.2 + lin_vel_y: !!python/tuple + - 0.0 + - 0.0 + ang_vel_z: !!python/tuple + - -0.5 + - 0.5 + - step: 240000 + lin_vel_x: !!python/tuple + - -0.5 + - 1.2 + lin_vel_y: !!python/tuple + - -0.5 + - 0.5 + ang_vel_z: !!python/tuple + - -0.5 + - 0.5 + - step: 480000 + lin_vel_x: !!python/tuple + - -0.8 + - 1.5 + lin_vel_y: !!python/tuple + - -0.5 + - 0.5 + ang_vel_z: !!python/tuple + - -1.2 + - 1.2 +metrics: + mean_action_acc: + func: !!python/name:mjlab.envs.mdp.metrics.mean_action_acc '' + params: {} + per_substep: false + reduce: mean +recorders: {} +is_finite_horizon: false +auto_reset: true +scale_rewards_by_dt: true diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/env_cfgs.py b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/env_cfgs.py new file mode 100644 index 0000000000000000000000000000000000000000..29e74324e819b3f0b9ae7863702e7692338a39c8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/params/env_cfgs.py @@ -0,0 +1,2795 @@ +"""VinRobotics VR-M3 12DOF (lower-body only) velocity environment configurations. + +Self-contained: this module builds the full `ManagerBasedRlEnvCfg` inline +rather than deriving from `src.tasks.velocity.velocity_env_cfg`, so changes +to the shared factory do not silently affect VR-M3 12DOF training. +""" + +import math +from copy import deepcopy +from dataclasses import dataclass, replace +import numpy as np + +import instinct_mj.envs.mdp as instinct_mdp + +# import instinct_mj.tasks.locomotion.mdp as instinct_locomotion_mdp +try: + import instinct_mj.tasks.parkour.mdp as instinct_parkour_mdp +except ImportError: + instinct_parkour_mdp = None # type: ignore[assignment] +from instinct_mj.sensors.noisy_camera import NoisyGroupedRayCasterCameraCfg +from instinct_mj.utils.noise import ( + CropAndResizeCfg, + DepthArtifactNoiseCfg, + DepthContourNoiseCfg, + DepthNormalizationCfg, + DepthSkyArtifactNoiseCfg, + GaussianBlurNoiseCfg, + RangeBasedGaussianNoiseCfg, + StereoTooCloseNoiseCfg, +) +from mjlab.envs import ManagerBasedRlEnvCfg +from mjlab.envs import mdp as envs_mdp +from mjlab.envs.mdp import dr +from mjlab.envs.mdp.actions import JointPositionActionCfg +from mjlab.managers.action_manager import ActionTermCfg +from mjlab.managers.command_manager import CommandTermCfg +from mjlab.managers.curriculum_manager import CurriculumTermCfg +from mjlab.managers.event_manager import EventTermCfg +from mjlab.managers.metrics_manager import MetricsTermCfg +from mjlab.managers.observation_manager import ObservationGroupCfg, ObservationTermCfg +from mjlab.managers.reward_manager import RewardTermCfg +from mjlab.managers.scene_entity_config import SceneEntityCfg +from mjlab.managers.termination_manager import TerminationTermCfg +from mjlab.scene import SceneCfg +from mjlab.sensor import ( + ContactMatch, + ContactSensorCfg, + GridPatternCfg, + ObjRef, + PinholeCameraPatternCfg, + RayCastSensorCfg, +) + +from mjlab.sim import MujocoCfg, SimulationCfg +from mjlab.tasks.velocity.mdp import UniformVelocityCommandCfg +from mjlab.terrains import TerrainEntityCfg, SubTerrainCfg +from mjlab.terrains.config import ROUGH_TERRAINS_CFG +from mjlab.utils.noise import UniformNoiseCfg as Unoise +from mjlab.viewer import ViewerConfig + +import src.tasks.velocity.mdp as mdp +from src.assets.robots import ( + VR_M3_12DOF_ACTION_SCALE, + get_vr_m3_12dof_implicit_actuator_robot_cfg, + vr_m3_12dof_joint_pos_action_scale, + vr_m3_12dof_joint_vel_action_scale, +) +from src.tasks.velocity.terrains.config import PERCEPTIVE_TERRAINS_CFG +from src.envs import MultiCriticManagerBasedRlEnvCfg + +## +# VR-M3 12DOF specific constants +## + +# 12DOF keeps the upper body kinematically but with no actuated joints, so +# `waist_yaw_link` (the torso-equivalent body) is still referenceable. +TORSO_BODY = "waist_yaw_link" + +FOOT_SITES = ("left_foot", "right_foot") +FOOT_LINK_NAMES = ("left_ankle_roll_link", "right_ankle_roll_link") + +# Same foot geometry as the fullbody XML: 10 collision geoms per ankle_roll_link. +FOOT_GEOMS = tuple( + f"{side}_ankle_roll_link_collision_{i}" + for side in ("left", "right") + for i in range(1, 11) +) + +# 12DOF only actuates legs; waist and upper body have no actuators, so the +# pose reward only lists the leg-joint regexes. +POSE_STD_STANDING: dict[str, float] = {".*": 0.05} +POSE_STD_WALKING: dict[str, float] = { + r".*hip_pitch.*": 0.5, + r".*hip_roll.*": 0.15, + r".*hip_yaw.*": 0.15, + r".*knee.*": 0.5, + r".*ankle_pitch.*": 0.15, + r".*ankle_roll.*": 0.1, +} +POSE_STD_RUNNING: dict[str, float] = { + r".*hip_pitch.*": 0.5, + r".*hip_roll.*": 0.25, + r".*hip_yaw.*": 0.25, + r".*knee.*": 0.5, + r".*ankle_pitch.*": 0.25, + r".*ankle_roll.*": 0.1, +} + +GAIT_CYCLE_PERIOD = 0.9 + + +@dataclass +class VelocityEnvCfg(ManagerBasedRlEnvCfg): + def __post_init__(self): + pass + + +def vr_m3_12dof_rough_env_cfg(play: bool = False) -> VelocityEnvCfg: + """Create VR-M3 12DOF rough terrain velocity configuration.""" + + ## + # Sensors + ## + + feet_ground_cfg = ContactSensorCfg( + name="feet_ground_contact", + primary=ContactMatch( + mode="subtree", + pattern=r"^(left_ankle_roll_link|right_ankle_roll_link)$", + entity="robot", + ), + secondary=ContactMatch(mode="body", pattern="terrain"), + fields=("found", "force"), + reduce="netforce", + num_slots=1, + track_air_time=True, + history_length=4, + ) + self_collision_cfg = ContactSensorCfg( + name="self_collision", + primary=ContactMatch(mode="subtree", pattern="pelvis", entity="robot"), + secondary=ContactMatch(mode="subtree", pattern="pelvis", entity="robot"), + fields=("found", "force"), + reduce="none", + num_slots=1, + history_length=4, + ) + + ## + # Observations + ## + + actor_terms = { + "base_ang_vel": ObservationTermCfg( + func=mdp.builtin_sensor, + scale=0.25, + params={"sensor_name": "robot/imu_ang_vel"}, + noise=Unoise(n_min=-0.25, n_max=0.25), + history_length=5, + flatten_history_dim=True, + ), + "projected_gravity": ObservationTermCfg( + func=mdp.projected_gravity, + noise=Unoise(n_min=-0.05, n_max=0.05), + history_length=5, + flatten_history_dim=True, + ), + "velocity_commands": ObservationTermCfg( + func=mdp.generated_commands, + params={"command_name": "twist"}, + history_length=5, + flatten_history_dim=True, + ), + "joint_pos_rel": ObservationTermCfg( + func=mdp.joint_pos_rel, + noise=Unoise(n_min=-0.05, n_max=0.05), + history_length=5, + flatten_history_dim=True, + ), + "joint_vel_rel": ObservationTermCfg( + func=mdp.joint_vel_rel, + scale=0.05, + noise=Unoise(n_min=-1.5, n_max=1.5), + history_length=5, + flatten_history_dim=True, + ), + "last_action": ObservationTermCfg( + func=mdp.last_action, history_length=5, flatten_history_dim=True + ), + "gait_phase": ObservationTermCfg( + func=mdp.phase, + params={"period": GAIT_CYCLE_PERIOD, "command_name": "twist"}, + history_length=5, + flatten_history_dim=True, + ), + } + + critic_terms = { + **actor_terms, + "base_lin_vel": ObservationTermCfg( + func=mdp.builtin_sensor, + params={"sensor_name": "robot/imu_lin_vel"}, + history_length=5, + flatten_history_dim=True, + ), + "true_base_velocity": ObservationTermCfg( + func=envs_mdp.base_lin_vel, + history_length=5, + flatten_history_dim=True, + ), + "foot_height": ObservationTermCfg( + func=mdp.foot_height, + params={"asset_cfg": SceneEntityCfg("robot", site_names=FOOT_SITES)}, + history_length=5, + flatten_history_dim=True, + ), + "foot_air_time": ObservationTermCfg( + func=mdp.foot_air_time, + params={"sensor_name": "feet_ground_contact"}, + history_length=5, + flatten_history_dim=True, + ), + "foot_contact": ObservationTermCfg( + func=mdp.foot_contact, + params={"sensor_name": "feet_ground_contact"}, + history_length=5, + flatten_history_dim=True, + ), + "foot_contact_forces": ObservationTermCfg( + func=mdp.foot_contact_forces, + params={"sensor_name": "feet_ground_contact"}, + history_length=5, + flatten_history_dim=True, + ), + "knee_reference": ObservationTermCfg( + func=mdp.get_desired_knee_angle, + params={ + "period": GAIT_CYCLE_PERIOD, + "offset": [0.0, 0.5], + "command_name": "twist", + }, + history_length=5, + flatten_history_dim=True, + ), + } + + observations = { + "actor": ObservationGroupCfg( + terms=actor_terms, + concatenate_terms=True, + enable_corruption=True, + # history_length=5, + nan_policy="sanitize", + nan_check_per_term=True, + ), + "critic": ObservationGroupCfg( + terms=critic_terms, + concatenate_terms=True, + enable_corruption=False, + # history_length=5, + nan_policy="sanitize", + nan_check_per_term=True, + ), + } + + ## + # Metrics + ## + + metrics = { + "mean_action_acc": MetricsTermCfg(func=mdp.mean_action_acc), + } + + ## + # Actions + ## + + actions: dict[str, ActionTermCfg] = { + "joint_pos": JointPositionActionCfg( + entity_name="robot", + actuator_names=(".*",), + scale=VR_M3_12DOF_ACTION_SCALE, + use_default_offset=True, + ) + } + + ## + # Commands + ## + + commands: dict[str, CommandTermCfg] = { + "twist": UniformVelocityCommandCfg( + entity_name="robot", + resampling_time_range=(3.0, 8.0), + rel_standing_envs=0.05, + heading_command=False, + heading_control_stiffness=0.5, + debug_vis=True, + ranges=UniformVelocityCommandCfg.Ranges( + lin_vel_x=(-1.0, 2.0), + lin_vel_y=(-1.0, 1.0), + ang_vel_z=(-1.0, 1.0), + heading=None, + ), + ), + } + twist_cmd = commands["twist"] + assert isinstance(twist_cmd, UniformVelocityCommandCfg) + twist_cmd.viz.z_offset = 1.15 + + ## + # Events + ## + + events = { + "reset_base": EventTermCfg( + func=mdp.reset_root_state_uniform, + mode="reset", + params={ + "pose_range": { + "x": (-0.5, 0.5), + "y": (-0.5, 0.5), + "z": (0.0, 0.0), + "yaw": (-3.14, 3.14), + }, + # "discrete_yaws": [0.0, math.pi / 2, math.pi, -math.pi / 2], # [0.0, math.pi / 2, math.pi, -math.pi / 2], + }, + ), + "reset_robot_joints": EventTermCfg( + func=mdp.reset_joints_by_offset, + mode="reset", + params={ + "position_range": (-0.1, 0.1), + "velocity_range": (-0.5, 0.5), + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + }, + ), + "push_robot": EventTermCfg( + func=mdp.push_by_setting_velocity, + mode="interval", + interval_range_s=(5.0, 6.0), + params={ + "velocity_range": { + "x": (-0.5, 0.5), + "y": (-0.5, 0.5), + "z": (-0.4, 0.4), + "roll": (-0.52, 0.52), + "pitch": (-0.52, 0.52), + "yaw": (-0.78, 0.78), + }, + }, + ), + "foot_friction": EventTermCfg( + mode="startup", + func=dr.geom_friction, + params={ + "asset_cfg": SceneEntityCfg("robot", geom_names=FOOT_GEOMS), + "operation": "abs", + "ranges": (0.3, 1.6), + "shared_random": True, + }, + ), + "encoder_bias": EventTermCfg( + mode="startup", + func=dr.encoder_bias, + params={ + "asset_cfg": SceneEntityCfg("robot"), + "bias_range": (-0.015, 0.015), + }, + ), + "base_com": EventTermCfg( + mode="startup", + func=dr.body_com_offset, + params={ + "asset_cfg": SceneEntityCfg("robot", body_names=(TORSO_BODY,)), + "operation": "add", + "ranges": { + 0: (-0.05, 0.05), + 1: (-0.05, 0.05), + 2: (-0.05, 0.05), + }, + }, + ), + "body_com": EventTermCfg( + mode="startup", + func=dr.body_ipos, + params={ + "asset_cfg": SceneEntityCfg( + "robot", body_names=("^(?!waist_yaw_link$).*",) + ), + "operation": "add", + "ranges": { + 0: (-0.03, 0.03), + 1: (-0.03, 0.03), + 2: (-0.03, 0.03), + }, + }, + ), + "base_mass": EventTermCfg( + mode="startup", + func=dr.body_mass, + params={ + "asset_cfg": SceneEntityCfg("robot", body_names=("waist_yaw_link",)), + "operation": "add", + "ranges": (-4.0, 4.0), + }, + ), + "body_mass": EventTermCfg( + mode="startup", + func=dr.body_mass, + params={ + "asset_cfg": SceneEntityCfg( + "robot", body_names=("^(?!waist_yaw_link$).*",) + ), + "operation": "scale", + "ranges": (0.9, 1.1), + }, + ), + "randomize_actuator_gains": EventTermCfg( + func=dr.pd_gains, + mode="startup", + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + "operation": "scale", + "kp_range": (0.7, 1.1), + "kd_range": (0.7, 1.1), + }, + ), + "randomize_joint_limit": EventTermCfg( + mode="startup", + func=dr.joint_limits, + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + "operation": "scale", + "ranges": (0.94, 1.06), + }, + ), + "randomize_joint_stiffness": EventTermCfg( + mode="startup", + func=dr.joint_stiffness, + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + "operation": "scale", + "ranges": (0.7, 1.3), + }, + ), + "randomize_joint_frictionloss": EventTermCfg( + mode="startup", + func=dr.joint_friction, + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + "operation": "scale", + "ranges": (0.1, 1.3), + }, + ), + "randomize_joint_armature": EventTermCfg( + mode="startup", + func=dr.joint_armature, + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + "operation": "scale", + "ranges": (0.2, 5.0), + }, + ), + "randomize_joint_damping": EventTermCfg( + mode="startup", + func=dr.joint_damping, + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=(".*",)), + "operation": "scale", + "ranges": (0.7, 1.3), + }, + ), + } + + ## + # Rewards + ## + + rewards = { + "track_linear_velocity": RewardTermCfg( + func=mdp.track_linear_velocity, + weight=2.0, + params={"command_name": "twist", "std": math.sqrt(0.25)}, + ), + "track_angular_velocity": RewardTermCfg( + func=mdp.track_angular_velocity, + weight=2.0, + params={"command_name": "twist", "std": math.sqrt(0.5)}, + ), + "body_orientation_l2": RewardTermCfg( + func=mdp.body_orientation_l2, + weight=-5.0, + params={"asset_cfg": SceneEntityCfg("robot", body_names=(TORSO_BODY,))}, + ), + "pose": RewardTermCfg( + func=mdp.variable_posture, + weight=1.0, + params={ + "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), + "command_name": "twist", + "std_standing": POSE_STD_STANDING, + "std_walking": POSE_STD_WALKING, + "std_running": POSE_STD_RUNNING, + "walking_threshold": 0.1, + "running_threshold": 0.7, + }, + ), + "flat_orientation": RewardTermCfg(func=mdp.flat_orientation_l2, weight=-7.0), + "pelvis_orientation_l2": RewardTermCfg( + func=mdp.link_orientation, + weight=-3.0, + params={"asset_cfg": SceneEntityCfg("robot", body_names="pelvis")}, + ), + "joint_deviation_hip": RewardTermCfg( + func=mdp.joint_deviation_square, + weight=-0.1, + params={ + "asset_cfg": SceneEntityCfg( + "robot", + joint_names=(".*_hip_yaw_joint", ".*_hip_roll_joint"), + ) + }, + ), + "ang_vel_xy_l2": RewardTermCfg( + func=mdp.ang_vel_xy_l2, + weight=-0.05, + ), + "dof_torques_l2": RewardTermCfg( + func=mdp.joint_torques_l2, + weight=-1.0e-8, + params={ + "asset_cfg": SceneEntityCfg( + "robot", + joint_names=(".*_hip_.*", ".*_knee_.*", ".*_ankle_.*"), + ) + }, + ), + "dof_vel_l2": RewardTermCfg( + func=mdp.joint_vel_l2, + weight=-1.0e-8, + params={"asset_cfg": SceneEntityCfg("robot", joint_names=(".*",))}, + ), + "feet_flat_ori": RewardTermCfg( + func=mdp.feet_orientation_contact, + weight=-0.01, + params={ + "sensor_name": "feet_ground_contact", + "asset_cfg": SceneEntityCfg( + "robot", + body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + }, + ), + "body_ang_vel": RewardTermCfg( + func=mdp.body_angular_velocity_penalty, + weight=-0.05, + params={"asset_cfg": SceneEntityCfg("robot", body_names=(TORSO_BODY,))}, + ), + "angular_momentum": RewardTermCfg( + func=mdp.angular_momentum_penalty, + weight=-0.025, + params={"sensor_name": "robot/root_angmom"}, + ), + "is_terminated": RewardTermCfg(func=mdp.is_terminated, weight=-200.0), + "joint_acc_l2": RewardTermCfg(func=mdp.joint_acc_l2, weight=-2.5e-7), + "joint_pos_limits": RewardTermCfg(func=mdp.joint_pos_limits, weight=-5.0), + "action_rate_l2": RewardTermCfg(func=mdp.action_rate_l2, weight=-0.5), + "foot_gait": RewardTermCfg( + func=mdp.feet_gait, + weight=1.0, + params={ + "period": GAIT_CYCLE_PERIOD, + "offset": [0.0, 0.5], + "threshold": 0.6, + "command_threshold": 0.1, + "command_name": "twist", + "sensor_name": "feet_ground_contact", + }, + ), + "feet_double_support": RewardTermCfg( + func=mdp.feet_double_support, + weight=2.0, + params={ + "sensor_name": "feet_ground_contact", + "period": GAIT_CYCLE_PERIOD, + "offset": [0.0, 0.5], + "threshold": 0.6, + "command_name": "twist", + "cmd_threshold": 0.1, + "ds_match_weight": 1.0, + }, + ), + "foot_clearance": RewardTermCfg( + func=mdp.feet_clearance, + weight=-1.0, + params={ + "target_height": 0.10, + "command_name": "twist", + "command_threshold": 0.1, + "asset_cfg": SceneEntityCfg("robot", site_names=FOOT_SITES), + }, + ), + "foot_slip": RewardTermCfg( + func=mdp.feet_slip, + weight=-0.25, + params={ + "sensor_name": "feet_ground_contact", + "command_name": "twist", + "command_threshold": 0.1, + "asset_cfg": SceneEntityCfg("robot", site_names=FOOT_SITES), + }, + ), + "feet_close_xy": RewardTermCfg( + func=mdp.feet_close_xy_gauss, + weight=1.0, + params={ + "threshold": 0.2, + "asset_cfg": SceneEntityCfg( + "robot", + body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + "std": math.sqrt(0.05), + }, + ), + "soft_landing": RewardTermCfg( + func=mdp.soft_landing, + weight=-1e-3, + params={ + "sensor_name": "feet_ground_contact", + "command_name": "twist", + "command_threshold": 0.1, + }, + ), + "dont_wait": RewardTermCfg( + func=mdp.dont_wait, + weight=-0.5, + params={ + "command_name": "twist", + "cmd_threshold": 0.1, + }, + ), + "stand_still": RewardTermCfg( + func=mdp.stand_still, + weight=-1.0, + params={ + "command_name": "twist", + "command_threshold": 0.1, + "asset_cfg": SceneEntityCfg("robot", joint_names=".*"), + }, + ), + "self_collisions": RewardTermCfg( + func=mdp.self_collision_cost, + weight=-1.0, + params={"sensor_name": self_collision_cfg.name, "force_threshold": 10.0}, + ), + "feet_air_time": RewardTermCfg( + func=mdp.feet_air_time, + weight=1.0, + params={ + "sensor_name": "feet_ground_contact", + "threshold": (1.0 - 0.6) * GAIT_CYCLE_PERIOD, # 0.48 s + "command_name": "twist", + "command_threshold": 0.1, + }, + ), + "feet_air_time_biped": RewardTermCfg( + func=mdp.feet_air_time_positive_biped, + weight=1.5, + params={ + "command_name": "twist", + "sensor_name": "feet_ground_contact", + "threshold": 0.52, + }, + ), + } + + ## + # Terminations + ## + + terminations = { + "time_out": TerminationTermCfg(func=mdp.time_out, time_out=True), + "fell_over": TerminationTermCfg( + func=mdp.bad_orientation, + params={"limit_angle": math.radians(70.0)}, + ), + "nan_term": TerminationTermCfg( + func=mdp.nan_detection, + time_out=False, + ), + } + + ## + # Curriculum + ## + + curriculum = { + "terrain_levels": CurriculumTermCfg( + func=mdp.terrain_levels_vel, + params={"command_name": "twist"}, + ), + "command_vel": CurriculumTermCfg( + func=mdp.commands_vel, + params={ + "command_name": "twist", + "velocity_stages": [ + { + "step": 0, + "lin_vel_x": (-0.5, 1.0), + "lin_vel_y": (-0.5, 0.5), + "ang_vel_z": (-0.5, 0.5), + }, + { + "step": 5000 * 24, + "lin_vel_x": (-0.7, 1.5), + "lin_vel_y": (-0.7, 0.7), + "ang_vel_z": (-0.7, 0.7), + }, + { + "step": 7000 * 24, + "lin_vel_x": (-1.0, 2.0), + "lin_vel_y": (-1.0, 1.0), + "ang_vel_z": (-1.0, 1.0), + }, + # { + # "step": 9000 * 24, + # "lin_vel_x": (-1.0, 3.0), + # "lin_vel_y": (-1.0, 1.0), + # "ang_vel_z": (-1.0, 1.0), + # }, + ], + }, + ), + } + + ## + # Scene + terrain + ## + + terrain_generator = replace(ROUGH_TERRAINS_CFG) + terrain_generator.curriculum = True + terrain = TerrainEntityCfg( + terrain_type="generator", + terrain_generator=terrain_generator, + max_init_terrain_level=5, + ) + + scene = SceneCfg( + terrain=terrain, + entities={"robot": get_vr_m3_12dof_implicit_actuator_robot_cfg()}, + sensors=(feet_ground_cfg, self_collision_cfg), + num_envs=1, + extent=2.0, + ) + + ## + # Assemble + ## + + cfg = VelocityEnvCfg( + scene=scene, + observations=observations, + actions=actions, + commands=commands, + events=events, + rewards=rewards, + terminations=terminations, + curriculum=curriculum, + metrics=metrics, + viewer=ViewerConfig( + origin_type=ViewerConfig.OriginType.ASSET_BODY, + entity_name="robot", + body_name=TORSO_BODY, + distance=3.0, + elevation=-5.0, + azimuth=90.0, + ), + sim=SimulationCfg( + # VR-M3 has ~1.4x the foot collision geoms of G1 (10/side vs 7/side); + # rough terrain randomization can push the contact count up, so + # nconmax is raised from G1's 48 to 512. + nconmax=512, + njmax=1500, + contact_sensor_maxmatch=500, + mujoco=MujocoCfg( + timestep=0.005, + iterations=10, + ls_iterations=20, + ccd_iterations=500, + ), + ), + decimation=4, + episode_length_s=20.0, + ) + + # Play mode overrides. + if play: + cfg.episode_length_s = int(1e9) + cfg.observations["actor"].enable_corruption = False + cfg.events.pop("push_robot", None) + cfg.curriculum = {} + cfg.events["randomize_terrain"] = EventTermCfg( + func=envs_mdp.randomize_terrain, + mode="reset", + params={}, + ) + assert cfg.scene.terrain is not None + if cfg.scene.terrain.terrain_generator is not None: + cfg.scene.terrain.terrain_generator.curriculum = False + cfg.scene.terrain.terrain_generator.num_cols = 5 + cfg.scene.terrain.terrain_generator.num_rows = 5 + cfg.scene.terrain.terrain_generator.border_width = 10.0 + + return cfg + + +def vr_m3_12dof_flat_env_cfg(play: bool = False) -> VelocityEnvCfg: + """Create VR-M3 12DOF flat terrain velocity configuration.""" + cfg = vr_m3_12dof_rough_env_cfg(play=play) + cfg.rewards.pop("flat_orientation", None) + cfg.rewards.pop("pelvis_orientation_l2", None) + cfg.rewards.pop("joint_deviation_hip", None) + cfg.rewards.pop("ang_vel_xy_l2", None) + cfg.rewards.pop("dof_torques_l2", None) + cfg.rewards.pop("dof_vel_l2", None) + cfg.rewards.pop("feet_flat_ori", None) + # VR-M3 has ~1.4x the foot collision geoms of G1, so njmax needs headroom. + cfg.sim.njmax = 600 + cfg.sim.mujoco.ccd_iterations = 50 + cfg.sim.contact_sensor_maxmatch = 64 + cfg.sim.nconmax = None + + # Switch to flat terrain. + assert cfg.scene.terrain is not None + cfg.scene.terrain.terrain_type = "plane" + cfg.scene.terrain.terrain_generator = None + + # Remove raycast sensor and height scan (no terrain to scan). + cfg.scene.sensors = tuple( + s for s in (cfg.scene.sensors or ()) if s.name != "terrain_scan" + ) + # del cfg.observations["actor"].terms["height_scan"] + # del cfg.observations["critic"].terms["height_scan"] + cfg.observations["actor"].terms.pop("height_scan", None) + cfg.observations["critic"].terms.pop("height_scan", None) + + cfg.curriculum.pop("terrain_levels", None) + + if play: + twist_cmd = cfg.commands["twist"] + assert isinstance(twist_cmd, UniformVelocityCommandCfg) + twist_cmd.ranges.lin_vel_x = (-0.5, 2.0) + twist_cmd.ranges.lin_vel_y = (-0.5, 0.5) + twist_cmd.ranges.ang_vel_z = (-0.5, 0.5) + + return cfg + + +def vr_m3_12dof_perceptive_env_cfg(play: bool = False) -> VelocityEnvCfg: + """Create VR-M3 12DOF perceptive locomotion configuration with height-map.""" + cfg = vr_m3_12dof_rough_env_cfg(play=play) + + site_names = ("left_foot", "right_foot") + + # Auto-size contact buffers for complex terrain geometry. + cfg.sim.njmax = 700 + cfg.sim.mujoco.ccd_iterations = 500 + cfg.sim.contact_sensor_maxmatch = 500 + cfg.sim.nconmax = 128 + + # Swap terrain generator to perceptive preset (deepcopy to avoid mutation). + assert cfg.scene.terrain is not None + cfg.scene.terrain.terrain_generator = deepcopy(PERCEPTIVE_TERRAINS_CFG) + + if not play: + cfg.scene.terrain.terrain_generator.curriculum = True + + pelvis_height_measure = RayCastSensorCfg( + name="pelvis_height_measure", + frame=ObjRef(type="body", name="pelvis", entity="robot"), + pattern=GridPatternCfg( + size=(0.0, 0.0), + resolution=0.1, + direction=(0.0, 0.0, -1.0), # Rays pointing downward + ), + ray_alignment="yaw", # Align with body yaw only (stable on slopes) + max_distance=2.0, # Max scan depth + include_geom_groups=(0,), # Only hit terrain (group 0) + exclude_parent_body=True, + debug_vis=play, + ) + left_height_scanner = RayCastSensorCfg( + name="left_height_scanner", + frame=ObjRef(type="site", name="left_foot", entity="robot"), + pattern=GridPatternCfg( + size=(0.0, 0.0), + resolution=0.1, + direction=(0.0, 0.0, -1.0), # Rays pointing downward + ), + ray_alignment="yaw", # Align with body yaw only (stable on slopes) + max_distance=1.0, # Max scan depth + include_geom_groups=(0,), # Only hit terrain (group 0) + exclude_parent_body=True, + debug_vis=play, + ) + right_height_scanner = RayCastSensorCfg( + name="right_height_scanner", + frame=ObjRef(type="site", name="right_foot", entity="robot"), + pattern=GridPatternCfg( + size=(0.0, 0.0), + resolution=0.1, + direction=(0.0, 0.0, -1.0), # Rays pointing downward + ), + ray_alignment="yaw", # Align with body yaw only (stable on slopes) + max_distance=1.0, # Max scan depth + include_geom_groups=(0,), # Only hit terrain (group 0) + exclude_parent_body=True, + debug_vis=play, + ) + + # --- Gradient sensors (3x3 grid for foot edge detection) --- + left_foot_gradient = RayCastSensorCfg( + name="left_foot_gradient", + frame=ObjRef(type="site", name="left_foot", entity="robot"), + pattern=GridPatternCfg( + size=(0.2, 0.1), + resolution=0.1, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=1.0, + include_geom_groups=(0,), # Only hit terrain (group 0) + exclude_parent_body=True, + debug_vis=play, + ) + right_foot_gradient = RayCastSensorCfg( + name="right_foot_gradient", + frame=ObjRef(type="site", name="right_foot", entity="robot"), + pattern=GridPatternCfg( + size=(0.2, 0.1), + resolution=0.1, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=1.0, + include_geom_groups=(0,), # Only hit terrain (group 0) + exclude_parent_body=True, + debug_vis=play, + ) + + cfg.scene.sensors = cfg.scene.sensors + ( + pelvis_height_measure, + left_height_scanner, + right_height_scanner, + left_foot_gradient, + right_foot_gradient, + ) + + # --- Terrain-aware reward terms --- + cfg.rewards["terrain_foot_clearance"] = RewardTermCfg( + func=mdp.terrain_foot_clearance_cost, + weight=-0.5, + params={ + "target_clearance": 0.06, + "left_terrain_sensor": "left_height_scanner", + "right_terrain_sensor": "right_height_scanner", + "command_name": "twist", + "command_threshold": 0.05, + "asset_cfg": SceneEntityCfg("robot", site_names=site_names), + }, + ) + + cfg.rewards["terrain_stumble"] = RewardTermCfg( + func=mdp.terrain_stumble_cost, + weight=-1.0, + params={ + "sensor_cfg": SceneEntityCfg("feet_ground_contact"), + "asset_cfg": SceneEntityCfg( + "robot", + body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + "velocity_threshold": 0.15, + }, + ) + + # cfg.rewards["step_accuracy"] = RewardTermCfg( + # func=custom_mdp.step_accuracy, + # weight=1.0, + # params={ + # "sensor_cfg": SceneEntityCfg("feet_ground_contact"), + # "asset_cfg": SceneEntityCfg( + # "robot", + # body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + # ), + # "patch_name": "target", + # "std": 0.15, + # }, + # ) + + cfg.rewards["terrain_base_height"] = RewardTermCfg( + func=mdp.terrain_base_height_l2_cost, + weight=-1.0, + params={ + "target_height": 0.9, + "base_terrain_sensor": "pelvis_height_measure", + "asset_cfg": SceneEntityCfg("robot"), + }, + ) + + cfg.rewards["foot_edge"] = RewardTermCfg( + func=mdp.foot_edge_cost, + weight=-0.5, + params={ + "sensor_cfg": SceneEntityCfg("feet_ground_contact"), + "left_gradient_sensor": "left_foot_gradient", + "right_gradient_sensor": "right_foot_gradient", + "gradient_threshold": 0.3, + "asset_cfg": SceneEntityCfg("robot", body_names=[r".*ankle_roll.*"]), + }, + ) + + # cfg.rewards["feet_at_plane"] = RewardTermCfg( + # func=parkour_mdp.feet_at_plane, + # weight=-0.1, + # params={ + # "contact_sensor_name": "feet_ground_contact", + # "left_height_scanner_name": "left_height_scanner", # matches your sensor + # "right_height_scanner_name": "right_height_scanner", # matches your sensor + # "asset_cfg": SceneEntityCfg( + # "robot", + # body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + # ), + # "height_offset": 0.06, + # }, + # ) + + # --- Terrain-aware termination --- + cfg.terminations["base_height"] = TerminationTermCfg( + func=mdp.root_height_below_minimum_terrain, + params={ + "minimum_height": 0.3, + "terrain_sensor_name": "pelvis_height_measure", + }, + ) + + if play: + cfg.scene.terrain.terrain_generator.curriculum = False + cfg.scene.terrain.terrain_generator.num_cols = 5 + cfg.scene.terrain.terrain_generator.num_rows = 5 + cfg.scene.terrain.terrain_generator.border_width = 10.0 + + return cfg + + +def vr_m3_12dof_height_map_env_cfg(play: bool = False) -> VelocityEnvCfg: + cfg = vr_m3_12dof_perceptive_env_cfg(play=play) + + terrain_scan = RayCastSensorCfg( + name="terrain_scan", + frame=ObjRef(type="site", name="heightmap_site", entity="robot"), + pattern=GridPatternCfg( + size=(0.6, 1.0), + resolution=0.05, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=2.0, + include_geom_groups=(0, 1, 2), + exclude_parent_body=True, + debug_vis=play, + viz=RayCastSensorCfg.VizCfg(show_normals=True), + ) + + cfg.scene.sensors = cfg.scene.sensors + (terrain_scan,) + + # --- Asymmetric actor-critic observations --- + # Actor: add terrain_scan with noise (proprioception terms inherited from base). + cfg.observations["actor"].terms["height_scan"] = ObservationTermCfg( + # func=custom_mdp.height_scan_custom, + func=envs_mdp.height_scan, + params={"sensor_name": "terrain_scan", "miss_value": 2.0}, + noise=Unoise(n_min=-0.1, n_max=0.1), + clip=(0.0, 2.0), + history_length=5, + ) + + # Critic: add terrain_scan (no noise, privileged) and true base velocity. + cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( + # func=custom_mdp.height_scan_custom, + func=envs_mdp.height_scan, + params={"sensor_name": "terrain_scan", "miss_value": 2.0}, + clip=(0.0, 2.0), + history_length=5, + ) + + # ------------------------------------------------------------------ + # Command ranges + # ------------------------------------------------------------------ + twist = cfg.commands["twist"] + assert isinstance(twist, UniformVelocityCommandCfg) + twist.ranges = UniformVelocityCommandCfg.Ranges( + lin_vel_x=(0.0, 1.0), + lin_vel_y=(0.0, 0.0), + ang_vel_z=(-0.5, 0.5), + heading=None, + ) + + # ------------------------------------------------------------------ + # Curriculum + # ------------------------------------------------------------------ + cfg.curriculum["command_vel"] = CurriculumTermCfg( + func=mdp.commands_vel, + params={ + "command_name": "twist", + "velocity_stages": [ + { + "step": 0, + "lin_vel_x": (0.0, 0.5), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.2, 0.2), + }, + { + "step": 5_000 * 24, + "lin_vel_x": (0.0, 1.0), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.5, 0.5), + }, + ], + }, + ) + + # --- Terrain reward weight adjustments for teacher training --- + cfg.rewards["terrain_stumble"].weight = -0.5 + # cfg.rewards["step_accuracy"].weight = 1.0 + + cfg.rewards.pop("pose", None) + cfg.rewards.pop("body_orientation_l2", None) + cfg.rewards.pop("foot_clearance", None) # incompatible with terrain + + cfg.rewards["track_linear_velocity"].weight = 3.5 + cfg.rewards["track_angular_velocity"].weight = 2.5 + cfg.rewards["flat_orientation"].weight = -7.0 + cfg.rewards["pelvis_orientation_l2"].weight = -3.0 + cfg.rewards["joint_deviation_hip"].weight = -0.3 + cfg.rewards["ang_vel_xy_l2"].weight = -0.1 + cfg.rewards["dof_torques_l2"].weight = -5e-8 + cfg.rewards["dof_vel_l2"].weight = -5e-7 + cfg.rewards["feet_flat_ori"].weight = -0.01 + cfg.rewards["body_ang_vel"].weight = -0.05 + cfg.rewards["angular_momentum"].weight = -0.001 + cfg.rewards["joint_acc_l2"].weight = -5.0e-7 + cfg.rewards["joint_pos_limits"].weight = -1.0 + cfg.rewards["action_rate_l2"].weight = -0.8 + cfg.rewards["foot_gait"].weight = 1.0 + cfg.rewards["feet_double_support"].weight = 2.0 + cfg.rewards["foot_slip"].weight = -0.4 + cfg.rewards["feet_close_xy"].weight = 1.0 + cfg.rewards["soft_landing"].weight = -1e-3 + cfg.rewards["dont_wait"].weight = -0.5 + cfg.rewards["stand_still"].weight = -1.0 + cfg.rewards["self_collisions"].weight = -2.0 + cfg.rewards["feet_air_time"].weight = 1.0 + cfg.rewards["feet_air_time_biped"].weight = 1.5 + cfg.rewards["terrain_foot_clearance"].weight = -0.5 + cfg.rewards["terrain_base_height"].weight = -1.5 + cfg.rewards["foot_edge"].weight = -0.5 + + if play: + cfg.episode_length_s = int(1e9) + cfg.observations["actor"].enable_corruption = False + cfg.events.pop("push_robot", None) + cfg.curriculum = {} + cfg.events["randomize_terrain"] = EventTermCfg( + func=envs_mdp.randomize_terrain, + mode="reset", + params={}, + ) + assert cfg.scene.terrain is not None + if cfg.scene.terrain.terrain_generator is not None: + cfg.scene.terrain.terrain_generator.curriculum = False + cfg.scene.terrain.terrain_generator.num_cols = 5 + cfg.scene.terrain.terrain_generator.num_rows = 5 + cfg.scene.terrain.terrain_generator.border_width = 10.0 + + twist_cmd = cfg.commands["twist"] + assert isinstance(twist_cmd, UniformVelocityCommandCfg) + twist_cmd.ranges.lin_vel_x = (0.4, 0.6) + twist_cmd.ranges.lin_vel_y = (0.0, 0.0) + twist_cmd.ranges.ang_vel_z = (0.0, 0.0) + + return cfg + + +def vr_m3_12dof_depth_map_env_cfg( + play: bool = False, +) -> VelocityEnvCfg: + cfg = vr_m3_12dof_perceptive_env_cfg(play=play) + + terrain_scan = RayCastSensorCfg( + name="terrain_scan", + frame=ObjRef(type="site", name="heightmap_site", entity="robot"), + pattern=GridPatternCfg( + size=(1.8, 1.2), + resolution=0.05, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=2.0, + include_geom_groups=(0, 1, 2), + exclude_parent_body=True, + debug_vis=play, + viz=RayCastSensorCfg.VizCfg(show_normals=True), + ) + depth_camera = NoisyGroupedRayCasterCameraCfg( + name="camera", + frame=ObjRef(type="body", name="pelvis", entity="robot"), + # RealSense depth camera D435 + # Intrinsics from camera_info: fx = fy = 386.56719970703125 at 640x480 + pattern=PinholeCameraPatternCfg( + height=int(480 / 8), + width=int(640 / 8), + fovy=2 + * math.degrees(math.atan(480 / 2 / 386.56719970703125)), # ~63.67 deg + ), + focal_length=1.0, + horizontal_aperture=640.0 / 386.56719970703125, # fovx ~79.24 deg + vertical_aperture=480.0 / 386.56719970703125, # fovy ~63.67 deg + ray_alignment="base", + include_geom_groups=(0, 1, 2), + exclude_parent_body=False, + offset=NoisyGroupedRayCasterCameraCfg.OffsetCfg( + pos=(0.00, 0.018, -0.1), + rot=( + math.cos(math.radians(60) / 2), # w + 0.0, # x + math.sin(math.radians(60) / 2), # y (pitch 60 deg about Y) + 0.0, # z + ), + convention="world", + ), + data_types=["distance_to_image_plane"], + depth_clipping_behavior="max", # clip to the maximum value + mesh_filter_max_hops=24, + noise_pipeline={ + "crop_and_resize": CropAndResizeCfg( + # (top, bottom, left, right), height/2 and centering width/2 + crop_region=(0, 0, 10, 10), + resize_shape=(30, 30), + ), + "gaussian_blur": GaussianBlurNoiseCfg(kernel_size=3, sigma=1), + "depth_normalization": DepthNormalizationCfg( + depth_range=(0.0, 2.5), + normalize=True, + output_range=(0.0, 1.0), + ), + }, + data_histories={"distance_to_image_plane_noised": 17}, + update_period=1 / 30, + min_distance=0.1, + max_distance=2.5, + debug_vis=play, + ) + undesired_contact_cfg = ContactSensorCfg( + name="undesired_contact_forces", + primary=ContactMatch( + mode="body", + pattern=".*", + entity="robot", + exclude=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + fields=("found", "force"), + reduce="netforce", + track_air_time=False, + history_length=3, + ) + + cfg.scene.sensors = cfg.scene.sensors + ( + terrain_scan, + depth_camera, + undesired_contact_cfg, + ) + + cfg.events["randomize_ray_offsets"] = EventTermCfg( + func=instinct_mdp.randomize_ray_offsets, + mode="startup", + params={ + "asset_cfg": SceneEntityCfg("camera"), + "offset_pose_ranges": { + "x": (-0.01, 0.01), + "y": (-0.01, 0.01), + "z": (-0.03, 0.01), + "roll": (-math.radians(2), math.radians(2)), + "pitch": (-math.radians(10), math.radians(10)), + "yaw": (-math.radians(2), math.radians(2)), + }, + "distribution": "uniform", + }, + ) + + cfg.observations["actor"].concatenate_terms = False + cfg.observations["critic"].concatenate_terms = False + + cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( + func=envs_mdp.height_scan, + params={"sensor_name": "terrain_scan", "miss_value": 2.0}, + clip=(0.0, 2.0), + ) + + cfg.observations["actor"].terms["depth_image"] = ObservationTermCfg( + func=instinct_mdp.delayed_visualizable_image, + params={ + "data_type": "distance_to_image_plane_noised_history", + "sensor_cfg": SceneEntityCfg("camera"), + "history_skip_frames": 5, + "num_output_frames": 4, + "delayed_frame_ranges": (0, 1), + "debug_vis": play, + }, + noise=None, + ) + + cfg.observations["critic"].terms["depth_image"] = ObservationTermCfg( + func=instinct_mdp.delayed_visualizable_image, + params={ + "data_type": "distance_to_image_plane_noised_history", + "sensor_cfg": SceneEntityCfg("camera"), + "history_skip_frames": 5, + "num_output_frames": 4, + "delayed_frame_ranges": (0, 1), + "debug_vis": play, + }, + noise=None, + ) + + # Add "policy" alias for actor obs (Instinct runner expects "policy"). + actor_obs_cfg = cfg.observations.pop("actor") + cfg.observations["policy"] = actor_obs_cfg + + # ------------------------------------------------------------------ + # Command ranges + # ------------------------------------------------------------------ + twist = cfg.commands["twist"] + assert isinstance(twist, UniformVelocityCommandCfg) + twist.ranges = UniformVelocityCommandCfg.Ranges( + lin_vel_x=(0.0, 1.0), + lin_vel_y=(0.0, 0.0), + ang_vel_z=(-0.5, 0.5), + heading=None, + ) + + # ------------------------------------------------------------------ + # Curriculum + # ------------------------------------------------------------------ + cfg.curriculum["command_vel"] = CurriculumTermCfg( + func=mdp.commands_vel, + params={ + "command_name": "twist", + "velocity_stages": [ + { + "step": 0, + "lin_vel_x": (0.0, 0.5), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.2, 0.2), + }, + { + "step": 5_000 * 24, + "lin_vel_x": (0.0, 1.0), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.5, 0.5), + }, + ], + }, + ) + + # --- Terrain reward weight adjustments for teacher training --- + cfg.rewards["terrain_stumble"].weight = -0.5 + # cfg.rewards["step_accuracy"].weight = 1.0 + + cfg.rewards.pop("pose", None) + cfg.rewards.pop("body_orientation_l2", None) + cfg.rewards.pop("foot_clearance", None) # incompatible with terrain + + cfg.rewards["track_linear_velocity"].weight = 3.5 + cfg.rewards["track_angular_velocity"].weight = 3.0 + cfg.rewards["flat_orientation"].weight = -7.0 + cfg.rewards["pelvis_orientation_l2"].weight = -3.0 + cfg.rewards["joint_deviation_hip"].weight = -0.3 + cfg.rewards["ang_vel_xy_l2"].weight = -0.1 + cfg.rewards["dof_torques_l2"].weight = -1e-8 + cfg.rewards["dof_vel_l2"].weight = -5e-7 + cfg.rewards["feet_flat_ori"].weight = -0.01 + cfg.rewards["body_ang_vel"].weight = -0.05 + cfg.rewards["angular_momentum"].weight = -0.001 + cfg.rewards["joint_acc_l2"].weight = -5.0e-7 + cfg.rewards["joint_pos_limits"].weight = -1.0 + cfg.rewards["action_rate_l2"].weight = -0.8 + cfg.rewards["foot_gait"].weight = 2.0 + cfg.rewards["feet_double_support"].weight = 1.5 + cfg.rewards["foot_slip"].weight = -0.4 + cfg.rewards["feet_close_xy"].weight = 1.0 + cfg.rewards["soft_landing"].weight = -1e-3 + cfg.rewards["dont_wait"].weight = -1.0 + cfg.rewards["stand_still"].weight = -1.0 + cfg.rewards["self_collisions"].weight = -2.0 + cfg.rewards["feet_air_time"].weight = 1.0 + cfg.rewards["feet_air_time_biped"].weight = 2.0 + cfg.rewards["terrain_foot_clearance"].weight = -0.5 + cfg.rewards["terrain_base_height"].weight = -1.5 + cfg.rewards["foot_edge"].weight = -0.5 + + cfg.rewards = { + **cfg.rewards, + "feet_slide": RewardTermCfg( + func=instinct_parkour_mdp.feet_slide, + weight=-0.4, + params={ + "sensor_name": "feet_ground_contact", + "asset_cfg": SceneEntityCfg( + "robot", + body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + "threshold": 1.0, + }, + ), + # "joint_deviation_hip": RewardTermCfg( + # func=instinct_mdp.joint_deviation_square, + # weight=-0.3, + # params={ + # "asset_cfg": SceneEntityCfg( + # "robot", + # joint_names=(".*_hip_yaw_joint", ".*_hip_roll_joint"), + # ) + # }, + # ), + # "ang_vel_xy_l2": RewardTermCfg( + # func=instinct_parkour_mdp.ang_vel_xy_l2, + # weight=-0.05, + # ), + # "dof_torques_l2": RewardTermCfg( + # func=instinct_parkour_mdp.joint_torques_l2, + # weight=-1.0e-7, + # params={ + # "asset_cfg": SceneEntityCfg( + # "robot", + # joint_names=(".*_hip_.*", ".*_knee_.*", ".*_ankle_.*"), + # ) + # }, + # ), + # "dof_vel_l2": RewardTermCfg( + # func=envs_mdp.joint_vel_l2, + # weight=-5.0e-7, + # params={"asset_cfg": SceneEntityCfg("robot", joint_names=(".*",))}, + # ), + # "feet_flat_ori": RewardTermCfg( + # func=instinct_parkour_mdp.feet_orientation_contact, + # weight=-0.01, + # params={ + # "sensor_name": "feet_ground_contact", + # "asset_cfg": SceneEntityCfg( + # "robot", + # body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + # ), + # }, + # ), + # "feet_close_xy": RewardTermCfg( + # func=instinct_parkour_mdp.feet_close_xy_gauss, + # weight=1.0, + # params={ + # "threshold": 0.2, + # "asset_cfg": SceneEntityCfg( + # "robot", + # body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + # ), + # "std": math.sqrt(0.05), + # }, + # ), + # "energy": RewardTermCfg( + # func=parkour_mdp.rewards.motors_power_square, + # weight=-1.0e-8, + # params={ + # "asset_cfg": SceneEntityCfg( + # "robot", + # joint_names=(".*_hip_.*", ".*_knee_.*", ".*_ankle_.*"), + # ), + # "normalize_by_stiffness": True, + # }, + # ), + "dof_pos_limits": RewardTermCfg( + func=envs_mdp.joint_pos_limits, + weight=-1.0, + params={"asset_cfg": SceneEntityCfg("robot", joint_names=(".*",))}, + ), + # "flat_orientation": RewardTermCfg(func=mdp.flat_orientation_l2, weight=-7.0), + # "pelvis_orientation_l2": RewardTermCfg( + # func=instinct_parkour_mdp.link_orientation, + # weight=-3.0, + # params={"asset_cfg": SceneEntityCfg("robot", body_names="pelvis")}, + # ), + } + + if play: + cfg.episode_length_s = int(1e9) + cfg.observations["policy"].enable_corruption = False + cfg.events.pop("push_robot", None) + cfg.curriculum = {} + cfg.events["randomize_terrain"] = EventTermCfg( + func=envs_mdp.randomize_terrain, + mode="reset", + params={}, + ) + assert cfg.scene.terrain is not None + if cfg.scene.terrain.terrain_generator is not None: + cfg.scene.terrain.terrain_generator.curriculum = False + cfg.scene.terrain.terrain_generator.num_cols = 5 + cfg.scene.terrain.terrain_generator.num_rows = 5 + cfg.scene.terrain.terrain_generator.border_width = 10.0 + + twist_cmd = cfg.commands["twist"] + assert isinstance(twist_cmd, UniformVelocityCommandCfg) + twist_cmd.ranges.lin_vel_x = (0.4, 0.6) + twist_cmd.ranges.lin_vel_y = (0.0, 0.0) + twist_cmd.ranges.ang_vel_z = (0.0, 0.0) + + return cfg + + +def vr_m3_12dof_foothold_env_cfg(play: bool = False) -> VelocityEnvCfg: + """FastStair Stage 1 — planner-guided pre-training (paper §III-B.3). + + Extends ``vr_m3_12dof_height_map_env_cfg`` with: + + - A 1.8 × 1.2 m elevation map at 5 cm resolution (paper §III-C). + - The DCM-based foothold planner exposed as a ``FootholdCommand``. + - The exponential foothold-tracking reward with weight 0.6 (Table I §III-B.2). + - A privileged ``foothold_target`` observation on the critic. + - Velocity range restricted to the paper's pre-train regime + ``[-0.3, 1.0]`` m/s in x. + - Stage 1 reward weights from Table I. + """ + cfg = vr_m3_12dof_perceptive_env_cfg(play=play) + + terrain_scan = RayCastSensorCfg( + name="terrain_scan", + frame=ObjRef(type="body", name="pelvis", entity="robot"), + pattern=GridPatternCfg( + size=(1.8, 1.2), + resolution=0.05, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=2.0, + include_geom_groups=(0,), + exclude_parent_body=True, + debug_vis=play, + viz=RayCastSensorCfg.VizCfg(show_normals=True), + ) + depth_camera = NoisyGroupedRayCasterCameraCfg( + name="camera", + frame=ObjRef(type="body", name="pelvis", entity="robot"), + # RealSense depth camera D435 + # Intrinsics from camera_info: fx = fy = 386.56719970703125 at 640x480 + pattern=PinholeCameraPatternCfg( + height=int(480 / 8), + width=int(640 / 8), + fovy=2 + * math.degrees(math.atan(480 / 2 / 386.56719970703125)), # ~63.67 deg + ), + focal_length=1.0, + horizontal_aperture=640.0 / 386.56719970703125, # fovx ~79.24 deg + vertical_aperture=480.0 / 386.56719970703125, # fovy ~63.67 deg + ray_alignment="base", + include_geom_groups=(0, 1, 2), + exclude_parent_body=False, + # TODO: double check with Offset from URDF + offset=NoisyGroupedRayCasterCameraCfg.OffsetCfg( + pos=(0.00, 0.018, -0.1), + rot=( + math.cos(math.radians(60) / 2), # w + 0.0, # x + math.sin(math.radians(60) / 2), # y (pitch 30 deg about Y) + 0.0, # z + ), + convention="world", + ), + data_types=["distance_to_image_plane"], + depth_clipping_behavior="max", # clip to the maximum value + mesh_filter_max_hops=24, + noise_pipeline={ + "crop_and_resize": CropAndResizeCfg( + # (top, bottom, left, right), height/2 and centering width/2 + crop_region=(0, 0, 10, 10), + resize_shape=(7, 7), + ), + "gaussian_blur": GaussianBlurNoiseCfg(kernel_size=3, sigma=1), + "depth_normalization": DepthNormalizationCfg( + depth_range=(0.0, 2.5), + normalize=True, + output_range=(0.0, 1.0), + ), + }, + data_histories={"distance_to_image_plane_noised": 17}, + update_period=1 / 30, + min_distance=0.1, + max_distance=2.5, + debug_vis=play, + ) + undesired_contact_cfg = ContactSensorCfg( + name="undesired_contact_forces", + primary=ContactMatch( + mode="body", + pattern=".*", + entity="robot", + exclude=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + fields=("found", "force"), + reduce="netforce", + track_air_time=False, + history_length=3, + ) + + cfg.scene.sensors = tuple( + s + for s in (cfg.scene.sensors or ()) + if s.name not in ("left_foot_gradient", "right_foot_gradient") + ) + + cfg.scene.sensors = cfg.scene.sensors + ( + terrain_scan, + depth_camera, + undesired_contact_cfg, + ) + + cfg.events["randomize_ray_offsets"] = EventTermCfg( + func=instinct_mdp.randomize_ray_offsets, + mode="startup", + params={ + "asset_cfg": SceneEntityCfg("camera"), + "offset_pose_ranges": { + "x": (-0.01, 0.01), + "y": (-0.01, 0.01), + "z": (-0.03, 0.01), + "roll": (-math.radians(2), math.radians(2)), + "pitch": (-math.radians(10), math.radians(10)), + "yaw": (-math.radians(2), math.radians(2)), + }, + "distribution": "uniform", + }, + ) + + # Foothold command — the planner output. + cfg.commands["foothold"] = mdp.FootholdCommandCfg( + entity_name="robot", + terrain_sensor_name="terrain_scan", + contact_sensor_name="feet_ground_contact", + velocity_command_name="twist", + foot_site_names=FOOT_SITES, + gait_period=GAIT_CYCLE_PERIOD, + nominal_height_m=0.9, + lateral_inter_foot_m=0.22, + foot_footprint_m=(0.25, 0.10), + search_window_m=(0.6, 0.6), + elevation_size_m=(1.8, 1.2), + elevation_resolution_m=0.05, + alpha_pos=1.0, + alpha_dcm=0.5, + # Safety-aware terrain scoring (max-pool steepness + footprint + # flatness + soft height feasibility + climb bonus). See + # ``DCMFootholdPlanner`` docstring for the rationale. + alpha_steepness=0.6, + alpha_flatness=4.0, + alpha_height=6.0, + alpha_climb_bonus=1.5, + lateral_pos_weight=2.5, + max_step_height_m=0.25, + climb_velocity_threshold=0.1, + standing_threshold=0.1, + # Adaptive Bézier clearance: 5 cm base on flat ground, +0.5 m/m of + # step height, capped at 20 cm. + apex_clearance_m=0.05, + clearance_scale=0.5, + max_clearance_m=0.20, + pre_apex_lower_window=0.05, + pre_apex_upper_window=0.05, + post_apex_lower_window=0.1, + post_apex_upper_window=0.15, + terrain_decision_threshold=0.1, + debug_vis=play, + ) + + cfg.observations["actor"].concatenate_terms = False + cfg.observations["critic"].concatenate_terms = False + + # cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( + # func=envs_mdp.height_scan, + # params={"sensor_name": "terrain_scan", "miss_value": 2.0}, + # clip=(0.0, 2.0), + # ) + + # Privileged critic observation: planner output (body frame). + cfg.observations["critic"].terms["foothold_target"] = ObservationTermCfg( + func=mdp.foothold_target, + params={"command_name": "foothold"}, + ) + + cfg.observations["actor"].terms["depth_image"] = ObservationTermCfg( + func=instinct_mdp.delayed_visualizable_image, + params={ + "data_type": "distance_to_image_plane_noised_history", + "sensor_cfg": SceneEntityCfg("camera"), + "history_skip_frames": 5, + "num_output_frames": 4, + "delayed_frame_ranges": (0, 1), + "debug_vis": play, + }, + noise=None, + ) + + cfg.observations["critic"].terms["depth_image"] = ObservationTermCfg( + func=instinct_mdp.delayed_visualizable_image, + params={ + "data_type": "distance_to_image_plane_noised_history", + "sensor_cfg": SceneEntityCfg("camera"), + "history_skip_frames": 5, + "num_output_frames": 4, + "delayed_frame_ranges": (0, 1), + "debug_vis": play, + }, + noise=None, + ) + + # add "policy" alias for actor obs for instinct compatibility + actor_obs_cfg = cfg.observations.pop("actor") + cfg.observations["policy"] = actor_obs_cfg + + # ------------------------------------------------------------------ + # Command ranges + # ------------------------------------------------------------------ + twist = cfg.commands["twist"] + assert isinstance(twist, UniformVelocityCommandCfg) + + twist.ranges = UniformVelocityCommandCfg.Ranges( + lin_vel_x=(0.0, 1.0), + lin_vel_y=(0.0, 0.0), + ang_vel_z=(-0.5, 0.5), + heading=None, + ) + + # Pre-train velocity range (paper §III-B.3). + # twist_cmd = cfg.commands["twist"] + # assert isinstance(twist_cmd, UniformVelocityCommandCfg) + # twist_cmd.ranges = UniformVelocityCommandCfg.Ranges( + # lin_vel_x=(-0.3, 1.0), + # lin_vel_y=(-0.3, 0.3), + # ang_vel_z=(-1.0, 1.0), + # heading=None, + # ) + # twist_cmd.resampling_time_range = (8.0, 12.0) + # cfg.curriculum.pop("command_vel", None) + + # ------------------------------------------------------------------ + # Curriculum + # ------------------------------------------------------------------ + cfg.curriculum["command_vel"] = CurriculumTermCfg( + func=mdp.commands_vel, + params={ + "command_name": "twist", + "velocity_stages": [ + { + "step": 0, + "lin_vel_x": (0.0, 0.6), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.2, 0.2), + }, + { + "step": 5_000 * 24, + "lin_vel_x": (0.0, 1.2), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.5, 0.5), + }, + { + "step": 10_000 * 24, + "lin_vel_x": (-0.5, 1.2), + "lin_vel_y": (-0.5, 0.5), + "ang_vel_z": (-0.5, 0.5), + }, + { + "step": 20_000 * 24, + "lin_vel_x": (-0.8, 1.5), + "lin_vel_y": (-0.5, 0.5), + "ang_vel_z": (-1.2, 1.2), + }, + ], + }, + ) + + # --- Terrain reward weight adjustments for teacher training --- + cfg.rewards["terrain_stumble"].weight = -0.5 + # cfg.rewards["step_accuracy"].weight = 1.0 + + cfg.rewards.pop("pose", None) + cfg.rewards.pop("body_orientation_l2", None) + cfg.rewards.pop("foot_clearance", None) # incompatible with terrain + + cfg.rewards["track_linear_velocity"].weight = 3.5 + cfg.rewards["track_angular_velocity"].weight = 3.0 + cfg.rewards["flat_orientation"].weight = -7.0 + cfg.rewards["pelvis_orientation_l2"].weight = -3.0 + cfg.rewards["joint_deviation_hip"].weight = -0.3 + cfg.rewards["ang_vel_xy_l2"].weight = -0.1 + cfg.rewards["dof_torques_l2"].weight = -1e-8 + cfg.rewards["dof_vel_l2"].weight = -5e-7 + cfg.rewards["feet_flat_ori"].weight = -0.01 + cfg.rewards["body_ang_vel"].weight = -0.05 + cfg.rewards["angular_momentum"].weight = -0.001 + cfg.rewards["joint_acc_l2"].weight = -5.0e-7 + cfg.rewards["joint_pos_limits"].weight = -1.0 + cfg.rewards["action_rate_l2"].weight = -0.8 + cfg.rewards["foot_gait"].weight = 2.0 + cfg.rewards["feet_double_support"].weight = 1.5 + cfg.rewards["foot_slip"].weight = -0.4 + cfg.rewards["feet_close_xy"].weight = 1.0 + cfg.rewards["soft_landing"].weight = -1e-3 + cfg.rewards["dont_wait"].weight = -1.0 + cfg.rewards["stand_still"].weight = -1.0 + cfg.rewards["self_collisions"].weight = -2.0 + cfg.rewards["feet_air_time"].weight = 1.0 + cfg.rewards["feet_air_time_biped"].weight = 2.0 + cfg.rewards["terrain_foot_clearance"].weight = -0.5 + cfg.rewards["terrain_base_height"].weight = -1.5 + # cfg.rewards["foot_edge"].weight = -0.5 + cfg.rewards.pop("foot_edge", None) + + cfg.rewards = { + **cfg.rewards, + "feet_slide": RewardTermCfg( + func=instinct_parkour_mdp.feet_slide, + weight=-0.4, + params={ + "sensor_name": "feet_ground_contact", + "asset_cfg": SceneEntityCfg( + "robot", + body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + "threshold": 1.0, + }, + ), + # "energy": RewardTermCfg( + # func=parkour_mdp.rewards.motors_power_square, + # weight=-1.0e-8, + # params={ + # "asset_cfg": SceneEntityCfg( + # "robot", + # joint_names=(".*_hip_.*", ".*_knee_.*", ".*_ankle_.*"), + # ), + # "normalize_by_stiffness": True, + # }, + # ), + "dof_pos_limits": RewardTermCfg( + func=envs_mdp.joint_pos_limits, + weight=-1.0, + params={"asset_cfg": SceneEntityCfg("robot", joint_names=(".*",))}, + ), + } + + cfg.rewards["foothold_tracking"] = RewardTermCfg( + func=mdp.foothold_tracking, + weight=2.1, + params={ + "command_name": "foothold", + "sigma_stages": [(10.0, 5.0), (20.0, 10.0), (30.0, 15.0)], + "stage_step_counts": [0, 4_000 * 24, 8_000 * 24], + "asset_cfg": SceneEntityCfg( + "robot", + site_names=FOOT_SITES, + body_names=("left_ankle_roll_link", "right_ankle_roll_link"), + ), + "sensor_name": "feet_ground_contact", + "velocity_command_name": "twist", + "velocity_command_threshold": 0.1, + # "log_csv_path": "foothold_tracking_rewards.csv" if play else None, + }, + ) + # cfg.rewards["track_linear_velocity"].weight = 1.0 + # if "action_rate_l2" in cfg.rewards: + # cfg.rewards["action_rate_l2"].weight = -2.5e-3 + # if "joint_acc_l2" in cfg.rewards: + # cfg.rewards["joint_acc_l2"].weight = -5.0e-7 + # if "dof_torques_l2" in cfg.rewards: + # cfg.rewards["dof_torques_l2"].weight = -4.0e-7 + # if "dof_vel_l2" in cfg.rewards: + # cfg.rewards["dof_vel_l2"].weight = -2.5e-7 + # if "foot_edge" in cfg.rewards: + # cfg.rewards["foot_edge"].weight = -1.5 + + if play: + cfg.episode_length_s = int(1e9) + cfg.observations["policy"].enable_corruption = False + cfg.events.pop("push_robot", None) + cfg.curriculum = {} + cfg.events["randomize_terrain"] = EventTermCfg( + func=envs_mdp.randomize_terrain, + mode="reset", + params={}, + ) + assert cfg.scene.terrain is not None + if cfg.scene.terrain.terrain_generator is not None: + cfg.scene.terrain.terrain_generator.curriculum = False + cfg.scene.terrain.terrain_generator.num_cols = 5 + cfg.scene.terrain.terrain_generator.num_rows = 5 + cfg.scene.terrain.terrain_generator.border_width = 10.0 + + twist_cmd = cfg.commands["twist"] + assert isinstance(twist_cmd, UniformVelocityCommandCfg) + twist_cmd.ranges.lin_vel_x = (0.4, 0.6) + twist_cmd.ranges.lin_vel_y = (0.0, 0.0) + twist_cmd.ranges.ang_vel_z = (0.0, 0.0) + + return cfg + + +def vr_m3_12dof_ga_phl_env_cfg(play: bool = False) -> VelocityEnvCfg: + """GA-PHL perceptive locomotion config for VR-M3 12DOF. + + Implements arXiv:2512.07464 (Gait-Adaptive Perceptive Humanoid Locomotion + with Real-Time Under-Base Terrain Reconstruction): + + - Downward-facing under-base depth camera (§III-E): replaces the 60° forward + camera with a 90° downward camera, covering the critical foot-support region. + - Omnidirectional velocity commands with a 3-stage curriculum (§IV-B). + - Reward weights matched to paper Table I as closely as possible using the + existing reward functions in this codebase. + + Based on ``vr_m3_12dof_foothold_env_cfg`` (inherits foothold planner, terrain + scan, depth image obs, and domain randomisation). Not implemented here because + they require framework-level extensions: + - U-Net height-map reconstruction (separate offline model). + - Successive Teacher-Student runner (runner-level, not env-level). + """ + cfg = vr_m3_12dof_foothold_env_cfg(play=play) + + cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( + func=mdp.height_map_as_grid, + params={ + "sensor_name": "terrain_scan", + "miss_value": 2.0, + "use_grid": True, + "num_cols": int((1.8 + 1e-6) / 0.05) + 1, + "num_rows": int((1.2 + 1e-6) / 0.05) + 1, + }, + clip=(0.0, 2.0), + history_length=1, + flatten_history_dim=False, + ) + + cfg.observations["critic"].terms.pop("depth_image") + + cfg.commands["foothold"] = mdp.FootholdCommandCfg( + entity_name="robot", + terrain_sensor_name="terrain_scan", + contact_sensor_name="feet_ground_contact", + velocity_command_name="twist", + foot_site_names=FOOT_SITES, + gait_period="policy", + gait_action_name="gait_freq", + nominal_height_m=0.9, + lateral_inter_foot_m=0.18, + foot_footprint_m=(0.20, 0.10), + search_window_m=(0.6, 0.6), + elevation_size_m=(1.8, 1.2), + elevation_resolution_m=0.05, + alpha_pos=1.0, + alpha_dcm=0.5, + # Safety-aware terrain scoring (max-pool steepness + footprint + # flatness + soft height feasibility + climb bonus). See + # ``DCMFootholdPlanner`` docstring for the rationale. + alpha_steepness=0.6, + alpha_flatness=4.0, + alpha_height=6.0, + alpha_climb_bonus=1.5, + lateral_pos_weight=2.5, + max_step_height_m=0.25, + climb_velocity_threshold=0.1, + standing_threshold=0.1, + # Adaptive Bézier clearance: 5 cm base on flat ground, +0.5 m/m of + # step height, capped at 20 cm. + apex_clearance_m=0.05, + clearance_scale=0.5, + max_clearance_m=0.20, + pre_apex_lower_window=0.05, + pre_apex_upper_window=0.05, + post_apex_lower_window=0.1, + post_apex_upper_window=0.15, + terrain_decision_threshold=0.1, + debug_vis=play, + ) + + cfg.rewards["foothold_tracking"] = RewardTermCfg( + func=mdp.foothold_tracking, + weight=2.0, + params={ + "command_name": "foothold", + "sigma_stages": [(10.0, 5.0), (20.0, 10.0), (30.0, 15.0)], + "stage_step_counts": [0, 4_000 * 24, 8_000 * 24], + "asset_cfg": SceneEntityCfg( + "robot", + site_names=FOOT_SITES, + body_names=FOOT_LINK_NAMES, + ), + "sensor_name": "feet_ground_contact", + "velocity_command_name": "twist", + "velocity_command_threshold": 0.1, + "penalty_scale": 1.0, + # "log_csv_path": "foothold_tracking_rewards.csv" if play else None, + }, + ) + + # Route foot_gait and feet_double_support to the learnable phase φ_t so + # the gait reward is consistent with the policy's own internal clock. + cfg.observations["critic"].terms["knee_reference"].params[ + "action_name" + ] = "gait_freq" + cfg.rewards["foot_gait"].params["action_name"] = "gait_freq" + cfg.rewards["feet_double_support"].params["action_name"] = "gait_freq" + cfg.rewards["feet_air_time"].params["action_name"] = "gait_freq" + + cfg.actions["gait_freq"] = mdp.GaitFrequencyActionCfg( + entity_name="robot", + min_frequency=1.0, + max_frequency=1.5, + smooth_alpha=0.2, + default_frequency=1.2, + ) + + # ── 6. Adaptive gait-phase observation (replaces fixed-period phase obs) ── + # Returns [f_t, sin(2π·φ_t), cos(2π·φ_t)] — 3 scalars instead of 2. + # Both policy and critic groups inherit the same proprioceptive terms. + for group_name in ("policy", "critic"): + cfg.observations[group_name].terms.pop("gait_phase", None) + cfg.observations[group_name].terms["adaptive_gait_phase"] = ObservationTermCfg( + func=mdp.adaptive_gait_phase, + params={"action_name": "gait_freq", "command_name": "twist"}, + history_length=5, + flatten_history_dim=True, + ) + + # ── 7. Gait action limit penalty ───────────────────────────────────────── + # Small penalty for pushing f_t outside the valid band (paper §III-C). + cfg.rewards["gait_action_limit"] = RewardTermCfg( + func=mdp.gait_action_limit, + weight=-0.25, + params={"action_name": "gait_freq"}, + ) + + # ------------------------------------------------------------------ + # Curriculum + # ------------------------------------------------------------------ + cfg.curriculum["command_vel"] = CurriculumTermCfg( + func=mdp.commands_vel, + params={ + "command_name": "twist", + "velocity_stages": [ + { + "step": 0, + "lin_vel_x": (0.0, 0.5), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.2, 0.2), + }, + { + "step": 4_000 * 24, + "lin_vel_x": (0.0, 1.0), + "lin_vel_y": (0.0, 0.0), + "ang_vel_z": (-0.5, 0.5), + }, + ], + }, + ) + + # --- Terrain reward weight adjustments for training --- + # cfg.rewards["step_accuracy"].weight = 1.0 + cfg.rewards.pop("pose", None) + cfg.rewards.pop("body_orientation_l2", None) + cfg.rewards.pop("foot_clearance", None) # NOT work with terrain + + cfg.rewards["track_linear_velocity"].weight = 3.5 + cfg.rewards["track_angular_velocity"].weight = 3.0 + cfg.rewards["flat_orientation"].weight = -7.0 + cfg.rewards["pelvis_orientation_l2"].weight = -3.0 + cfg.rewards["joint_deviation_hip"].weight = -0.3 + cfg.rewards["ang_vel_xy_l2"].weight = -0.1 + cfg.rewards["dof_torques_l2"].weight = -1e-7 + cfg.rewards["dof_vel_l2"].weight = -5e-7 + cfg.rewards["feet_flat_ori"].weight = -0.01 + cfg.rewards["body_ang_vel"].weight = -0.05 + cfg.rewards["angular_momentum"].weight = -0.001 + cfg.rewards["joint_acc_l2"].weight = -5.0e-7 + cfg.rewards["joint_pos_limits"].weight = -1.0 + cfg.rewards["action_rate_l2"].weight = -0.8 + cfg.rewards["foot_gait"].weight = 2.0 + cfg.rewards["feet_double_support"].weight = 1.5 + cfg.rewards["foot_slip"].weight = -0.4 + cfg.rewards["feet_close_xy"].weight = 1.0 + cfg.rewards["soft_landing"].weight = -1e-3 + cfg.rewards["dont_wait"].weight = -1.0 + cfg.rewards["stand_still"].weight = -2.0 + cfg.rewards["self_collisions"].weight = -2.0 + # cfg.rewards["feet_air_time"].weight = 1.0 + # cfg.rewards["terrain_foot_clearance"].weight = -0.5 + cfg.rewards["feet_air_time_biped"].weight = 3.0 + cfg.rewards["terrain_base_height"].weight = -1.5 + cfg.rewards.pop( + "terrain_foot_clearance", None + ) # Not compatible with heightmap-based foothold planning + cfg.rewards.pop("foot_gait", None) # phase-locked, conflicts with foothold planner + cfg.rewards.pop("feet_double_support", None) # same problem + cfg.rewards.pop( + "feet_air_time", None + ) # Remove air time reward which can conflict with foothold planning + + # Experiment with new foothold penalties + cfg.rewards.pop("foot_edge", None) + cfg.rewards["terrain_stumble"].weight = -1.0 + + return cfg + + +def _create_multi_critic_cfg_from_single_critic( + cfg: VelocityEnvCfg, +) -> MultiCriticManagerBasedRlEnvCfg: + """Helper to copy a single-critic config to multi-critic format.""" + new_cfg = MultiCriticManagerBasedRlEnvCfg( + decimation=cfg.decimation, scene=cfg.scene + ) + new_cfg.observations = deepcopy(cfg.observations) + new_cfg.actions = deepcopy(cfg.actions) + new_cfg.events = deepcopy(cfg.events) + new_cfg.sim = deepcopy(cfg.sim) + new_cfg.viewer = deepcopy(cfg.viewer) + new_cfg.episode_length_s = cfg.episode_length_s + new_cfg.rewards = deepcopy(cfg.rewards) + new_cfg.terminations = deepcopy(cfg.terminations) + new_cfg.commands = deepcopy(cfg.commands) + new_cfg.curriculum = deepcopy(cfg.curriculum) + new_cfg.metrics = deepcopy(cfg.metrics) + new_cfg.is_finite_horizon = cfg.is_finite_horizon + new_cfg.scale_rewards_by_dt = cfg.scale_rewards_by_dt + + return new_cfg + + +def _create_critic_terrain_type_mapping( + cfg: MultiCriticManagerBasedRlEnvCfg, + terrain_type_list: list[str] = ["stair", "gap", "rough"], +): + # Use [stair, gap, rough] or [stair_up, stair_down, gap, rough] as the terrain + # types depending on the sub_terrains defined in the terrain generator config. + # In MJLab curriculum mode, each column is deterministically assigned to one + # sub-terrain by `_generate_curriculum_terrains`: + # sub_index = min(where(col / num_cols + 0.001 < cumsum(proportions))) + # `terrain.terrain_types` stores that column index per env, so to bucket envs + # by terrain category we map column_index -> sub_terrain class -> category. + + if terrain_type_list == ["stair", "gap", "rough"]: + terrain_type_mapping: dict[int, list[int]] = { + 0: [], # stair (both up and down) + 1: [], # gap + 2: [], # rough + } + elif terrain_type_list == ["stair_up", "stair_down", "gap", "rough"]: + terrain_type_mapping: dict[int, list[int]] = { + 0: [], # stair_up + 1: [], # stair_down + 2: [], # gap + 3: [], # rough + } + else: + raise ValueError( + "Unsupported terrain_type_list: {}. Only [stair, gap, rough] or " + "[stair_up, stair_down, gap, rough] are supported.".format( + terrain_type_list + ) + ) + + terrain_generator_cfg = cfg.scene.terrain.terrain_generator + if not terrain_generator_cfg.curriculum: + cfg.scene.terrain.terrain_generator.curriculum = True + + sub_terrains: dict[str, SubTerrainCfg] = terrain_generator_cfg.sub_terrains + sub_terrain_cfgs = list(sub_terrains.values()) + proportions = np.array([s.proportion for s in sub_terrain_cfgs], dtype=np.float64) + proportions /= proportions.sum() + cum_proportions = np.cumsum(proportions) + + num_cols = terrain_generator_cfg.num_cols + for col_idx in range(num_cols): + sub_index = int( + np.min(np.where(col_idx / num_cols + 0.001 < cum_proportions)[0]) + ) + class_name = sub_terrain_cfgs[sub_index].__class__.__name__ + if terrain_type_list == ["stair", "gap", "rough"]: + if "Stair" in class_name or "stair" in class_name: + terrain_type_mapping[0].append(col_idx) + elif "Gap" in class_name or "gap" in class_name: + terrain_type_mapping[1].append(col_idx) + else: + terrain_type_mapping[2].append(col_idx) + elif terrain_type_list == ["stair_up", "stair_down", "gap", "rough"]: + if "Stair" in class_name or "stair" in class_name: + if "BoxOpenStairsTerrainCfg" in class_name: + if sub_terrain_cfgs[sub_index].inverted == False: + terrain_type_mapping[0].append(col_idx) # stair_up + else: + terrain_type_mapping[1].append(col_idx) # stair_down + elif "BoxPyramidStairsTerrainCfg" in class_name: + terrain_type_mapping[0].append(col_idx) # stair_up + elif "BoxInvertedPyramidStairsTerrainCfg" in class_name: + terrain_type_mapping[1].append(col_idx) # stair_down + else: + raise ValueError( + "Unsupported stair type in class_name: {}. Only " + "BoxOpenStairsTerrainCfg, BoxPyramidStairsTerrainCfg, and " + "BoxInvertedPyramidStairsTerrainCfg are supported.".format( + class_name + ) + ) + elif class_name == "BoxSteppingStonesTerrainCfg": + terrain_type_mapping[2].append(col_idx) + else: + terrain_type_mapping[3].append(col_idx) + + # Drop empty buckets and re-index keys to be contiguous 0..N-1, so + # critic_labels emitted by the env line up exactly with critic head indices + # (otherwise the model has to clamp OOB labels, silently mis-routing envs). + non_empty = [v for v in terrain_type_mapping.values() if len(v) > 0] + cfg.critic_terrain_type_mapping = {i: v for i, v in enumerate(non_empty)} + if len(cfg.critic_terrain_type_mapping) == 0: + raise ValueError("No valid terrain types found in sub_terrains.") + if len(cfg.critic_terrain_type_mapping) < 2: + raise ValueError( + "At least 2 terrain types are required for multi-critic training." + ) + cfg.num_critics = len(cfg.critic_terrain_type_mapping) + + +def vr_m3_12dof_foothold_multi_critic_env_cfg( + play: bool = False, +) -> MultiCriticManagerBasedRlEnvCfg: + cfg = _create_multi_critic_cfg_from_single_critic( + vr_m3_12dof_foothold_env_cfg(play=play) + ) + _create_critic_terrain_type_mapping( + cfg, terrain_type_list=["stair_up", "stair_down", "gap", "rough"] + ) + + cfg.observations["actor"] = cfg.observations.pop("policy") + return cfg + + +def vr_m3_12dof_foothold_sts_multi_critic_env_cfg( + play: bool = False, +) -> MultiCriticManagerBasedRlEnvCfg: + cfg = _create_multi_critic_cfg_from_single_critic( + vr_m3_12dof_foothold_env_cfg(play=play) + ) + _create_critic_terrain_type_mapping( + cfg, terrain_type_list=["stair_up", "stair_down", "gap", "rough"] + ) + + cfg.observations["actor"] = cfg.observations.pop("policy") + cfg.observations["teacher_actor"] = deepcopy(cfg.observations["critic"]) + return cfg + + +def vr_m3_12dof_ga_phl_multi_critic_env_cfg( + play: bool = False, +) -> MultiCriticManagerBasedRlEnvCfg: + cfg = _create_multi_critic_cfg_from_single_critic( + vr_m3_12dof_ga_phl_env_cfg(play=play) + ) + _create_critic_terrain_type_mapping( + cfg, terrain_type_list=["stair_up", "stair_down", "gap", "rough"] + ) + + cfg.observations["actor"] = cfg.observations.pop("policy") + return cfg + + +def vr_m3_12dof_ga_phl_sts_multi_critic_env_cfg( + play: bool = False, +) -> MultiCriticManagerBasedRlEnvCfg: + cfg = _create_multi_critic_cfg_from_single_critic( + vr_m3_12dof_ga_phl_env_cfg(play=play) + ) + _create_critic_terrain_type_mapping( + cfg, terrain_type_list=["stair_up", "stair_down", "gap", "rough"] + ) + + cfg.observations["actor"] = cfg.observations.pop("policy") + cfg.observations["teacher_actor"] = deepcopy(cfg.observations["critic"]) + return cfg + + +# --------------------------------------------------------------------------- +# DWT Phase 1 — Asymmetric actor-critic sensors + Band-specific DR +# --------------------------------------------------------------------------- + +# Actor sensor: foreground scan (heightmap_site is 0.5 m ahead of pelvis in the +# pelvis body frame, so the grid covers 0–1 m forward and ±0.3 m lateral). +# GridPatternCfg(size=(0.6, 1.0), resolution=0.05) → 13 cols × 21 rows = 273 rays +_HM_NUM_Y = 21 # actor grid rows (fwd/back, y) +_HM_NUM_X = 13 # actor grid cols (left/right, x) + +# Critic sensor: full surrounding scan centered on the pelvis body. +# GridPatternCfg(size=(1.0, 1.0), resolution=0.05) → 21 cols × 21 rows = 441 rays +_HM_CRITIC_NUM_Y = 21 # critic grid rows +_HM_CRITIC_NUM_X = 21 # critic grid cols + + +def vr_m3_12dof_height_map_dwt_dr_env_cfg( + play: bool = False, +) -> "VelocityEnvCfg": + """Asymmetric actor-critic height-map env with DWT band-specific DR. + + Two separate raycasters replace the shared ``terrain_scan``: + + * **Actor** (``terrain_scan_actor``): foreground patch mounted at + ``heightmap_site`` (0.5 m ahead of pelvis), 0.6 × 1.0 m @ 0.05 m + resolution, ``include_geom_groups=(0, 1, 2)`` so the actor can detect + body geometry (self-collision awareness during foothold selection). + The height observation uses DWT band-specific domain randomisation to + simulate the real-sensor high-frequency dropout at stair edges. + + * **Critic** (``terrain_scan_critic``): full surrounding patch mounted at + the pelvis body origin, 1.0 × 1.0 m @ 0.05 m resolution, + ``include_geom_groups=(0,)`` (terrain only — body geometry does not + pollute privileged height values). The critic additionally receives a + log-scaled DWT energy ratio as a terrain-type signal. + """ + from src.tasks.velocity.mdp.terrain_classifier import terrain_energy_ratio + + cfg = vr_m3_12dof_height_map_env_cfg(play=play) + + # Remove the single shared terrain_scan added by the base height-map cfg. + cfg.scene.sensors = tuple(s for s in cfg.scene.sensors if s.name != "terrain_scan") + + # Actor sensor — foreground, groups 0-2 (terrain + body). + terrain_scan_actor = RayCastSensorCfg( + name="terrain_scan_actor", + frame=ObjRef(type="site", name="heightmap_site", entity="robot"), + pattern=GridPatternCfg( + size=(0.6, 1.0), + resolution=0.05, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=2.0, + include_geom_groups=(0, 1, 2), + exclude_parent_body=True, + debug_vis=play, + viz=RayCastSensorCfg.VizCfg(show_normals=True), + ) + + # Critic sensor — full surrounding, group 0 only (terrain, no body). + terrain_scan_critic = RayCastSensorCfg( + name="terrain_scan_critic", + frame=ObjRef(type="body", name="pelvis", entity="robot"), + pattern=GridPatternCfg( + size=(1.0, 1.0), + resolution=0.05, + direction=(0.0, 0.0, -1.0), + ), + ray_alignment="yaw", + max_distance=2.0, + include_geom_groups=(0,), + exclude_parent_body=True, + debug_vis=play, + viz=RayCastSensorCfg.VizCfg(show_normals=True), + ) + + cfg.scene.sensors = cfg.scene.sensors + (terrain_scan_actor, terrain_scan_critic) + + # Actor obs: DWT band-specific DR from the foreground sensor. + cfg.observations["actor"].terms["height_scan"] = ObservationTermCfg( + func=mdp.height_scan_dwt_aug, + params={ + "sensor_name": "terrain_scan_actor", + "num_y": _HM_NUM_Y, + "num_x": _HM_NUM_X, + "miss_value": 2.0, + "sigma_hh": 0.15, + "sigma_lh_hl": 0.05, + "sigma_ll": 0.02, + "attenuation_low": 0.3, + "attenuation_high": 1.0, + }, + clip=(0.0, 2.0), + history_length=5, + ) + + # Critic obs: clean surrounding heightmap (privileged, no noise). + cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( + func=envs_mdp.height_scan, + params={"sensor_name": "terrain_scan_critic", "miss_value": 2.0}, + clip=(0.0, 2.0), + history_length=5, + ) + + # Critic obs: DWT energy ratio from the surrounding scan. + cfg.observations["critic"].terms["terrain_energy_ratio"] = ObservationTermCfg( + func=terrain_energy_ratio, + params={ + "sensor_name": "terrain_scan_critic", + "num_y": _HM_CRITIC_NUM_Y, + "num_x": _HM_CRITIC_NUM_X, + "miss_value": 2.0, + }, + history_length=5, + ) + + if play: + cfg.observations["actor"].enable_corruption = False + + return cfg + + +# --------------------------------------------------------------------------- +# DWT Phase 2 — DWT Encoder + Band DR +# --------------------------------------------------------------------------- + + +def vr_m3_12dof_height_map_dwt_full_env_cfg( + play: bool = False, +) -> "VelocityEnvCfg": + """DWT encoder with band-specific DR (Phase 2). + + Extends ``vr_m3_12dof_height_map_dwt_dr_env_cfg`` for use with + ``InstinctOnPolicyRunner`` + ``EncoderActorCritic`` + ``DWTParallelLayer``: + + - Actor ``height_scan``: ``height_scan_dwt_aug_as_grid`` — returns a 2D + ``[B, num_y, num_x]`` grid with band-specific DR applied, so + ``DWTParallelLayer`` can reshape it to ``[B, 1, H, W]`` for + ``DWTHeadModel``. Band DR (σ_hh=0.15, σ_lh_hl=0.05, σ_ll=0.02) + simulates real-sensor high-frequency dropout. + - ``concatenate_terms=False`` on actor (mixed 2-D/1-D terms). + - ``"policy"`` obs-group alias added for the instinct runner. + - Critic unchanged from DWT-DR (clean flat surrounding scan + energy ratio). + """ + from copy import deepcopy as _dc + + cfg = vr_m3_12dof_height_map_dwt_dr_env_cfg(play=play) + + # Band-DR augmented 2D grid for the DWT encoder. + # Returns [B, num_y, num_x]; concatenate_terms=False avoids mixed-rank + # torch.stack — the instinct encoder system processes each component separately. + cfg.observations["actor"].terms["height_scan"] = ObservationTermCfg( + func=mdp.height_scan_dwt_aug_as_grid, + params={ + "sensor_name": "terrain_scan_actor", + "num_y": _HM_NUM_Y, + "num_x": _HM_NUM_X, + "miss_value": 2.0, + "sigma_hh": 0.15, + "sigma_lh_hl": 0.05, + "sigma_ll": 0.02, + "attenuation_low": 0.3, + "attenuation_high": 1.0, + }, + clip=(0.0, 2.0), + ) + cfg.observations["actor"].concatenate_terms = False + + # "policy" alias for instinct runner (policy_observation_group="policy"). + cfg.observations["policy"] = _dc(cfg.observations["actor"]) + + if play: + cfg.observations["actor"].enable_corruption = False + cfg.observations["policy"].enable_corruption = False + + return cfg + + +# --------------------------------------------------------------------------- +# DWT Phase 3 — Lightweight Obs & Reward Shaping +# --------------------------------------------------------------------------- + + +def vr_m3_12dof_height_map_dwt_dr_v2_env_cfg( + play: bool = False, +) -> "VelocityEnvCfg": + """DWT-DR v2: Phase 3 observations and reward terms added to the DWT-DR env. + + Builds on ``vr_m3_12dof_height_map_dwt_dr_env_cfg`` with zero architecture + changes. New critic observations (subband energy map, DWT entropy, cross-band + coherence) give the value function richer terrain-type signals at essentially + zero overhead. Both actor and critic gain a richer velocity representation. + Two DWT-based reward terms encourage action smoothness and gait symmetry. + + New critic obs: + * ``subband_energy_map`` — 4-channel squared energy of DWT subbands + * ``dwt_terrain_entropy`` — Shannon entropy of DWT coefficients [B, 1] + * ``dwt_subband_coherence`` — cross-band (LH/HH, HL/HH) coherence [B, 2] + + New actor+critic obs: + * ``base_lin_vel`` replaced by ``base_velocity_dwt_filtered`` [B, 4] + (vel_x, vel_y, vel_z, speed_xy) + + New rewards (both registered with weight=-1.0 — functions return positive): + * ``dwt_action_smoothness`` — penalise high-freq detail energy in actions + * ``dwt_gait_symmetry`` — penalise L/R joint oscillation asymmetry + """ + from src.tasks.velocity.mdp.terrain_classifier import ( + dwt_terrain_entropy, + dwt_subband_coherence, + ) + + cfg = vr_m3_12dof_height_map_dwt_dr_env_cfg(play=play) + + # -- Critic obs: subband energy map (4 × H' × W' flattened) -- + cfg.observations["critic"].terms["subband_energy_map"] = ObservationTermCfg( + func=mdp.subband_energy_map, + params={ + "sensor_name": "terrain_scan_critic", + "num_y": _HM_CRITIC_NUM_Y, + "num_x": _HM_CRITIC_NUM_X, + "miss_value": 2.0, + }, + ) + + # -- Critic obs: DWT coefficient entropy -- + cfg.observations["critic"].terms["dwt_terrain_entropy"] = ObservationTermCfg( + func=dwt_terrain_entropy, + params={ + "sensor_name": "terrain_scan_critic", + "num_y": _HM_CRITIC_NUM_Y, + "num_x": _HM_CRITIC_NUM_X, + "miss_value": 2.0, + }, + ) + + # -- Critic obs: cross-band coherence [B, 2] -- + cfg.observations["critic"].terms["dwt_subband_coherence"] = ObservationTermCfg( + func=dwt_subband_coherence, + params={ + "sensor_name": "terrain_scan_critic", + "num_y": _HM_CRITIC_NUM_Y, + "num_x": _HM_CRITIC_NUM_X, + "miss_value": 2.0, + }, + ) + + # -- Critic: augment base_lin_vel with speed_xy for richer velocity signal [B, 4] -- + # Actor has no linear velocity term (not available from real-robot sensors); + # only the critic gets this privileged signal during training. + cfg.observations["critic"].terms["base_lin_vel"] = ObservationTermCfg( + func=mdp.base_velocity_dwt_filtered, + params={"asset_cfg": SceneEntityCfg("robot")}, + ) + + # -- DWT action smoothness penalty (positive metric, negative weight in cfg) -- + cfg.rewards["dwt_action_smoothness"] = RewardTermCfg( + func=mdp.dwt_action_smoothness, + params={"action_name": "joint_pos", "lambda_hf": 0.01}, + weight=-1.0, + ) + + # -- DWT gait symmetry penalty (positive metric, negative weight in cfg) -- + cfg.rewards["dwt_gait_symmetry"] = RewardTermCfg( + func=mdp.dwt_gait_symmetry, + params={ + "left_cfg": SceneEntityCfg("robot", joint_names=r"left_.*"), + "right_cfg": SceneEntityCfg("robot", joint_names=r"right_.*"), + "lambda_sym": 0.01, + }, + weight=-1.0, + ) + + return cfg + + +# --------------------------------------------------------------------------- +# DWT Phase 4 — 1D Temporal DWT for Proprioceptive Signals +# --------------------------------------------------------------------------- + + +def vr_m3_12dof_height_map_dwt_proprioceptive_env_cfg( + play: bool = False, +) -> "VelocityEnvCfg": + """DWT Phase 4: temporal DWT obs for proprioceptive signals on top of DWT-DR-v2. + + Builds on ``vr_m3_12dof_height_map_dwt_dr_v2_env_cfg`` with zero architecture + and no history_length changes. Adds four new obs terms and one new reward: + + New **actor** obs (deployable — no privileged sensors): + * ``imu_dwt_filtered`` [B, 12] — DWT slow-trend + noise-energy of IMU history + * ``joint_history_dwt`` [B, 48] — DWT slow-trend + fast-transient energy of joint history + + New **critic** obs (privileged / training-only): + * ``grf_dwt_features`` [B, 12] — contact onset-sharpness from foot-force history + + New reward (register with weight=-1.0 to penalise oscillatory GRF): + * ``dwt_contact_quality`` — level-1 DWT HF energy in normal GRF + + All DWT terms use level=1 with the existing history_length=5, which satisfies + the Db4 minimum signal length (T>=4). Increase history_length and level to 2 + (requires T>=5 at level 1 and T>=9 for the level-2 recursion) for finer + frequency resolution. + """ + cfg = vr_m3_12dof_height_map_dwt_dr_v2_env_cfg(play=play) + + # -- Actor obs: DWT-compressed IMU (angular velocity + projected gravity) -- + # base_ang_vel and projected_gravity are already in actor_terms (h=5) and + # will be processed BEFORE this term in the obs group dict, populating their + # history buffers before imu_dwt_filtered reads them. + cfg.observations["actor"].terms["imu_dwt_filtered"] = ObservationTermCfg( + func=mdp.imu_dwt_filtered, + params={"obs_group": "actor", "level": 1}, + ) + + # -- Actor obs: DWT-compressed joint history (position + velocity) -- + cfg.observations["actor"].terms["joint_history_dwt"] = ObservationTermCfg( + func=mdp.joint_history_dwt, + params={"obs_group": "actor", "level": 1}, + ) + + # -- Critic obs: GRF onset-sharpness (critic-only; not deployable) -- + # foot_contact_forces is already in critic_terms (h=5); grf_dwt_features + # is appended AFTER it so the buffer is already updated when this runs. + cfg.observations["critic"].terms["grf_dwt_features"] = ObservationTermCfg( + func=mdp.grf_dwt_features, + params={"obs_group": "critic", "level": 1}, + ) + + # -- Reward: penalise oscillatory GRF (smooth, controlled foot placement) -- + cfg.rewards["dwt_contact_quality"] = RewardTermCfg( + func=mdp.dwt_contact_quality_reward, + params={"sensor_name": "feet_ground_contact", "lambda_quality": 0.005}, + weight=-1.0, + ) + + return cfg + + +# --------------------------------------------------------------------------- +# DWT Phase 5 — Depth Image DWT Encoder +# --------------------------------------------------------------------------- + + +def vr_m3_12dof_depth_map_dwt_enc_env_cfg( + play: bool = False, +) -> "VelocityEnvCfg": + """DWT Phase 5: depth map task using DepthDWTHeadModel encoder. + + Observation pipeline is identical to ``vr_m3_12dof_depth_map_env_cfg``. + The DWT encoding happens entirely in the network (``DWTParallelLayer`` + + ``DepthDWTHeadModel`` configured in ``vr_m3_12dof_depth_map_dwt_enc_rl_cfg``). + + Adds ``depth_obstacle_channel`` [B, 225] to the policy obs group as a + pre-computed DWT-based obstacle proximity feature (edge energy × inv-depth). + """ + cfg = vr_m3_12dof_depth_map_env_cfg(play=play) + + cfg.observations["policy"].terms["depth_obstacle_channel"] = ObservationTermCfg( + func=mdp.depth_obstacle_channel, + params={ + "sensor_cfg": SceneEntityCfg("camera"), + "image_h": 30, + "image_w": 30, + "data_type": "distance_to_image_plane_noised", + }, + noise=None, + ) + + return cfg + + +def vr_m3_12dof_foothold_depth_map_dwt_enc_env_cfg( + play: bool = False, +) -> "VelocityEnvCfg": + """DWT Phase 5 variant on the foothold base: DepthDWTHeadModel encoder + foothold planner. + + Inherits from ``vr_m3_12dof_foothold_env_cfg`` which already provides the depth + camera, "policy" obs alias, DCM foothold command, and foothold rewards. + + Adds ``depth_obstacle_channel`` [B, 225] to the policy obs group. + """ + cfg = vr_m3_12dof_foothold_env_cfg(play=play) + + cfg.observations["policy"].terms["depth_obstacle_channel"] = ObservationTermCfg( + func=mdp.depth_obstacle_channel, + params={ + "sensor_cfg": SceneEntityCfg("camera"), + "image_h": 30, + "image_w": 30, + "data_type": "distance_to_image_plane_noised", + }, + noise=None, + ) + + return cfg + + +def vr_m3_12dof_foothold_vr_rsl_rl_env_cfg( + play: bool = False, + mask_fraction: float = 0.7, +) -> MultiCriticManagerBasedRlEnvCfg: + cfg = vr_m3_12dof_foothold_env_cfg(play=play) + + cfg.observations["actor"] = cfg.observations.pop("policy") + + return cfg + +def vr_m3_12dof_foothold_fdf_env_cfg( + play: bool = False, + mask_fraction: float = 0.7, +) -> MultiCriticManagerBasedRlEnvCfg: + """Foothold task with Frequency-Domain Filtering (FDF) on the depth image. + + Replaces the raw delayed depth-image term from ``vr_m3_12dof_foothold_env_cfg`` + with an FFT-based low-pass filtered version (``mdp.depth_image_fft_lowpass_cls``): + a 2D FFT is applied per frame and the outer ``mask_fraction`` of the frequency + spectrum (by radial distance from the DC bin) is zeroed before reconstructing via + inverse FFT. A higher ``mask_fraction`` removes more high-frequency terrain/ + obstacle detail, simulating a lower-bandwidth depth sensor. + + To sweep masking strength (e.g. 0.1 / 0.3 / 0.5 / 0.7), edit this default. + """ + cfg = vr_m3_12dof_foothold_env_cfg(play=play) + + cfg.observations["actor"] = cfg.observations.pop("policy") + + for group in ("actor", "critic"): + base_term = cfg.observations[group].terms["depth_image"] + cfg.observations[group].terms["depth_image"] = replace( + base_term, + func=mdp.depth_image_fft_lowpass_cls(), + params={**base_term.params, "mask_fraction": mask_fraction}, + ) + + return cfg + + +def vr_m3_12dof_foothold_no_depth_env_cfg(play: bool = False) -> VelocityEnvCfg: + """``vr_m3_12dof_foothold_env_cfg`` with the depth camera removed. + + Drops the depth camera sensor, its ray-offset randomization event, and the + ``depth_image`` observation terms. The DCM foothold planner still reads the + wide-FOV ``terrain_scan`` elevation map, so foothold planning/tracking are + unaffected -- only the visual depth-image observation is removed. + + With no image term left to keep unconcatenated, the obs groups revert to + plain concatenated "actor"/"critic" tensors, so this task trains with a + standard MLP policy instead of a CNN/image encoder. + """ + cfg = vr_m3_12dof_foothold_env_cfg(play=play) + + cfg.scene.sensors = tuple( + s for s in (cfg.scene.sensors or ()) if s.name != "camera" + ) + cfg.events.pop("randomize_ray_offsets", None) + + actor_terms = cfg.observations.pop("policy") + actor_terms.terms.pop("depth_image", None) + actor_terms.concatenate_terms = True + cfg.observations["actor"] = actor_terms + + cfg.observations["critic"].terms.pop("depth_image", None) + cfg.observations["critic"].concatenate_terms = True + + return cfg + + +def vr_m3_12dof_foothold_ll_subband_env_cfg( + play: bool = False, + subband: str = "ll", +) -> MultiCriticManagerBasedRlEnvCfg: + """Foothold task with a Haar-DWT subband depth image (default: LL). + + Replaces the raw delayed depth-image term from ``vr_m3_12dof_foothold_env_cfg`` + with a single level-1 Haar 2D DWT subband (``mdp.depth_haar_ll_subband_cls``): + each frame is decomposed and replaced by its ``subband`` component (default + ``"ll"``, the low-pass approximation), at half the original spatial resolution. + Unlike FDF's FFT low-pass (same resolution, high frequencies zeroed), this + discards high-frequency content by discarding resolution outright. + """ + cfg = vr_m3_12dof_foothold_vr_rsl_rl_env_cfg(play=play) + + for group in ("actor", "critic"): + base_term = cfg.observations[group].terms["depth_image"] + cfg.observations[group].terms["depth_image"] = replace( + base_term, + func=mdp.depth_haar_ll_subband_cls(), + params={**base_term.params, "subband": subband}, + ) + + return cfg diff --git a/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/policy.onnx b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/policy.onnx new file mode 100644 index 0000000000000000000000000000000000000000..73074d8d050aee2603b69d8c9491c50e9a34874e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-46-25_vr_m3_12dof_foothold_7x7/policy.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f09af77e040004bd9141f0deb1e9b0213b36385be9eded154ed1e83a229485c1 +size 4897902 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/events.out.tfevents.1784803833.worker-4.3973097.0 b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/events.out.tfevents.1784803833.worker-4.3973097.0 new file mode 100644 index 0000000000000000000000000000000000000000..7de3fbd3ea312bf91e87c1c5fc83c3a331121350 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/events.out.tfevents.1784803833.worker-4.3973097.0 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdc5956bb62e2647fd46ad63b4e50f6c1e16ef9189ee7363a5853c765b9c9cc6 +size 420480435 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/git/mjlab_perceptive_dwt.diff b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/git/mjlab_perceptive_dwt.diff new file mode 100644 index 0000000000000000000000000000000000000000..a8a1edb01afe82ffb8c6b84ba742a3515b02c233 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/git/mjlab_perceptive_dwt.diff @@ -0,0 +1,38 @@ +--- git commit --- +e65c39ad411f02915c105a9fac46e251d35e3a1d + + +--- git status --- +On branch dev/fdf +Your branch is up to date with 'origin/dev/fdf'. + +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py + +no changes added to commit (use "git add" and/or "git commit -a") + + +--- git diff --- +diff --git a/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py b/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py +index 6dca059..28862a1 100644 +--- a/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py ++++ b/src/tasks/velocity/config/vr_m3_12dof/env_cfgs.py +@@ -1691,11 +1691,11 @@ def vr_m3_12dof_foothold_env_cfg(play: bool = False) -> VelocityEnvCfg: + cfg.observations["actor"].concatenate_terms = False + cfg.observations["critic"].concatenate_terms = False + +- cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( +- func=envs_mdp.height_scan, +- params={"sensor_name": "terrain_scan", "miss_value": 2.0}, +- clip=(0.0, 2.0), +- ) ++ # cfg.observations["critic"].terms["height_scan"] = ObservationTermCfg( ++ # func=envs_mdp.height_scan, ++ # params={"sensor_name": "terrain_scan", "miss_value": 2.0}, ++ # clip=(0.0, 2.0), ++ # ) + + # Privileged critic observation: planner output (body frame). + cfg.observations["critic"].terms["foothold_target"] = ObservationTermCfg( \ No newline at end of file diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/git/vr_rsl_rl.diff b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/git/vr_rsl_rl.diff new file mode 100644 index 0000000000000000000000000000000000000000..7d752229105146469e937c736f4169b4e7cde8e5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/git/vr_rsl_rl.diff @@ -0,0 +1,12 @@ +--- git commit --- +13b0b308e7cd73f7d4188a8a3cde9a98db717e0f + + +--- git status --- +On branch main +Your branch is up to date with 'origin/main'. + +nothing to commit, working tree clean + + +--- git diff --- diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_0.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_0.pt new file mode 100644 index 0000000000000000000000000000000000000000..d93c4774474ef6a980afba5eb642c2f9f78f6c2a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_0.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ac11d53abc58d35ff673f073dc0fd0e262923092b2eee17ffc980138345c609 +size 114316261 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_1000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_1000.pt new file mode 100644 index 0000000000000000000000000000000000000000..717ae5a76d8af574b3663088e76d26ebfe8d7a95 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_1000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4527112b326eca59c36df250fea81f3c629cc1a88d895e9b123c8c89ba48e6a8 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_10000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_10000.pt new file mode 100644 index 0000000000000000000000000000000000000000..0f3264662ee577554d2706f0f83ce6b7163d8fac --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_10000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e50fa35a3eb06cc5ee133175f3dfb0b514b6e34cf20e70baebc5a3ff4fae8aa7 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_100000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_100000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4d67eb7a1ca8fab5678d5311bd0c88fe4e04f974 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_100000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2312efc6d968de06f77b51f15d2839e72ac2dd9d7cb51164e00f30a87ee43c0a +size 114317412