diff --git a/assets/robots/galbot_one_golf_description/README.md b/assets/robots/galbot_one_golf_description/README.md index 27feb4e7..b6f53639 100644 --- a/assets/robots/galbot_one_golf_description/README.md +++ b/assets/robots/galbot_one_golf_description/README.md @@ -25,6 +25,13 @@ textures are stored under `usd/`. Variant sets on the root prim (defaults in bold): Physics (**physx**, physics, none, mujoco), Robot (**none**, robot), Sensor (**none**, sensors). +The `d405` visuals use the forward `d405_sz073` assembly from description +revision `69cdfde0178f2eed10c4b2e612c0c3d3b2263c7a`. Its built-in stand replaces +the hidden original stand; collision geometry and physics are unchanged. +Wrist camera parameters match SynthNova's Yundonghui calibration at 640 x 360. +The standard IsaacLab camera implementation is retained, including its +runtime square-pixel assumption (`fy=fx`). + ## LICENSE This software is licensed under the Apache License 2.0. See `LICENSE` for details. diff --git a/assets/robots/galbot_one_golf_description/usd/payloads/base.usda b/assets/robots/galbot_one_golf_description/usd/payloads/base.usda index a8cae7f3..c3bff6bb 100644 --- a/assets/robots/galbot_one_golf_description/usd/payloads/base.usda +++ b/assets/robots/galbot_one_golf_description/usd/payloads/base.usda @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8b875d66fbc490581e480766dc2f5d4ad223503031903e22050e5d9f6eeabbd +oid sha256:a1f8db0babad4db0827936f689cfe6cbc72a7c9268f6181b1c3d6831704930ce size 159611 diff --git a/assets/robots/galbot_one_golf_description/usd/payloads/geometries.usd b/assets/robots/galbot_one_golf_description/usd/payloads/geometries.usd index e31484ee..fe062a50 100644 --- a/assets/robots/galbot_one_golf_description/usd/payloads/geometries.usd +++ b/assets/robots/galbot_one_golf_description/usd/payloads/geometries.usd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9b27cec215224033c055c896d2bb4bf2e7c83abbbc689b99a1075dcaca536d46 -size 6126521 +oid sha256:c7e7786a5e628a72e862525b1d3980c528280eda8c9541f822e357e831e8021c +size 7040765 diff --git a/assets/robots/galbot_one_golf_description/usd/payloads/instances.usda b/assets/robots/galbot_one_golf_description/usd/payloads/instances.usda index 55141b76..ce5451b0 100644 --- a/assets/robots/galbot_one_golf_description/usd/payloads/instances.usda +++ b/assets/robots/galbot_one_golf_description/usd/payloads/instances.usda @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:51ee22994b8f655c8c02101ded61b0d9429f54b27336b255a5e156dc3114d5bd -size 68312 +oid sha256:ba2762c5e82283a0820973a89d905951ef26177cb8e0815e6678861153b01409 +size 67782 diff --git a/robolab/robots/galbot_golf.py b/robolab/robots/galbot_golf.py index e9747d82..47c56147 100644 --- a/robolab/robots/galbot_golf.py +++ b/robolab/robots/galbot_golf.py @@ -71,27 +71,25 @@ def _source_replay_camera( def _wrist_camera(side: str) -> TiledCameraCfg: - """Camera parented to Golf's URDF camera frame, using its +Z optical axis.""" + """Yundonghui policy calibration resized from 400x224 to 640x360.""" return TiledCameraCfg( - prim_path=( - f"{{ENV_REGEX_NS}}/robot/{side}_arm_link7/" - f"{side}_arm_wrist_camera_stand/{side}_wrist_camera_link/{side}_wrist_cam" - ), - height=224, - width=400, + prim_path=f"{{ENV_REGEX_NS}}/robot/{side}_arm_link7/{side}_wrist_cam", + height=360, + width=640, data_types=["rgb"], spawn=sim_utils.PinholeCameraCfg( - focal_length=202 * 0.03, + # Scaled intrinsics: fx=323.2, fy=324.642857, cx=320, cy=180. + focal_length=6.06, focus_distance=0.0, - horizontal_aperture=400 * 0.03, - vertical_aperture=224 * 0.03, + horizontal_aperture=12.0, + vertical_aperture=6.72, clipping_range=(0.03, 10.0), ), - # The URDF camera link supplies the optical +Z direction, but its image - # axes are rolled 90 degrees relative to the upright D405 recording. + # Mount-relative calibration expressed in arm_link7, quaternion WXYZ. + # Both wrists have the same rotation (the source quaternions differ only in sign). offset=TiledCameraCfg.OffsetCfg( - pos=(0.0, 0.0, 0.0), - rot=(0.7071067812, 0.0, 0.0, 0.7071067812), + pos=(-0.18015459385344976, 0.011084636915734618, -0.0475356786953811), + rot=(-0.5860286987303605, -0.38397145780165504, 0.3981361647004496, 0.5921350168801781), convention="ros", ), ) diff --git a/tests/test_galbot_configs.py b/tests/test_galbot_configs.py index 5403b586..61bde49e 100644 --- a/tests/test_galbot_configs.py +++ b/tests/test_galbot_configs.py @@ -74,11 +74,11 @@ def test_left_ego_camera_uses_policy_calibration(): def test_wrist_cameras_use_golf_sensor_calibration(): left = GalbotGolfLeftWristCameraCfg().left_wrist_cam right = GalbotGolfRightWristCameraCfg().right_wrist_cam - assert (left.width, left.height) == (400, 224) - assert (right.width, right.height) == (400, 224) + assert (left.width, left.height) == (640, 360) + assert (right.width, right.height) == (640, 360) for camera in (left, right): - assert camera.width * camera.spawn.focal_length / camera.spawn.horizontal_aperture == pytest.approx(202) - assert camera.height * camera.spawn.focal_length / camera.spawn.vertical_aperture == pytest.approx(202) + assert camera.width * camera.spawn.focal_length / camera.spawn.horizontal_aperture == pytest.approx(323.2) + assert camera.height * camera.spawn.focal_length / camera.spawn.vertical_aperture == pytest.approx(324.642857) assert camera.spawn.clipping_range == pytest.approx((0.03, 10.0))