diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_11000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_11000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1a17e47ee0293bbf5ce46084809757f92b6e3c31 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_11000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34110d648c1c8d2a0348160611ecbe65166c80f85014596a661e44cf2b81bfe0 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_12000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_12000.pt new file mode 100644 index 0000000000000000000000000000000000000000..74b7dc6953d6f53d072d0c58b5a42dd8d2e37198 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_12000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ea55dd592acbdc832435702cb4a4ca5867f93765bb2ea200fa5a9908b351152 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_13000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_13000.pt new file mode 100644 index 0000000000000000000000000000000000000000..dd37607d8ed8f135fee675e042af6a071433f94d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_13000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9b5e86e621b43848abe2db10438edeac8636f7b0cfe1b5cf5917fd72ac2d48e +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_14000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_14000.pt new file mode 100644 index 0000000000000000000000000000000000000000..24ad5b0f82cfdbb0e1b78f3d7a348b21163aefe2 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_14000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e95910e8b462c54ff104004e08080bce8c89e5f9aa350cb691dabcb33a5870a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_15000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_15000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1de15de95b37ff500a6a5622b1c1afd478687fd9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_15000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f560d78df3e491ddff1809b2492805345a14d902160d5359e7715758854d62b +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_16000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_16000.pt new file mode 100644 index 0000000000000000000000000000000000000000..917b46e3684ca4fa8da457d42b587ddb761f6f85 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_16000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d359b22350a2d04b58a844f1f1827824a5252e5ed357329b6f2b98a1a5d8a5b +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_17000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_17000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d88e31a345350fba1ad3a7c26d12d3f14f0373bc --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_17000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b5e8aff0f976d9e57fb19e816b51821687780909d24fbd80a08f76e7eef1694 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_18000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_18000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6cb3784b043877c8342f128965c9b95808fd2913 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_18000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bfadeb457887dcf54e9c1c5c6ec8aa11478c35008616dbe6806a2e82fe1712c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_19000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_19000.pt new file mode 100644 index 0000000000000000000000000000000000000000..da086cea063bcb65f23da9a9c787860fa2d93376 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_19000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:376a31b27b944249f18cbb3baa52e3a22829968ffe207c4c6f360461dcd72653 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_2000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_2000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1a42899b58661293cf9a0223b7edcffb11c45ed3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_2000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31b79ac2a7ea592c72f64bcfd0757141dcd711c6582c89962b7a505e979d66dc +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_20000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_20000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b5747434ea729b9b4873c54662ddcf3d3cd00c85 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_20000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:233def5eb5b9c677b4dcd077c4dddb60a66246d9ba330d89163d0986aee011f3 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_21000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_21000.pt new file mode 100644 index 0000000000000000000000000000000000000000..0f1422e0b8cc297d353ef87ca878dc0eec91431a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_21000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12aaf4dd50aea33ddb0f3f6fb26d122225961be70f4ad5c5b6ce14c167d9f21a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_22000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_22000.pt new file mode 100644 index 0000000000000000000000000000000000000000..98c742900a049b63b3f55d1ca9d002446b614ba1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_22000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:085174db997d07897a18f77d3792c262a253636e911fb81f2dd2138027bde6c9 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_23000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_23000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6c9b0c93e86bd3960bc9af3adbfb00933291ff61 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_23000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d47a677f274261051f3a0779cbcb01f253c5eadff16206862f0ddcf29166ad9f +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_24000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_24000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ef432224c50a3bff99e9ea94dc837a7fd0ed762c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_24000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5fb006abdbbafad1c04bc1e190a4d319085f0ef2b7d0a7218551513774f77da +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_25000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_25000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e1d6730bd31c472f14dbc85f49623cd16df18a9a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_25000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87e61565fc037afd44d3e5bbd028804d4a5f8c3f7d58263cb6e0148fa361b465 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_26000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_26000.pt new file mode 100644 index 0000000000000000000000000000000000000000..31595fe6a461d126345f19d06fe37760a6539f1b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_26000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7eaf9fce2c9a05681441bf9a431911fb0a8d0d28fa16f4a301a374cc3298122 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_27000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_27000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c6fa7bbc9ff5db96fdf03b683be5d9727e1d89d6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_27000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9949285ac81b24eed215bc87bf95ff9e8379498c38fc3bf7ff483ecb2394cf6e +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_28000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_28000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d8ae4baf063a1bb74bb2d5d35e122feb8b75333b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_28000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ea43efd76ab364495960e9c99ba9b541800a1d2983228bc3c19f8f3858a5045 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_29000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_29000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9ca9d91a55b5f606b2f76f873567d5999c7ad238 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_29000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43f5a46acd0d0509832535cb3767ced54848144663e3a01a4facfc5ea0a03178 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_3000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_3000.pt new file mode 100644 index 0000000000000000000000000000000000000000..677cbb46b0c5bf17b914c3a6ba79221bd7022dd5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_3000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b9b6493b3bb87962981a4ffba8668326099b3af37d48255450b085fb879ade6 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_30000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_30000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3ca2faee5c3e0813e5868b1dd3726489972ada5d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_30000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d9da0eb41c8881469de625a98662272868e1d289a56fec08fd342992f90ecc0 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_31000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_31000.pt new file mode 100644 index 0000000000000000000000000000000000000000..173a9547d2094a88d1c1be2fdb80805c6ebe6043 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_31000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51ffa8ba2e841a5290a293f350921c8d4c165da814a4875265e3e13e0c2bd1a6 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_32000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_32000.pt new file mode 100644 index 0000000000000000000000000000000000000000..90b926033c4336fb6fcec6aeedbd214f11f6c40e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_32000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8c5db5d4efcb5fb24204ff8d74f88c63d1ec924d6b7210b5f894e355c0808fc +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_33000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_33000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7d4f8e16abab46166bb896a4a257a6448f8cdbea --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_33000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d75ac5ab32a80f6af1bf3d48f05f1003ad3d48f3f872417be24ef506ed741525 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_34000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_34000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6d456390bc0efb9e7383a8ddd5071e11c17ae7e5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_34000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f0aae7e6d9581f446d4bd14983b91aa7fd8bb4893a0eefc5e29bb4e6e8cf997 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_35000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_35000.pt new file mode 100644 index 0000000000000000000000000000000000000000..79751a70c3ae60600e9f37d3ac08c75022831cda --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_35000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27c1cd882db0d8edb9a2283476a849bfec9c68ec66fcb97bfa71e0dd42959987 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_36000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_36000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a8b375afaa045b5c19cfc53d3e345ed32a913549 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_36000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58c4a924e8cedc3d583b332a35b51ab09ecbc31971f653c50fc12627a0f69e33 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_37000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_37000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ce9d4e42e01fbdb18dba76276c5fd624d653a33e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_37000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f6eca50432d96308a80c48637b21cd0d56364bbdbd1352e34986b985285a2a8 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_38000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_38000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1bd6deab26bce9bdcaf95da7d209f09060833ad9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_38000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71c90dedca7d0122e050bb2f59cfda98c3ea38c29e19bda853c7f5b89e7fba95 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_39000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_39000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b17b3f44f4a3ff86567d0c1db386b03cfb47ac74 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_39000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a95f67b899a1973e24bbf91960996ad85c08eaaabff73a0128bdd811640f928c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_4000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_4000.pt new file mode 100644 index 0000000000000000000000000000000000000000..526f2922941fdac030fa39e805ae91e9a57e58d3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_4000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c05b3ae8d8d01006992a3d6ca064c5def93d9d723855cee24cec7a348d91de97 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_40000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_40000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b4ef3bf0a2c45855760d9f32bd9c886ffade1eda --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_40000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dca806d7c90986e6afa9f58c611ab4162717c0f1497dbd7dd473fcc80580ba1c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_41000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_41000.pt new file mode 100644 index 0000000000000000000000000000000000000000..49c4b3c666630cf6b4595851c173c5273fb10823 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_41000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:300e51228e5a928adc79b2cc44107203181b4d5336ec82095698d314c31f51e6 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_42000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_42000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e053cf98121a4b9b443daadb8ef45684338205fa --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_42000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddd7798e8601c91bda36f8b96b9e4f32762166b8efc942279a04b18d47cab20c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_43000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_43000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b6f49afac694c01f59284480a871898b1eb87380 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_43000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f87a48b692ce656723cab901d77cf0331ac3525eb3e657ad14436f7ae7f43252 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_44000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_44000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fe01132931d0630ee337b7b5c9973eb292ea163a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_44000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40f223bb4d72581782c99272d477afa6892b7c6b3218470e365a8f0d4ed29149 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_45000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_45000.pt new file mode 100644 index 0000000000000000000000000000000000000000..54816d55966380213ebe1d2882b73add34325bb5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_45000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12f7027279ce04fd77aa3636cea8b6b476933ac565629c177282cbbeebe695ad +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_46000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_46000.pt new file mode 100644 index 0000000000000000000000000000000000000000..41e822c2c724d66b8ac1c8c1a63d70f1658f305d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_46000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d8df65163ce769f5993fae341dbadfee4ebd64c34a37b93469c258f631c2fd2 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_47000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_47000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8a150e12fe42d31e4c6270658b2912b368963b27 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_47000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2524f648f8234d0e7c292eadd5c3a3e56cb3c9917095fb1da3c3a5f9d216553 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_48000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_48000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c37adbc9afe25407b4bde815090619824b34f143 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_48000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75c8748519e447ad48fbf41f12dd3e05e5d80f79093ac0e76b7ce1524c0a676c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_49000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_49000.pt new file mode 100644 index 0000000000000000000000000000000000000000..64df407ac940f5a7254057d0e7ad97512112ed18 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_49000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae5b1928529fab0078865c870191a9d0e7b129fda15f2fd0310c9c609067b07e +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_5000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_5000.pt new file mode 100644 index 0000000000000000000000000000000000000000..07aa6d296c1350db66fb129721ca74de29dd162e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_5000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:635510d01773e2ce92d377e8641549c527b918411ac67ae3cacc3a8ae8b22db6 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_50000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_50000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8a429a68fa7b210e0957f1e55593fdfa9c255ce4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_50000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe8a67d57b4648a5c01966c07c5c88bd732092cc30dbd8a008592021d67bb34e +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_51000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_51000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d2c035e9fda1c077fc38371b31d5e2fdb3a44411 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_51000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69ce6eb3b418bab3127120540dfe0fe006ed6eb635084c9e75d09ca82b7439af +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_52000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_52000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4a896cfed69c73efb858db081a6616529239844b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_52000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d59f361878fcf7dc162c328733546149cf0d2fc0868e547eec895310a5c82a40 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_53000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_53000.pt new file mode 100644 index 0000000000000000000000000000000000000000..94e32b9841fb4883ef6f096589d77c913ad87290 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_53000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:235dd926dd33f3b23c3c1b0e4bea47451f6a470280d567ea1fcff2f42fb1dc1c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_54000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_54000.pt new file mode 100644 index 0000000000000000000000000000000000000000..68cca7c29062052d4668078a0cbb13397810b8d7 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_54000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:074720af5a0803eb729adfa82f7960127448da056b48e1784220063adae5f636 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_55000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_55000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b6ac6af010632336f6cf44da30270fcb3466271a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_55000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a09be0086ebcc8ec9576915e17e54c8ab0e45fdc8563aec951479502efbd1f8c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_56000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_56000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a4859ff8eb6ab904f59d4a9277e28d7544a4cddd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_56000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6018e14f081b8b8e021ca68eda3b6ad58ca4179bee0c82a924ec73eff66e583e +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_57000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_57000.pt new file mode 100644 index 0000000000000000000000000000000000000000..097157ecbdc2adb533d343c431815aacc48ea2f5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_57000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94c894b5dec3e266b0af2cdd14945275f213d25bcb423113bebab9693a0b4d92 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_58000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_58000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a3ac980d2ddbc3345790665af278851285d808fe --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_58000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c146ca822ea4de3bcdcc373aecc1231ba7b2290158ecf459fedfde80d4e888b1 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_59000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_59000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d2927f81796d5c44bf0a184e39f8c5d4cd378b46 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_59000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:901e77d0a0044bb57bdf1c0730114a83bda760e3a140b83a3ecb0a54e98825a0 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_6000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_6000.pt new file mode 100644 index 0000000000000000000000000000000000000000..25c0dfbdbe791fbbc41831dc6b0114f3dd631334 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_6000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:422483c6fe5b7e58251cb37632b91a8894ac6714d7dbdc4ad27aac85d8879234 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_60000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_60000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5d521074cd7381ad54faa733ebce626207de1af5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_60000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0e995623bdd93385f331fea42fea3944c9518b76079b8e0733f14631cc204297 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_61000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_61000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f5d63a7abd38a42bcbaa21a30562164d0091fb5b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_61000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f55c25639fdd2939681f0a12eb5ede3cb8203349fbb62f88e9c9718c5ed8061 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_62000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_62000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7ef5a80c920601bd4b87ee433f9d271a992565ed --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_62000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa865c5562335465fef5ddaa23bd7821e5415b49d161bee86af3a4f4cb389ec8 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_63000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_63000.pt new file mode 100644 index 0000000000000000000000000000000000000000..66e6063ab8de6686d78b1ba94c850182d3688a8e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_63000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e6867d19bebbebca304756f1cfa29e640987207632e80f6ebed7124886bb8de +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_64000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_64000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a90085f3b3f16d4e3697598c026eb3d0d62168ea --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_64000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eee526be5ce0be84cbf357453724cba669e77ec4d6892acba6b3a322264982a2 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_65000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_65000.pt new file mode 100644 index 0000000000000000000000000000000000000000..95a4e889a4573f9d46556fa3d4904b072d9fc7df --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_65000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11fc56fd40401dff719a5d56e73eedda70d1641090b9d6ced598c4c08085ba4a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_66000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_66000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c0b836acd81089fc530c594917ae58f23db5cb6d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_66000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f27be7c80241f65a660b8e25e3947f8d4287713249f39881b8ddda924551c40 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_67000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_67000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3cec5deea661dce3c7e2fa80f124b6d94e468f4f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_67000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23b8341699633abcbf406980444dc648f0c70099ec7188f054a69c65e341c70f +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_68000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_68000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8ae6db5cc067c694bab52ab854d0cdaa6fa490fa --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_68000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d361a90acbb15eee04b13ef32b171062b6b1226d3c448a7f30b4bc7dcbe774ef +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_69000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_69000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b1f84be4faf869b682b155b4f2e3c43d93e7921e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_69000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c22a8bd5c716cca2562434b3a5f4c27da3e83af15642c9512980c6c74d5650c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_7000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_7000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c2d5fbd764502e5c1d3d3ed1a4380c9e14931b56 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_7000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78761aeb8c9b3062084f801901c6e7851175e5b192681458e2f4a00cd7aca437 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_70000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_70000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8d9607d634465a187aa0d1064b1922c292898a35 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_70000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8a3e8a53e971a93d17d6556c7fbdea29a6e0db581b590563c5ed7cceeaaea48 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_71000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_71000.pt new file mode 100644 index 0000000000000000000000000000000000000000..559e9b686a9983c4c1150ba42c03e45f2a6ad657 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_71000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ff5529a6721db990ec79040d2ca03363d8ccdff07ed67c395df55da5ca388a9 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_72000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_72000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ddfe29617fbd31efc206e740a7b9e107d55e58b8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_72000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9ef64202e01c3ca832f916a87ba3d76bb0aa4b5e9532c5e82534f376fda741d +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_73000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_73000.pt new file mode 100644 index 0000000000000000000000000000000000000000..2b4e38dc52971830a6a6ab7d06161c52447c1b87 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_73000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2900f07639602b46e2e63c2a057714f7091e1646f095df9388e7c8ea1406c284 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_74000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_74000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e07073979021f51272b60e152bc47bbd755dbcc5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_74000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:392039e783b85456db217ec77d4ba257e1986e7df2d7b6c2c3722b4cf22a236a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_75000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_75000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4a8dde8770aefabe49405aad6d118ed57cf65342 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_75000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:080cd7128d23339996a33056bc9bcb7d7e2425901d27d2f24e94fd9a6bd6c985 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_76000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_76000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6224036360d041e0cd04b8326ea0db6e806b4b25 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_76000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f9bc175f6c1c086900abd364ab89795d92cd7fc96f1621ca83f20bef2da4c2b +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_77000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_77000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6a6e02609d41480b49df5cb1c5e455505d66ce3d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_77000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37aaaa45aa91f6369ce6f2222ca7d60bb1da64581e6f16423923318c1ea20bef +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_78000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_78000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d3e1973d9681bbaa1db0e4815c5e5685f11b3f66 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_78000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b1ac19f0ace285fb983d1fdf3952d397d38208523581afd061bf92a388c6472 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_79000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_79000.pt new file mode 100644 index 0000000000000000000000000000000000000000..81bb32aecf6fe3f8bd17529613035c6fe48a4076 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_79000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10d31907892752e7c3a743a9d082dcf0699de8f724231f7b92b1b742c5019410 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_8000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_8000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e24f9a9907fc38211981b4073b0e03deacf16db8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_8000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8673a49406c44a5ced183dbec07bbb205e96c00f310f65155c04a96b2118dabd +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_80000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_80000.pt new file mode 100644 index 0000000000000000000000000000000000000000..83e09ac3911939d3a6ffea839a61b05ed4076d1e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_80000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f59a5430e20297322236d59ebc38208538b2cfd51b05f1d9f20ebf8d6950a7be +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_81000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_81000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a8f5f9a63b0c93eb50ffb63d8368a7a09a7e8843 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_81000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cd7c1497b5c25848061ace66258cffff2a7989befc70f08484a089575b3a11a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_82000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_82000.pt new file mode 100644 index 0000000000000000000000000000000000000000..58a3d86ef921a358e0f2a5ca29fe09f1fc9a93f4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_82000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8170af8d943acf533ace68eba2eddcaedccb5eaa7faefbc1c7a1b2c270729ec0 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_83000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_83000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3fbf91246d00fa01e130aebaf815031d7fcf6f39 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_83000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0862ac77d3d7fe9e6b3ab41ea4f6a95a1615f65ecf899e695b54df86c0ae2f9c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_84000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_84000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e03254f19f732a8ba30baca43ff884daa27de29e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_84000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f470e86d1247df825d0129458b4764689a9f683403eb3b77740d02d994775d0 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_85000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_85000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9dc2244347daf463595bfabfcf9b34846d1337bb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_85000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdc5a4a2c5d6dc829a31b60c2a7bb09ad88b572cedaa87e5c2b355cf10e9b811 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_86000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_86000.pt new file mode 100644 index 0000000000000000000000000000000000000000..918458a3436e09fbc6aa5040314c93263fd581e2 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_86000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf7c40f80c1cdb6148c36a92e9dc0522d90e435523e996e858e36ca34d9fc8a7 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_87000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_87000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a41cc5d840923a2b724db1d5f459c87cf22c352f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_87000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:351facefe771879e40ce3095bb153dfaf0a64f50c73710b1b774b9ddbfd82e30 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_88000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_88000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9bcc97fd93c6bcd73888fa8c6d6f15f9adc0cbb3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_88000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70a68e1852d82c96e0994ec8753cb8d7a040198ab108c71882b595063777684c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_89000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_89000.pt new file mode 100644 index 0000000000000000000000000000000000000000..bcdef20e54b194e42ba4a5ee7b93a6b07e583df5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_89000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f231e7e16ce2702427507554f95862e5ffe4261b0235bbb4218bc66fd84fb52d +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_9000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_9000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e0c4e69341059238fce78dcf180e2e7c71bd4ed4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_9000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca5924d2443c381dbeed4ea5f774132a1dc956e25d931be9301bd642b21f4d50 +size 114317054 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_90000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_90000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d5866a15ef0a2d899b638856ad22f62b8d767bf1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_90000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4757329e181d1a6fe136e685e94be2ee3d8ecb569d339b689b25552d41a1e842 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_91000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_91000.pt new file mode 100644 index 0000000000000000000000000000000000000000..50519869555ada07de875298f599943a96a5999c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_91000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41d8da21f588100e0384dafb6ab88db6033b6b7778117b36719acdb578fe7837 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_92000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_92000.pt new file mode 100644 index 0000000000000000000000000000000000000000..a242ffaf4c5d3e4725cca0a23902bb23a1127fc3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_92000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800c37f0117b1d92a090377f8df5a535e3fc4bfd2c78d63b5262f352b6a13c7c +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_93000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_93000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fba2e91d20aa805e71f432b60f976f7520752800 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_93000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:767ac102d8905a5271d33132d1a52c56fe19f42f399940269338f44004071ef9 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_94000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_94000.pt new file mode 100644 index 0000000000000000000000000000000000000000..572ff9b9d5d2da1919a53b7a7b4dc1ee1526ef64 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_94000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dbb962890f4229af351aa6d1dc25b586034033a7733eaf4807109910eeae734 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_95000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_95000.pt new file mode 100644 index 0000000000000000000000000000000000000000..bfee6b03224f3f0bc83726b4490b02bfd342539b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_95000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c766c1171eac5c8e69f94cb03bc2cc26bac3f035e5e765eda66fac4138d0559d +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_96000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_96000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5949bed2b542e9be88d17449f514d69520e10e4c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_96000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fd5f1eb7128441f162a880342e3d6562ca0c02c95b2ee2526450d3cb6956f53 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_97000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_97000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8e29ff5d5b6e58e0c710b6fd64d5c32425ef1bb6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_97000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0ef6e39e02767baf3cb7d03c2b80c08ab9e0b74ff07ab071785b071643f4370 +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_98000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_98000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9b33822648721197d3a065edcfe75891a372d556 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_98000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:486118a4bc1d2d85f40109eece46be07031731862cb9bf519017435f8faaea3a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_99000.pt b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_99000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9f67154efbbdb5b06d1b310dbf40372e4a4c6273 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/model_99000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4558374e0326ba5517f6387132289ac2d7f2dd36d9520b291236bea2137cf73a +size 114317233 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/params/agent.yaml b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/params/agent.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6dfb919242fb5760e45c65147d32d365a3dd5cf9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/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-50-22_vr_m3_12dof_foothold_30x30/params/deploy.yaml b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/params/deploy.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e9baf3a3bdd55aa2eb0ad7e68553f68865d0b94c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/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-50-22_vr_m3_12dof_foothold_30x30/params/env.yaml b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/params/env.yaml new file mode 100644 index 0000000000000000000000000000000000000000..71a59f5b92e5f55d1e16a63704dd1276c88e6509 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/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 + - 30 + - 30 + 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-50-22_vr_m3_12dof_foothold_30x30/params/env_cfgs.py b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/params/env_cfgs.py new file mode 100644 index 0000000000000000000000000000000000000000..28862a1a6de25985074fa1ba236336f28bbc3b6e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/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=(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 = 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-50-22_vr_m3_12dof_foothold_30x30/policy.onnx b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/policy.onnx new file mode 100644 index 0000000000000000000000000000000000000000..190c8a97adec19aeae13639113e5785ec4372e53 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-50-22_vr_m3_12dof_foothold_30x30/policy.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f1fb3125e983da281da369b2dc59c2e867861f58260e322e0ecfec5fefa78be +size 18840689 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/events.out.tfevents.1784803907.worker-4.3975937.0 b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/events.out.tfevents.1784803907.worker-4.3975937.0 new file mode 100644 index 0000000000000000000000000000000000000000..3e5051392d305a3c10e67d4f864c0f7f9bacea99 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/events.out.tfevents.1784803907.worker-4.3975937.0 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dcb4c4ac048084c46dc1d43e24ed4d2881faa1c2b19f4745cb17c3046792ce2 +size 420480435 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/git/mjlab_perceptive_dwt.diff b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/git/mjlab_perceptive_dwt.diff new file mode 100644 index 0000000000000000000000000000000000000000..a8a1edb01afe82ffb8c6b84ba742a3515b02c233 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/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-51-37_vr_m3_12dof_foothold_ll_subband/git/vr_rsl_rl.diff b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/git/vr_rsl_rl.diff new file mode 100644 index 0000000000000000000000000000000000000000..7d752229105146469e937c736f4169b4e7cde8e5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/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-51-37_vr_m3_12dof_foothold_ll_subband/model_0.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_0.pt new file mode 100644 index 0000000000000000000000000000000000000000..b3915edef18cfa4d92dd456bfc764890f1833838 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_0.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18f000759cfc5462e6029212bd58f0fb83f2512d091fb764d81cdc952ffc399d +size 47961061 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_1000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_1000.pt new file mode 100644 index 0000000000000000000000000000000000000000..38064d8a2bb41a8c12a4cf05090c03b831573b66 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_1000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e956ceb1eef58dc7a356e5d661005fb069cfa999c4e26f1531baef3dbaca215 +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_10000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_10000.pt new file mode 100644 index 0000000000000000000000000000000000000000..bbba9c7566cb9a39e954a2e6b87ef0e5fc256a07 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_10000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f3dfaadad8d7868f6df0dd71c2f30adef363f2bf32fd14563e9b5247f2b775d +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_100000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_100000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6ccbd54109f684609c6897143fd51eef0d9f692d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_100000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6f510fd4ece40285e454e687c09437d6ab5aa522dd73d41a7d9dd4e5ffea5b6 +size 47962212 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_11000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_11000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d78aa489b879e547e0ef766c44abcf7308169011 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_11000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8571a367dbc0ae33ad57533b4cc82f82c22a3b8884d066aa066e39d0cdc2d290 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_12000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_12000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ebea3c5c41fb3d80daf9a1d06e363bac58337ad5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_12000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bb664c6919976322de14ccfb040e47d559b339433f1b2f85051f6d11ce7a6a8 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_13000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_13000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d6845b521eeda908e6abc69327682d9ea0767bc5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_13000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:561b0382f7df21bd68d3b7d71fcf46864941e93464b73bb72203102322a49b22 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_14000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_14000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8594c3505118b2ef770cbb3cb8c25e3373bb135d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_14000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abfc31377c59e9530d14f57bb7889d5f3e1f61d1f3db2bec71067729791bac20 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_15000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_15000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d025e58b17177bc29f0181566ca46ac5604edf17 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_15000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c02d3710ac4d3e63e7013c682cbda95f4fcdfe80d9c99e4c8b65bcf1fd34e4a8 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_16000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_16000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f4f25b282440b428b0d4916d6cd063bab047de9a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_16000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4610291836d5c489bd1731554809f8185d53405353158fb81c587cbf30f59c46 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_17000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_17000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8597e7f3662dcd3be9af90eb80aae65a8f97ccf8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_17000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bccb47b3c229cea680afebdad12c701549064225ba4dcebe77c5512dfe8e953b +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_18000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_18000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d6e05125483f19971415a413e1152cb6edaed1d1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_18000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7b9684318ebb76d773e3708228635f4db3a7a2e14fdc4e4b852c1f0c19fe110 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_19000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_19000.pt new file mode 100644 index 0000000000000000000000000000000000000000..eb6d1f0495bda30bc101af602caabe5348f0bfb1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_19000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b27782bd4bc0d3c77f8a6d5a342757ad28180cc1fe4583b312af4aed7ef3094 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_2000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_2000.pt new file mode 100644 index 0000000000000000000000000000000000000000..02deba48d9a90718a703d055861fe260ff00e38c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_2000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b893f0b3a68595ca78b0c3ab6fe1b265bdc9f1919bc7c42bf172427e894d28f3 +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_20000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_20000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b54e2bd17c0cc4f380704ac512340c45a83038d8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_20000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:817c0b7212997168055ba6db6f031921d5fef2522235d7030351527bb2b6c765 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_21000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_21000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e7c4fd02853f94d0a6b3e30b56307659ffa00701 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_21000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:055c475037c229367d74200c4147bc6e9b48853750648034be5c825b521e12a3 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_22000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_22000.pt new file mode 100644 index 0000000000000000000000000000000000000000..11eff83163e1b1e300e9cbc79128377ec7c17a9b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_22000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d1795aff5c0e68256027fea1e5680ce474bc5f420ac2f4fd8bb8b0c41a2c914 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_23000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_23000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d9998f4b38ff7294ac270cbd5f02e8abd8dfa506 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_23000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b36b4506e60bd869beec089a8b07acd6d53452aed4dc6268e20303a338ea1ffe +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_24000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_24000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3bc809fadf11dd8b7aed56c5b7a25a8e7bf1c71c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_24000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67576b8735ebbe68beee4f202642a3ba2dc5a20346e85b8899421210fee5f200 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_25000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_25000.pt new file mode 100644 index 0000000000000000000000000000000000000000..28e33eb57c7d338ae4b7a3a7868654f0322d52db --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_25000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d2a165348681b60c045499ea77bc9d27d6201c7061dc731d37f74598cfabd71 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_26000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_26000.pt new file mode 100644 index 0000000000000000000000000000000000000000..63adfc0eb0a7a1ed445bd7a947a4068f07af0ddd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_26000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:307a78bb2078cb907214678628abf0e2c47325a21b08e295d5d8a986ca5013c3 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_27000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_27000.pt new file mode 100644 index 0000000000000000000000000000000000000000..32c6c60bcac5c1f6563140123b66c10bab3a9baf --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_27000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24bdb2400779093eea518e6dbe94ec4026ea4d1403c1418c7d20d08d69878d34 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_28000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_28000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9cb5b29985a3751e207974801cacebcf2306747f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_28000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49a76afbc3ac105b6464c625ca819d4ebabe0cdbe963b287ec18c1f634605088 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_29000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_29000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e384f2ea15b0adc0fc8509fd1ef53d7732cbaef7 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_29000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71ea0beaf0baca400eea0f5a41a394a7b4a8279958f353ddbbf25458d58f347b +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_3000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_3000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1d4d66b7fe8659ef6b66e0761673dfc6445613b7 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_3000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05d7473f7950fdca18119dc868c9b282e58f48aaaa6216269620d36c12834c7a +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_30000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_30000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1970357799561917aebd47cc2346e4259f713ca1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_30000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:953bbb3c8c62223ce1964271c7916072881eb29ad45dd880cf4af80f60b66123 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_31000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_31000.pt new file mode 100644 index 0000000000000000000000000000000000000000..160833812ebe5b45aa7ee84f9d5cc58c77289209 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_31000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e84b995c0827370be2770999affd13c1d07ecda18440663faf7cbbf6d336d52 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_32000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_32000.pt new file mode 100644 index 0000000000000000000000000000000000000000..34ba6d7934ec39c6d521cc1c67f423c004ef7383 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_32000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b40c892652112336dcb2a48a0e931c55247095ec1cc545a8be7296d32ac81a02 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_33000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_33000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7d24e1a8ee90a27a582d3dfb0411e4c45d446e26 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_33000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34370652f542655e3049efc800b2dd421f8b80bb2007014038006d9d4a165bd1 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_34000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_34000.pt new file mode 100644 index 0000000000000000000000000000000000000000..401cfa1dd6f72c5ab6512bdb9976ec07203e478e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_34000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:980256c066668e93491ebaf67e50eed984570c061ae8f8acc96e0e88e0ab7ff3 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_35000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_35000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e7f26857294b2f506e3a7d56f3c15b14365f81c8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_35000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5ec65b124133970bb906914bea5daa0a9fdf2a78626836d9261a4d3c5938e36 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_36000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_36000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9676bd1d68ca1c89cd45263517d016b9713f622b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_36000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afd50e84a4b95ab9090c2c6d74bc7dac5dad8128f918b3d3d0171c4f9f6baada +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_37000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_37000.pt new file mode 100644 index 0000000000000000000000000000000000000000..23c4102d885fdd2f72f64e0b2ee251b42448a4af --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_37000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67c3472c55c7e52419afac0debacf6d952da6e52ef6a2558529f3757aa6c0528 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_38000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_38000.pt new file mode 100644 index 0000000000000000000000000000000000000000..898a3bdafcc2e90aa7f26fbddff3e6d5a38283ba --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_38000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:919799636aac1696bd25754813d1f1ec4139f07e050cbd530a90e65b9db9dabb +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_39000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_39000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1e919030ee64a2b2b62ca138ecc043ef226c5efb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_39000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f77a851eb6097b932d74acba974479dd43a355a1200ef366ea1563e651129c82 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_4000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_4000.pt new file mode 100644 index 0000000000000000000000000000000000000000..71c5cb805c1affd1a19b795575e058b3b2313a3d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_4000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63fbf2ea589e9c511838c6df1a88b3efbea4ee31f25cb337104f2ee76d255b16 +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_40000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_40000.pt new file mode 100644 index 0000000000000000000000000000000000000000..573591719dea72c660c09883f607281eae6e97a3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_40000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a3a293b691678fc1375b145548dd43789a64d2af53c40a80935a5204734e4db +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_41000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_41000.pt new file mode 100644 index 0000000000000000000000000000000000000000..1f096ff169643b6685b3105eb4c9f1f7ea778531 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_41000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:332e7238f37240bdcdc6a14ed304082df441702c46073e6bbec218d4938a54ed +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_42000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_42000.pt new file mode 100644 index 0000000000000000000000000000000000000000..98aeefb8455d2a99d4a7478221aec915c9666e42 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_42000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ba2a1aa6b0e7b545b843ad16d33c6723edf0e46cafc5d30aedb99246881e8fc +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_43000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_43000.pt new file mode 100644 index 0000000000000000000000000000000000000000..648f7e91f0b759a97e9ba057250ad6ff53682d38 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_43000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e77476f5a44c34cbec9aba2ebb694a13ee23b5b4a13b551a119a88332135345 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_44000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_44000.pt new file mode 100644 index 0000000000000000000000000000000000000000..99ab01bd5c5831aaba3e9756fc652ae945cf0ff6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_44000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5131ba5304377c0125e07df053281b63bb118b9ac35ee905607e60ae237486a +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_45000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_45000.pt new file mode 100644 index 0000000000000000000000000000000000000000..99e27ffae887f6da1a0bf3928963434982771c18 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_45000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec6bd96c586a3a4d437ad5a20b8bb515bf069595baff029a01be862768c1403d +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_46000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_46000.pt new file mode 100644 index 0000000000000000000000000000000000000000..43dbd392517bf0fb5ce792190110bbd5fe119e1c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_46000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2fb4c02d6294de79bc63bcb9f8746e76560984cc30f6ff9acbe0a160d0f68e6 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_47000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_47000.pt new file mode 100644 index 0000000000000000000000000000000000000000..697c1c4387ad6be47fa4b18501a27853fb539ecf --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_47000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e65a205dbcdbf7adcb7a8ba6cc282c9215c54e74ccf4d32c15e9564150340963 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_48000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_48000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b47275ba5f045fc52c6d91a6da6db41d6703ae2f --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_48000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3773f18821a94d8d6bb4d892a570bbfef717b734689a63606ec10fe9821454d7 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_49000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_49000.pt new file mode 100644 index 0000000000000000000000000000000000000000..49facf3b212f392534c91977d88ed1877d3ab402 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_49000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e854b2d3abb4eb2e719f6e65c882724f6ae8bc6be0d406465f1a6f44621a646c +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_5000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_5000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f43f0094669f281efd4a0fd146abe20ffc0b2d51 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_5000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4cac81ae5ffd8a94e7376bfc0af45132965a39a314ad3bac2aac709793a1955b +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_50000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_50000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4cbc6b3ede85d7b34883832b8ee7b98aeab335c6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_50000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c02df3f3b0385089ed95614d6a1bf1de0654dd75b36fbf0a838eff40530d884 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_51000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_51000.pt new file mode 100644 index 0000000000000000000000000000000000000000..d36d293048544622dff1fc5aa8e552c87a7b78a5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_51000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5792e2d1b36f9e2a1dc2fdbf5c123d2cb73f437586c7283f1d7a1b529539227e +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_52000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_52000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7f8d10de1658b4f2358c4f23a74ab23ba368d19a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_52000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d9158318fa1629bdd341559b3f5abc09248396fdd4933c8a749e7bf171bff10 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_53000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_53000.pt new file mode 100644 index 0000000000000000000000000000000000000000..af57ed197fc2b4ff8b4275611f19a2763f3ba8eb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_53000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e571cf3c6ac1213c1b91fe39754995fbb31cff293ba4ef0f557f11c1df27c64d +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_54000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_54000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b8464be7b696386e330845de619334d097c873a7 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_54000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6f4ad244a10ef0208e081d114f10fc5f2aedeee64e648de8fee51c7281e9e01 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_55000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_55000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f6e76df87fdec72ac52ccfd8a0de22dda7fdedc4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_55000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50d067f7e3569a7e5c762f2240a41bfb0059861ccd107741d5770ead7cb7bf65 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_56000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_56000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5adc06a45da06fc8622f3b68e72a041ffafdb643 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_56000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f99c1a0f2c291e8d5b6cecbd0efc2464b77dce549a3cb72c1c769b295bc20e6 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_57000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_57000.pt new file mode 100644 index 0000000000000000000000000000000000000000..6c960b9e257e4620f39edffc2ee51c3b27921780 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_57000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8bc1a264c76938060db0c483aa85694c44a0c208106a335b10e25bc0065f44f8 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_58000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_58000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f5649648c8408e745deeba68eecfd0e4cc137ae5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_58000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cd914b9de3f930218cd32cd965c909d981957b0d2408428ff598886dabc3d62 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_59000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_59000.pt new file mode 100644 index 0000000000000000000000000000000000000000..2112552e583602490b2851de3b3258e7dbba1f13 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_59000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86fe38e40dc9b4ef32ed3452639006be38b551dca3e43921e6f9d9ca9e16bdb6 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_6000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_6000.pt new file mode 100644 index 0000000000000000000000000000000000000000..98756e234c2951dd131103991bc2784cd8f158c6 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_6000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac60b6cbf6ae686e53f2e58b9fd2d2d625b2f30faf662059844d6c6bc328d920 +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_60000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_60000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5de677d43de68753824a2eb8c0cba4f425877603 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_60000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53b8f4a8601b248e67012a6475601372f194447d50859130932846e1e2e54175 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_61000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_61000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8e03917d0a2c66b2f172f5700e2fd28efdb7def4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_61000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad0a170fff7d71dcad61e411fd1fba05fe562abc4f1bb1552fb3a366b24950e7 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_62000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_62000.pt new file mode 100644 index 0000000000000000000000000000000000000000..875606e35760098d6e19f47353974d98dee875f3 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_62000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5fe8184a6661e566f842dbcca3e212e07f01237745235736db8b45c0dd45989 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_63000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_63000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7cc0973e4df8dd1feaae3ebcb3c056e7e445d741 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_63000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bca10f21c945ab43440b685d80763feb847169155fa5b3e4b4a18751da770975 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_64000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_64000.pt new file mode 100644 index 0000000000000000000000000000000000000000..3347648e9d1e0c74b39a9e8ee504cd0d09350248 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_64000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef65be4c350172e0abcebd53a9c34c68fb5d32d0b9353bd38d4b500cadffdb10 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_65000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_65000.pt new file mode 100644 index 0000000000000000000000000000000000000000..62d37b41509f16ded2216338219675d1307bff7e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_65000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:231e7c546bc4ee06b48f84b091ee7e4e5a82c19a21df5591dd8c4d6f9bf9ba5b +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_66000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_66000.pt new file mode 100644 index 0000000000000000000000000000000000000000..90161d958d3785b5dad1990124bd0c1cb3ada4f0 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_66000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2dcfd4ceec9a0d8847a438de8df9300841855c3fe8fa3f41850581693662af27 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_67000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_67000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c63452d31947f60b156657bb2103c7318725b9d0 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_67000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a178e2b0ffff0270984d0e09370589a575021fc04793bad2189a68c40d23b24f +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_68000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_68000.pt new file mode 100644 index 0000000000000000000000000000000000000000..28ddd94440a5df68f77388091733516cb0548400 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_68000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cfaa672f675e7a720142c5dcbc260b026a907cee1748851c3fca9fe7eada28c +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_69000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_69000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ae8c98f06f9ef3cd8c7436794baebda882dbd585 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_69000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:094cd8f33228218fe1b1689b414fe8c74538bfd8b47c5a9c57d26e76d32277d0 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_7000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_7000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9aa6b344e832990a5ec25eeddc0ec493d71d1fb4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_7000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30f83daad0a278b1a951739751532da355940ebad268a2de3e4e32cfa1f66cff +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_70000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_70000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b136247e2a1cbd16e413cdafbcf1f9970d17cd98 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_70000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a068d95f3716257fd788e789532a1b54eae9a9c1094abbfd40a765f6b81e14a6 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_71000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_71000.pt new file mode 100644 index 0000000000000000000000000000000000000000..08185e71c266665a700fff8e8ab03d5cbd61c244 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_71000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab204f64b2f57f3b72c16b3d79c9c70fd621b03298289261fe101d1c29dd56fa +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_72000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_72000.pt new file mode 100644 index 0000000000000000000000000000000000000000..03731976b1be0445ee2ecadc781607197d6c815d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_72000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d0c01c3b0083d97c6bef2c58760b020828434f1f70ae38f17274257bda87c99 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_73000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_73000.pt new file mode 100644 index 0000000000000000000000000000000000000000..736285271f61174fe70c2ddc29e7bc1ad4408f1b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_73000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e9b0c85b0e0bfe988562343486d5ac3c28c2f4771666fe0d7698ec0b68e5cc8 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_74000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_74000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b475bbbef7d90df7b3965e00935332bef51a301c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_74000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:598953988425b8200b45e2cf35f36625c204899690b0e4df21ac57d28ac0c4fa +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_75000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_75000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4eda93e22ba7219179338b688a99acb46dc1faeb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_75000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3aff1d81bf100d1140f98b8dc818d01f869bc5a02c25e5bc02ac151da4c02a4a +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_76000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_76000.pt new file mode 100644 index 0000000000000000000000000000000000000000..244072fbfe4f4136ef4dae73d88968cfdac20e78 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_76000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:081fc7e04baf4dbba8ca9e32e4d390226534c10f03205b19ef54c757900e41d1 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_77000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_77000.pt new file mode 100644 index 0000000000000000000000000000000000000000..87de7167ee5c9add2692b83a6c173539582b881c --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_77000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:449289d5a0008cff565cfe2932e5ae587168cc186155443df0a011179e62f830 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_78000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_78000.pt new file mode 100644 index 0000000000000000000000000000000000000000..2b9ed46cc8a02516f54f09289fe71df9e71f085e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_78000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01a899cddd86fbb9ab69f8d2eb211694e227881cce4a26408ff5f48b8d078585 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_79000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_79000.pt new file mode 100644 index 0000000000000000000000000000000000000000..84d611918a30c0e8fe9079a858285bbc2a64b51d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_79000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68adb99d2ba3867272ff2202c18e0b92023f82b25fb6aefa9fe6c28b9ff09fe3 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_8000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_8000.pt new file mode 100644 index 0000000000000000000000000000000000000000..152a0ff0f831fcc12ecd4a927662b121231b9ccb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_8000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d5d22f11711e52e3857ab84a285a090703d7444825e8c1621f661b763eccb22 +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_80000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_80000.pt new file mode 100644 index 0000000000000000000000000000000000000000..13eace93853509f9a8ed46d8a260a2eedc8f443a --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_80000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:966dab4c306a16dc0156abf2d643d218f0258b23ea4063a18137fe218970ab4e +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_81000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_81000.pt new file mode 100644 index 0000000000000000000000000000000000000000..4e3da84975a6d017721d350d4f54121a43058c31 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_81000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b8e17fa771357b45c8bfce62cf62daf542c953e320d686613f0c66a3ee3775a +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_82000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_82000.pt new file mode 100644 index 0000000000000000000000000000000000000000..8e5e044f23246d295b5f8b62e696face8747362d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_82000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8891ccb80560097039b081b8f322afde14d716c77ad0bf0613dd824a8987b392 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_83000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_83000.pt new file mode 100644 index 0000000000000000000000000000000000000000..e54d4281b07cfdf1a254f6d5e876bb408c6857e5 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_83000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b82111655d35c662cd68bf42a31b3c5551a707353aae45af88dff9a0d1bb0c9a +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_84000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_84000.pt new file mode 100644 index 0000000000000000000000000000000000000000..5360656ce0039bb3f4bfde43b91b817049d5a822 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_84000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c903f3977ce468483e684b9db91945cacc261b4493b91e82ac4162657e132ad +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_85000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_85000.pt new file mode 100644 index 0000000000000000000000000000000000000000..abde66ecfc9be3b4df325e9d64136945f0a35c18 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_85000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9fbe2f32225af6550ce9f0d058782044af492e580a386fe1f4892c945141167 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_86000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_86000.pt new file mode 100644 index 0000000000000000000000000000000000000000..31d531b786239bfb2f8dc809690e8f6101392a59 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_86000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2089a1c098cced985d0dfaea15df86d10cef7fa933c9a312be6ebc10a1d95011 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_87000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_87000.pt new file mode 100644 index 0000000000000000000000000000000000000000..52622c1b4748b11769b370b601dbba7f51608520 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_87000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1abe2274da99cbc689351c4c01dfc414b436135313b81f3429fad557e7a19ac2 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_88000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_88000.pt new file mode 100644 index 0000000000000000000000000000000000000000..c9d1a256330a21a207138913429f91d6d12c2c12 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_88000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a566d07d24da071295cb1b87851ec3cffcb73179a004e18366d045a536d5c5dd +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_89000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_89000.pt new file mode 100644 index 0000000000000000000000000000000000000000..ebb1c3c1f49990c7741d4625a7b90a6c965dd3dd --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_89000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecd813953a873b0e9ba8e361ccac8e06b0ae2d5fea7b40853d607b63ae303af7 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_9000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_9000.pt new file mode 100644 index 0000000000000000000000000000000000000000..652d51366055b3b4f5041c29d89dcd7dab26d8eb --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_9000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac32c261194e1b0014c0313afa94aa1825e6f521561ff95da0545aee3e9b1e44 +size 47961854 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_90000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_90000.pt new file mode 100644 index 0000000000000000000000000000000000000000..7eb08cb52189d496daa5db9768e3e709628ee015 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_90000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07a5be4a2b957c0ede4d45329a0eb6e7f23ca25039a4a378d7af3353155504b6 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_91000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_91000.pt new file mode 100644 index 0000000000000000000000000000000000000000..fbc58ceb775c4a0a4555fd4746716f70850ecbe1 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_91000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:344d67998ef773a9981cdf932a25f11c4adee724c7eca90b0d8dcbec37bf069f +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_92000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_92000.pt new file mode 100644 index 0000000000000000000000000000000000000000..b1da3ddaed06af97c96ccfd328821d5254bbf48d --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_92000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9a71f23d903f8f4aeac181aecdf181faacdfbe50a74fa41870f524d33f264be +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_93000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_93000.pt new file mode 100644 index 0000000000000000000000000000000000000000..774c82c1a220707e05030339d52e5d10415f1949 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_93000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d179709e72b31c0f4d40d4da165acdb2f8494f9683ceeb95d1664b6a6d078ff4 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_94000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_94000.pt new file mode 100644 index 0000000000000000000000000000000000000000..f233f3bc11ac5f499e47ea1946bbf41932b59fd8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_94000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b7d190b37eda05259725a13e2f8e3f0f6632a25a998a6bfffc22da1dc8ddeb5 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_95000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_95000.pt new file mode 100644 index 0000000000000000000000000000000000000000..9b9653502af1a9dcbf4185356e251fb8f1360445 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_95000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18d5efa65d1eee0440803ba1b397910fbe29f3b908c67fe4e21527df22c414e5 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_96000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_96000.pt new file mode 100644 index 0000000000000000000000000000000000000000..da59586adea49a6181461c75b29c2d2772b52cdf --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_96000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d2d4f57b9aa22b1641872691934bdb9efed67d3cd3fff7645817c137e585b5a +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_97000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_97000.pt new file mode 100644 index 0000000000000000000000000000000000000000..57b9118878ee6c31e6a8af28459b1174bbffbc01 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_97000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cbada651a7717f799f18c6c7b5833df4e6baba6c910e569079ac0e91362fa96 +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_98000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_98000.pt new file mode 100644 index 0000000000000000000000000000000000000000..2b5184cb57b0f31c19f850744761fcac54daf888 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_98000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc5bc35215738ffbb2a13a44b59d3c4d92d2330a8e5d64de43b56878a915c10c +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_99000.pt b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_99000.pt new file mode 100644 index 0000000000000000000000000000000000000000..19a3cfb1790b9d8435b46016bf81722eb4568dc4 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/model_99000.pt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4fa1a32734f8db6440424632b7bd50a6e4ac0fecddba4856f90854f3268f2d5a +size 47962033 diff --git a/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/agent.yaml b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/agent.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6dfb919242fb5760e45c65147d32d365a3dd5cf9 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/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-51-37_vr_m3_12dof_foothold_ll_subband/params/deploy.yaml b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/deploy.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7ad84f54a97b93c49249cc376148275397096941 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/deploy.yaml @@ -0,0 +1,93 @@ +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 + subband: ll + 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-51-37_vr_m3_12dof_foothold_ll_subband/params/env.yaml b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/env.yaml new file mode 100644 index 0000000000000000000000000000000000000000..af4be38ad344f7b7c54e27413585c6a508d087c8 --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/env.yaml @@ -0,0 +1,3770 @@ +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 + - 30 + - 30 + 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: !!python/name:src.tasks.velocity.mdp.observations.DepthHaarLLSubband '' + 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 + subband: ll + 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: !!python/name:src.tasks.velocity.mdp.observations.DepthHaarLLSubband '' + 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 + subband: ll + 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: &id008 !!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: *id008 + 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: &id009 !!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: *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: 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: &id010 !!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: *id010 + 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-51-37_vr_m3_12dof_foothold_ll_subband/params/env_cfgs.py b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/params/env_cfgs.py new file mode 100644 index 0000000000000000000000000000000000000000..28862a1a6de25985074fa1ba236336f28bbc3b6e --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/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=(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 = 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-51-37_vr_m3_12dof_foothold_ll_subband/policy.onnx b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/policy.onnx new file mode 100644 index 0000000000000000000000000000000000000000..cd026d7e8136ebfc5e28fa18ae8b7035bcc77e9b --- /dev/null +++ b/vr_m3_12dof_foothold/2026-07-23_17-51-37_vr_m3_12dof_foothold_ll_subband/policy.onnx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b39b1a832f0520eca7429f4ec30ec4d05335c002166a1e3c84b737a6d136834c +size 7781488