Skip to content

Commit b4587ce

Browse files
committed
Migrate motion_controllers to new device/retargeter registry pattern
- Remove old isaaclab_arena/teleop_devices/motion_controllers.py - Add MotionControllersCfg device to device_library.py - Add G1WbcPinkMotionControllersRetargeter to retargeter_library.py - Update asset_registry to handle list of retargeters (needed for motion controllers which require 2 retargeters) - Motion controllers now follow the same pattern as other teleop devices
1 parent 924fc5e commit b4587ce

File tree

4 files changed

+49
-88
lines changed

4 files changed

+49
-88
lines changed

isaaclab_arena/assets/asset_registry.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,13 @@ def get_teleop_device_cfg(self, device: type["TeleopDeviceBase"], embodiment: ob
133133
retargeter_key_str = retargeter_registry.convert_tuple_to_str(retargeter_key)
134134
retargeter = retargeter_registry.get_component_by_name(retargeter_key_str)()
135135
retargeter_cfg = retargeter.get_retargeter_cfg(embodiment, sim_device=device.sim_device)
136-
retargeters = [retargeter_cfg] if retargeter_cfg is not None else []
136+
# Handle both single retargeter and list of retargeters
137+
if isinstance(retargeter_cfg, list):
138+
retargeters = retargeter_cfg
139+
elif retargeter_cfg is not None:
140+
retargeters = [retargeter_cfg]
141+
else:
142+
retargeters = []
137143
device_cfg = device.get_device_cfg(retargeters=retargeters, embodiment=embodiment)
138144
return DevicesCfg(
139145
devices={

isaaclab_arena/assets/device_library.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@
2020

2121
from isaaclab.devices.keyboard import Se3KeyboardCfg
2222
from isaaclab.devices.openxr import OpenXRDeviceCfg
23-
from isaaclab.devices.openxr.retargeters import (
24-
G1LowerBodyStandingMotionControllerRetargeterCfg,
25-
G1TriHandUpperBodyMotionControllerGripperRetargeterCfg,
26-
)
2723
from isaaclab.devices.openxr.xr_cfg import XrAnchorRotationMode
2824
from isaaclab.devices.retargeter_base import RetargeterCfg
2925
from isaaclab.devices.spacemouse import Se3SpaceMouseCfg
@@ -107,7 +103,6 @@ class MotionControllersCfg(TeleopDeviceBase):
107103
108104
This device uses motion controllers instead of hand tracking for teleoperation.
109105
It's useful when you have VR controllers but not hand tracking capability.
110-
Currently supports G1 humanoid robot with gripper control via trigger buttons.
111106
"""
112107

113108
name = "motion_controllers"
@@ -120,28 +115,24 @@ def __init__(self, sim_device: str | None = None):
120115
"""
121116
super().__init__(sim_device=sim_device)
122117

123-
def get_device_cfg(self, retargeters: list[RetargeterCfg] | None = None, embodiment: object | None = None):
118+
def get_device_cfg(
119+
self, retargeters: list[RetargeterCfg] | None = None, embodiment: object | None = None
120+
) -> OpenXRDeviceCfg:
124121
"""Get the teleop device configuration.
125122
126123
Args:
127-
retargeters: List of retargeters (unused for motion controllers).
124+
retargeters: List of retargeters from the retargeter registry.
128125
embodiment: The embodiment to use for the teleop device configuration.
129126
130127
Returns:
131128
OpenXRDeviceCfg: The device configuration for motion controllers.
132129
"""
133130
xr_cfg = embodiment.get_xr_cfg()
131+
# Motion controllers need smoothed anchor rotation following the robot prim
134132
xr_cfg.anchor_rotation_mode = XrAnchorRotationMode.FOLLOW_PRIM_SMOOTHED
135133

136134
return OpenXRDeviceCfg(
137-
retargeters=[
138-
G1TriHandUpperBodyMotionControllerGripperRetargeterCfg(
139-
sim_device=self.sim_device,
140-
),
141-
G1LowerBodyStandingMotionControllerRetargeterCfg(
142-
sim_device=self.sim_device,
143-
),
144-
],
135+
retargeters=retargeters,
145136
sim_device=self.sim_device,
146137
xr_cfg=xr_cfg,
147138
)

isaaclab_arena/assets/retargeter_library.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818

1919
from abc import ABC, abstractmethod
2020

21-
from isaaclab.devices.openxr.retargeters import GR1T2RetargeterCfg
21+
from isaaclab.devices.openxr.retargeters import (
22+
G1LowerBodyStandingMotionControllerRetargeterCfg,
23+
G1TriHandUpperBodyMotionControllerGripperRetargeterCfg,
24+
GR1T2RetargeterCfg,
25+
)
2226
from isaaclab.devices.retargeter_base import RetargeterCfg
2327

2428
from isaaclab_arena.assets.register import register_retargeter
@@ -31,7 +35,14 @@ class RetargetterBase(ABC):
3135
@abstractmethod
3236
def get_retargeter_cfg(
3337
self, embodiment: object, sim_device: str, enable_visualization: bool = False
34-
) -> RetargeterCfg:
38+
) -> RetargeterCfg | list[RetargeterCfg] | None:
39+
"""Get retargeter configuration.
40+
41+
Can return:
42+
- A single RetargeterCfg
43+
- A list of RetargeterCfg (for devices needing multiple retargeters)
44+
- None (for devices that don't need retargeters)
45+
"""
3546
raise NotImplementedError
3647

3748

@@ -97,3 +108,26 @@ def get_retargeter_cfg(
97108
self, agibot_embodiment, sim_device: str, enable_visualization: bool = False
98109
) -> RetargeterCfg | None:
99110
return None
111+
112+
113+
@register_retargeter
114+
class G1WbcPinkMotionControllersRetargeter(RetargetterBase):
115+
"""Retargeter for G1 WBC Pink embodiment with motion controllers (Quest controllers)."""
116+
117+
device = "motion_controllers"
118+
embodiment = "g1_wbc_pink"
119+
120+
def __init__(self):
121+
pass
122+
123+
def get_retargeter_cfg(
124+
self, g1_embodiment, sim_device: str, enable_visualization: bool = False
125+
) -> list[RetargeterCfg]:
126+
"""Get motion controller retargeter configuration for G1.
127+
128+
Returns a list of retargeters for upper body (with gripper) and lower body.
129+
"""
130+
return [
131+
G1TriHandUpperBodyMotionControllerGripperRetargeterCfg(sim_device=sim_device),
132+
G1LowerBodyStandingMotionControllerRetargeterCfg(sim_device=sim_device),
133+
]

isaaclab_arena/teleop_devices/motion_controllers.py

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)