Read the scene from the host in the G1 saved configuration
Browse filesThe saved configuration's scene_boxes control publishes an empty scene of fixed capacity (one object, two boxes) in the simulator, and the two scene observations compute the box corners inside the policy from the joint readings and the torso anchor pose with the goal's FK kernel, replacing the two dummy observations. The generic export takes eight scene_boxes_* inputs beside the sensor readings (37 in all). Weights, launch config, provenance and browser graphs unchanged; the model card's license sentence regains its subject. Verified against the pinned Oct-25 graph on 64 MuJoCo playback states and four scene cases: raw action within 1.1e-5, gains exact.
- G1/MODEL_CARD.md +18 -11
- G1/experiment_config.py +9 -10
- G1/resolved_configs.json +46 -15
- config.json +6 -6
G1/MODEL_CARD.md
CHANGED
|
@@ -14,8 +14,8 @@ See [NOTICE.txt](NOTICE.txt) for attribution.
|
|
| 14 |
- Release: Metatron v1; native package hosted in `nvidia/Metatron-v1/G1`.
|
| 15 |
Use the pinned revision selected by the ProtoMotions download helper. No public
|
| 16 |
ProtoMotions release tag is asserted by this model card.
|
| 17 |
-
|
| 18 |
-
redistributing these artifacts.
|
| 19 |
|
| 20 |
ProtoMotions source code remains Apache-2.0. Training datasets and robot assets
|
| 21 |
have separate terms; this model license does not grant rights to those materials.
|
|
@@ -110,15 +110,22 @@ frame) and `scene_box_mask` (`true` means visible). Our separately pre-exported
|
|
| 110 |
39-input ONNX includes the original scene preprocessing and also retains this
|
| 111 |
capability. A scene-capable host must supply the matching object measurements.
|
| 112 |
|
| 113 |
-
The **
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
|
| 123 |
## Limitations
|
| 124 |
|
|
|
|
| 14 |
- Release: Metatron v1; native package hosted in `nvidia/Metatron-v1/G1`.
|
| 15 |
Use the pinned revision selected by the ProtoMotions download helper. No public
|
| 16 |
ProtoMotions release tag is asserted by this model card.
|
| 17 |
+
- License and notice: `LICENSE.pdf` and `NOTICE.txt` ship beside the weights.
|
| 18 |
+
Include both files when redistributing these artifacts.
|
| 19 |
|
| 20 |
ProtoMotions source code remains Apache-2.0. Training datasets and robot assets
|
| 21 |
have separate terms; this model license does not grant rights to those materials.
|
|
|
|
| 110 |
39-input ONNX includes the original scene preprocessing and also retains this
|
| 111 |
capability. A scene-capable host must supply the matching object measurements.
|
| 112 |
|
| 113 |
+
The **saved configuration reads the scene from the host**: its `scene_boxes`
|
| 114 |
+
control publishes an empty scene of fixed capacity (one object, two boxes) in
|
| 115 |
+
the simulator, and the two scene observations compute the box corners in the
|
| 116 |
+
root-heading frame inside the policy from the joint readings and the torso
|
| 117 |
+
anchor pose, with the same forward-kinematics kernel as the goal. Running
|
| 118 |
+
`deployment/export_to_onnx.py` on this checkpoint therefore produces a graph
|
| 119 |
+
with eight `scene_boxes_*` inputs (box centers, extents and validity, object
|
| 120 |
+
visibility, pose and the per-episode position and yaw bias) beside the sensor
|
| 121 |
+
readings; a host with no scene feeds the empty scene (every box invalid and
|
| 122 |
+
hidden), and a scene-capable host feeds its object measurements. The native
|
| 123 |
+
preset still plays on empty terrain and rejects a furniture scene file rather
|
| 124 |
+
than silently ignoring it.
|
| 125 |
+
|
| 126 |
+
This distinction is intentional: these weights support scenes and the export
|
| 127 |
+
takes them, but this package does not add a scene provider or a SAMP training
|
| 128 |
+
recipe to ProtoMotions.
|
| 129 |
|
| 130 |
## Limitations
|
| 131 |
|
G1/experiment_config.py
CHANGED
|
@@ -5,8 +5,9 @@
|
|
| 5 |
|
| 6 |
This recipe preserves the trained module order, normalization and five-body
|
| 7 |
order. It is an inference qualification recipe, not a reproduction of the
|
| 8 |
-
four-group training run.
|
| 9 |
-
terrain
|
|
|
|
| 10 |
"""
|
| 11 |
|
| 12 |
from argparse import Namespace
|
|
@@ -15,10 +16,6 @@ from typing import Any, List, Optional, Sequence
|
|
| 15 |
from examples.experiments.masked_mimic.deployable_g1_observations import (
|
| 16 |
configure_observations,
|
| 17 |
)
|
| 18 |
-
from examples.inference.metatron import (
|
| 19 |
-
empty_scene_corners,
|
| 20 |
-
empty_scene_mask,
|
| 21 |
-
)
|
| 22 |
from protomotions.agents.common.config import (
|
| 23 |
MLPLayerConfig,
|
| 24 |
MLPWithConcatConfig,
|
|
@@ -51,6 +48,7 @@ from protomotions.envs.control.masked_mimic_control import (
|
|
| 51 |
MaskedMimicStyleConfig,
|
| 52 |
MaskedMimicVelocityCommandConfig,
|
| 53 |
)
|
|
|
|
| 54 |
from protomotions.envs.mdp_component import MdpComponent
|
| 55 |
from protomotions.envs.motion_manager.config import MimicMotionManagerConfig
|
| 56 |
from protomotions.envs.obs.cast import to_float
|
|
@@ -149,7 +147,10 @@ def env_config(robot_cfg: RobotConfig, args: Namespace) -> EnvConfig:
|
|
| 149 |
anchor_pose_submasking=True,
|
| 150 |
style=MaskedMimicStyleConfig(),
|
| 151 |
velocity_command=MaskedMimicVelocityCommandConfig(),
|
| 152 |
-
)
|
|
|
|
|
|
|
|
|
|
| 153 |
},
|
| 154 |
observation_components={
|
| 155 |
"max_coords_obs": MdpComponent.from_kernel(
|
|
@@ -175,11 +176,9 @@ def env_config(robot_cfg: RobotConfig, args: Namespace) -> EnvConfig:
|
|
| 175 |
to_float,
|
| 176 |
x=EnvContext.current_action,
|
| 177 |
),
|
| 178 |
-
"scene_box_corners": MdpComponent.from_kernel(empty_scene_corners),
|
| 179 |
-
"scene_box_mask": MdpComponent.from_kernel(empty_scene_mask),
|
| 180 |
},
|
| 181 |
)
|
| 182 |
-
configure_observations(robot_cfg, cfg)
|
| 183 |
for name, path in (
|
| 184 |
("poses", EnvContext.masked_mimic.style_pose_samples),
|
| 185 |
("velocities", EnvContext.masked_mimic.style_velocity_samples),
|
|
|
|
| 5 |
|
| 6 |
This recipe preserves the trained module order, normalization and five-body
|
| 7 |
order. It is an inference qualification recipe, not a reproduction of the
|
| 8 |
+
four-group training run. The scene stream is published empty on this flat
|
| 9 |
+
terrain and read from the host at deployment; furniture interaction in the
|
| 10 |
+
simulator needs a scene-library-backed control.
|
| 11 |
"""
|
| 12 |
|
| 13 |
from argparse import Namespace
|
|
|
|
| 16 |
from examples.experiments.masked_mimic.deployable_g1_observations import (
|
| 17 |
configure_observations,
|
| 18 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
from protomotions.agents.common.config import (
|
| 20 |
MLPLayerConfig,
|
| 21 |
MLPWithConcatConfig,
|
|
|
|
| 48 |
MaskedMimicStyleConfig,
|
| 49 |
MaskedMimicVelocityCommandConfig,
|
| 50 |
)
|
| 51 |
+
from protomotions.envs.control.scene_boxes_control import SceneBoxesControlConfig
|
| 52 |
from protomotions.envs.mdp_component import MdpComponent
|
| 53 |
from protomotions.envs.motion_manager.config import MimicMotionManagerConfig
|
| 54 |
from protomotions.envs.obs.cast import to_float
|
|
|
|
| 147 |
anchor_pose_submasking=True,
|
| 148 |
style=MaskedMimicStyleConfig(),
|
| 149 |
velocity_command=MaskedMimicVelocityCommandConfig(),
|
| 150 |
+
),
|
| 151 |
+
# The scene the policy was trained to read: one object of two boxes,
|
| 152 |
+
# published empty here and filled by a scene-capable host.
|
| 153 |
+
"scene_boxes": SceneBoxesControlConfig(),
|
| 154 |
},
|
| 155 |
observation_components={
|
| 156 |
"max_coords_obs": MdpComponent.from_kernel(
|
|
|
|
| 176 |
to_float,
|
| 177 |
x=EnvContext.current_action,
|
| 178 |
),
|
|
|
|
|
|
|
| 179 |
},
|
| 180 |
)
|
| 181 |
+
configure_observations(robot_cfg, cfg, scene_boxes=True)
|
| 182 |
for name, path in (
|
| 183 |
("poses", EnvContext.masked_mimic.style_pose_samples),
|
| 184 |
("velocities", EnvContext.masked_mimic.style_velocity_samples),
|
G1/resolved_configs.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
{
|
| 2 |
"format_version": 1,
|
| 3 |
-
"protomotions": "
|
| 4 |
"configs": {
|
| 5 |
"robot": {
|
| 6 |
"$type": "protomotions.robot_configs.g1.G1RobotConfig",
|
|
@@ -464,6 +464,12 @@
|
|
| 464 |
"horizon_seconds": 0.5,
|
| 465 |
"probability": 0.5
|
| 466 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 467 |
}
|
| 468 |
},
|
| 469 |
"termination_components": {},
|
|
@@ -569,20 +575,6 @@
|
|
| 569 |
},
|
| 570 |
"params": {}
|
| 571 |
},
|
| 572 |
-
"scene_box_corners": {
|
| 573 |
-
"$kernel": "examples.inference.metatron.empty_scene_corners",
|
| 574 |
-
"bindings": {
|
| 575 |
-
"dof_pos": "current.dof_pos"
|
| 576 |
-
},
|
| 577 |
-
"params": {}
|
| 578 |
-
},
|
| 579 |
-
"scene_box_mask": {
|
| 580 |
-
"$kernel": "examples.inference.metatron.empty_scene_mask",
|
| 581 |
-
"bindings": {
|
| 582 |
-
"dof_pos": "current.dof_pos"
|
| 583 |
-
},
|
| 584 |
-
"params": {}
|
| 585 |
-
},
|
| 586 |
"fk_max_coords_obs": {
|
| 587 |
"$kernel_object": "protomotions.utils.baked_fk.BakedAnchorFK",
|
| 588 |
"init": {
|
|
@@ -718,6 +710,45 @@
|
|
| 718 |
},
|
| 719 |
"params": {}
|
| 720 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 721 |
"masked_mimic_style_poses": {
|
| 722 |
"$kernel": "protomotions.envs.obs.cast.to_float",
|
| 723 |
"bindings": {
|
|
|
|
| 1 |
{
|
| 2 |
"format_version": 1,
|
| 3 |
+
"protomotions": "3.1",
|
| 4 |
"configs": {
|
| 5 |
"robot": {
|
| 6 |
"$type": "protomotions.robot_configs.g1.G1RobotConfig",
|
|
|
|
| 464 |
"horizon_seconds": 0.5,
|
| 465 |
"probability": 0.5
|
| 466 |
}
|
| 467 |
+
},
|
| 468 |
+
"scene_boxes": {
|
| 469 |
+
"$type": "protomotions.envs.control.scene_boxes_control.SceneBoxesControlConfig",
|
| 470 |
+
"_target_": "protomotions.envs.control.scene_boxes_control.SceneBoxesControl",
|
| 471 |
+
"max_objects": 1,
|
| 472 |
+
"max_boxes_per_object": 2
|
| 473 |
}
|
| 474 |
},
|
| 475 |
"termination_components": {},
|
|
|
|
| 575 |
},
|
| 576 |
"params": {}
|
| 577 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 578 |
"fk_max_coords_obs": {
|
| 579 |
"$kernel_object": "protomotions.utils.baked_fk.BakedAnchorFK",
|
| 580 |
"init": {
|
|
|
|
| 710 |
},
|
| 711 |
"params": {}
|
| 712 |
},
|
| 713 |
+
"scene_box_corners": {
|
| 714 |
+
"$kernel": "protomotions.envs.obs.scene_boxes.compute_fk_scene_box_corners",
|
| 715 |
+
"bindings": {
|
| 716 |
+
"object_pos": "scene_boxes.object_pos",
|
| 717 |
+
"object_rot": "scene_boxes.object_rot",
|
| 718 |
+
"centers": "scene_boxes.centers",
|
| 719 |
+
"extents": "scene_boxes.extents",
|
| 720 |
+
"valid": "scene_boxes.valid",
|
| 721 |
+
"position_offset": "scene_boxes.position_offset",
|
| 722 |
+
"yaw_offset": "scene_boxes.yaw_offset",
|
| 723 |
+
"dof_pos": "noisy.dof_pos",
|
| 724 |
+
"anchor_pos": "noisy.anchor_pos",
|
| 725 |
+
"anchor_rot": "noisy.anchor_rot",
|
| 726 |
+
"anchor_body_index": "noisy.anchor_idx"
|
| 727 |
+
},
|
| 728 |
+
"params": {
|
| 729 |
+
"fk": {
|
| 730 |
+
"$kernel_object": "protomotions.utils.baked_fk.BakedAnchorFK",
|
| 731 |
+
"init": {
|
| 732 |
+
"anchor_idx": 16,
|
| 733 |
+
"trackable_body_indices": [
|
| 734 |
+
16,
|
| 735 |
+
13,
|
| 736 |
+
7,
|
| 737 |
+
24,
|
| 738 |
+
32
|
| 739 |
+
]
|
| 740 |
+
}
|
| 741 |
+
}
|
| 742 |
+
}
|
| 743 |
+
},
|
| 744 |
+
"scene_box_mask": {
|
| 745 |
+
"$kernel": "protomotions.envs.obs.scene_boxes.compute_scene_box_mask",
|
| 746 |
+
"bindings": {
|
| 747 |
+
"visible": "scene_boxes.visible",
|
| 748 |
+
"valid": "scene_boxes.valid"
|
| 749 |
+
},
|
| 750 |
+
"params": {}
|
| 751 |
+
},
|
| 752 |
"masked_mimic_style_poses": {
|
| 753 |
"$kernel": "protomotions.envs.obs.cast.to_float",
|
| 754 |
"bindings": {
|
config.json
CHANGED
|
@@ -12,8 +12,8 @@
|
|
| 12 |
},
|
| 13 |
{
|
| 14 |
"path": "G1/MODEL_CARD.md",
|
| 15 |
-
"size":
|
| 16 |
-
"sha256": "
|
| 17 |
},
|
| 18 |
{
|
| 19 |
"path": "G1/NOTICE.txt",
|
|
@@ -32,8 +32,8 @@
|
|
| 32 |
},
|
| 33 |
{
|
| 34 |
"path": "G1/experiment_config.py",
|
| 35 |
-
"size":
|
| 36 |
-
"sha256": "
|
| 37 |
},
|
| 38 |
{
|
| 39 |
"path": "G1/inference_last.ckpt",
|
|
@@ -47,8 +47,8 @@
|
|
| 47 |
},
|
| 48 |
{
|
| 49 |
"path": "G1/resolved_configs.json",
|
| 50 |
-
"size":
|
| 51 |
-
"sha256": "
|
| 52 |
}
|
| 53 |
]
|
| 54 |
}
|
|
|
|
| 12 |
},
|
| 13 |
{
|
| 14 |
"path": "G1/MODEL_CARD.md",
|
| 15 |
+
"size": 8057,
|
| 16 |
+
"sha256": "b620ad3af7ef46041a8139e983b53d6ad9d92cd0a095282efa0c5a3c53e4a95f"
|
| 17 |
},
|
| 18 |
{
|
| 19 |
"path": "G1/NOTICE.txt",
|
|
|
|
| 32 |
},
|
| 33 |
{
|
| 34 |
"path": "G1/experiment_config.py",
|
| 35 |
+
"size": 20529,
|
| 36 |
+
"sha256": "51784e3154d739807e2a8935e74eac05df2af0e25408a5229dd153cd8edaa1df"
|
| 37 |
},
|
| 38 |
{
|
| 39 |
"path": "G1/inference_last.ckpt",
|
|
|
|
| 47 |
},
|
| 48 |
{
|
| 49 |
"path": "G1/resolved_configs.json",
|
| 50 |
+
"size": 93009,
|
| 51 |
+
"sha256": "7fb1e13884292976746647593451541905cf2018849643ddb57f9d814baddc3d"
|
| 52 |
}
|
| 53 |
]
|
| 54 |
}
|