ctessler commited on
Commit
ada8167
·
verified ·
1 Parent(s): a571317

Read the scene from the host in the G1 saved configuration

Browse files

The 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 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
- Include both files when
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 **native preset and generic re-export disable scenes**: the bundled
114
- observation functions always produce zero corner tokens and false visibility
115
- masks. Running `deployment/export_to_onnx.py` on this checkpoint preserves the
116
- weights but builds that scene-disabled observation path. It does not reproduce
117
- the scene-capable 39-input ONNX. The preset rejects a furniture scene file
118
- rather than silently ignoring it.
119
-
120
- This distinction is intentional: these weights support scenes, but this
121
- package does not add a scene provider or a SAMP training recipe to ProtoMotions.
 
 
 
 
 
 
 
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. Scene tokens are explicitly hidden on this empty
9
- terrain; furniture interaction needs its own scene observations.
 
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": "source",
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": 7498,
16
- "sha256": "b32cfa63ff4151113db965bf5af898451d1095e577ccd07ea8d2975c6590d692"
17
  },
18
  {
19
  "path": "G1/NOTICE.txt",
@@ -32,8 +32,8 @@
32
  },
33
  {
34
  "path": "G1/experiment_config.py",
35
- "size": 20409,
36
- "sha256": "90c0a6411f7717e8e699ebb419fabb66000010445c92464c7c05c60fc160bb06"
37
  },
38
  {
39
  "path": "G1/inference_last.ckpt",
@@ -47,8 +47,8 @@
47
  },
48
  {
49
  "path": "G1/resolved_configs.json",
50
- "size": 91797,
51
- "sha256": "3919e9f4a30072cd708995293d3301388b4248a4c39a9604668b5dcc532bc5e0"
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
  }