Skip to content

Commit 44e01de

Browse files
committed
Add SO-101 cube-stack task with XR teleoperation
Add an SO-101 (5-DOF) cube-stacking environment driven by XR teleoperation through the IsaacTeleop retargeting pipeline. - Add the SO-101 robot asset and register it in isaaclab_assets. - Add Isaac-Stack-Cube-SO101 joint-position and IK-Abs task configs. The 5-DOF arm uses position-only IK over four joints, with the wrist roll driven directly and an analog gripper, flattened to a 5D action [pos_x, pos_y, pos_z, roll, gripper]. - Build the teleop pipeline from three retargeters: a clutch (relative-origin EE pose), a wrist-roll swing-twist, and an analog gripper. Clutch engage behavior, so engaging teleop does not jerk the arm: - Latch the controller origin on the first RUNNING frame (the headset "Play"), re-arming whenever teleop is not running, so connecting the client never latches and every Play re-zeroes to the controller's current pose. - Rotate the world-frame controller delta into the seated base frame (yawed +90 deg about +Z) before commanding the position-only IK. - Latch the robot's live end-effector position, converted into the base frame, as the clutch home on engage instead of a fixed constant, so a steady controller leaves the arm still. isaaclab_teleop: add IsaacTeleopCfg.ee_frame_prim_path; the device reads that prim's world transform each frame and supplies it to the pipeline as the robot_ee_pos ValueInput leaf (passed through verbatim, not composed with the anchor/rebase transforms). Add sim-free unit tests for the retargeter math: clutch rebasing, world-to-base conversion against a scipy oracle, swing-twist roll, and the analog gripper mapping.
1 parent eacb2f4 commit 44e01de

15 files changed

Lines changed: 1589 additions & 69 deletions

File tree

source/isaaclab_assets/isaaclab_assets/robots/__init__.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ __all__ = [
3636
"RIDGEBACK_FRANKA_PANDA_CFG",
3737
"SAWYER_CFG",
3838
"SHADOW_HAND_CFG",
39+
"SO101_CFG",
40+
"SO101_HIGH_PD_CFG",
3941
"joint_parameter_lookup",
4042
"SPOT_CFG",
4143
"GO1_ACTUATOR_CFG",
@@ -85,6 +87,7 @@ from .quadcopter import CRAZYFLIE_CFG
8587
from .ridgeback_franka import RIDGEBACK_FRANKA_PANDA_CFG
8688
from .sawyer import SAWYER_CFG
8789
from .shadow_hand import SHADOW_HAND_CFG
90+
from .so101 import SO101_CFG, SO101_HIGH_PD_CFG
8891
from .spot import joint_parameter_lookup, SPOT_CFG
8992
from .unitree import (
9093
GO1_ACTUATOR_CFG,
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
6+
"""Configuration for the TheRobotStudio SO-101 follower arm.
7+
8+
The following configurations are available:
9+
10+
* :obj:`SO101_CFG`: SO-101 5-DOF arm with a single-jaw gripper.
11+
* :obj:`SO101_HIGH_PD_CFG`: SO-101 with a stiffer PD controller for task-space (IK) tracking.
12+
13+
The SO-101 is a low-cost 5-DOF arm (``shoulder_pan``, ``shoulder_lift``, ``elbow_flex``,
14+
``wrist_flex``, ``wrist_roll``) plus a single revolute ``gripper`` jaw. Because the arm has
15+
only 5 actuated DOF, it cannot achieve an arbitrary 6-DOF end-effector pose; task-space
16+
controllers should use position-only commands, optionally with a direct ``wrist_roll`` channel
17+
for roll (see the cube-stack IK-Abs task).
18+
19+
Reference: https://github.com/TheRobotStudio/SO-ARM100
20+
Actuator gains follow the values tuned for simulation in LeIsaac.
21+
"""
22+
23+
import isaaclab.sim as sim_utils
24+
from isaaclab.actuators import ImplicitActuatorCfg
25+
from isaaclab.assets.articulation import ArticulationCfg
26+
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR
27+
28+
##
29+
# Configuration
30+
##
31+
32+
SO101_CFG = ArticulationCfg(
33+
spawn=sim_utils.UsdFileCfg(
34+
usd_path=f"{ISAAC_NUCLEUS_DIR}/Robots/RobotStudio/so101_new_calib/so101_new_calib.usd",
35+
activate_contact_sensors=False,
36+
rigid_props=sim_utils.RigidBodyPropertiesCfg(
37+
disable_gravity=False,
38+
max_depenetration_velocity=5.0,
39+
),
40+
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
41+
enabled_self_collisions=True,
42+
solver_position_iteration_count=8,
43+
solver_velocity_iteration_count=0,
44+
fix_root_link=True,
45+
),
46+
),
47+
init_state=ArticulationCfg.InitialStateCfg(
48+
joint_pos={
49+
"shoulder_pan": 0.0,
50+
"shoulder_lift": 0.0,
51+
"elbow_flex": 0.0,
52+
"wrist_flex": 0.0,
53+
"wrist_roll": 0.0,
54+
"gripper": 0.0,
55+
},
56+
),
57+
actuators={
58+
"arm": ImplicitActuatorCfg(
59+
joint_names_expr=["shoulder_pan", "shoulder_lift", "elbow_flex", "wrist_flex", "wrist_roll"],
60+
effort_limit_sim=10.0,
61+
velocity_limit_sim=10.0,
62+
stiffness=17.8,
63+
damping=0.60,
64+
),
65+
"gripper": ImplicitActuatorCfg(
66+
joint_names_expr=["gripper"],
67+
effort_limit_sim=10.0,
68+
velocity_limit_sim=10.0,
69+
stiffness=17.8,
70+
damping=0.60,
71+
),
72+
},
73+
soft_joint_pos_limit_factor=1.0,
74+
)
75+
"""Configuration of the SO-101 follower arm with implicit actuators."""
76+
77+
78+
SO101_HIGH_PD_CFG = SO101_CFG.copy()
79+
SO101_HIGH_PD_CFG.spawn.rigid_props.disable_gravity = True
80+
SO101_HIGH_PD_CFG.actuators["arm"].stiffness = 400.0
81+
SO101_HIGH_PD_CFG.actuators["arm"].damping = 80.0
82+
"""Configuration of the SO-101 follower arm with stiffer PD control.
83+
84+
This configuration is useful for task-space control using differential IK, where the
85+
default low-stiffness gains track end-effector targets poorly.
86+
"""
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
2+
# All rights reserved.
3+
#
4+
# SPDX-License-Identifier: BSD-3-Clause
5+
import gymnasium as gym
6+
7+
##
8+
# Register Gym environments.
9+
##
10+
11+
##
12+
# Joint Position Control
13+
##
14+
15+
gym.register(
16+
id="Isaac-Stack-Cube-SO101-v0",
17+
entry_point="isaaclab.envs:ManagerBasedRLEnv",
18+
kwargs={
19+
"env_cfg_entry_point": f"{__name__}.stack_joint_pos_env_cfg:SO101CubeStackEnvCfg",
20+
},
21+
disable_env_checker=True,
22+
)
23+
24+
##
25+
# Inverse Kinematics - Absolute Pose Control
26+
##
27+
28+
gym.register(
29+
id="Isaac-Stack-Cube-SO101-IK-Abs-v0",
30+
entry_point="isaaclab.envs:ManagerBasedRLEnv",
31+
kwargs={
32+
"env_cfg_entry_point": f"{__name__}.stack_ik_abs_env_cfg:SO101CubeStackEnvCfg",
33+
},
34+
disable_env_checker=True,
35+
)

0 commit comments

Comments
 (0)