Repository navigation
UR10e Differential IK behaves incorrectly while UR10 works in Isaac Lab 2.3.2 #8299
|
Hi everyone, I'm trying to control a UR10e in Isaac Lab 2.3.2 using the I'm using the standard Isaac Lab I launch the example script with: ./isaaclab.sh -p scripts/tutorials/05_controllers/run_diff_ik.py --robot ur10 --num_envs 10and UR10 behaves correctly. To test the UR10e using exactly the same example, I first added UR10e_CFG to the imported robot configurations: from isaaclab_assets import FRANKA_PANDA_HIGH_PD_CFG, UR10_CFG, UR10e_CFGThen I added ur10e as a supported robot in the scene configuration: elif args_cli.robot == "ur10e":
robot = UR10e_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")Finally, for the robot-specific elif args_cli.robot == "ur10e":
robot_entity_cfg = SceneEntityCfg(
"robot",
joint_names=["shoulder_.*", "elbow_.*", "wrist_.*"],
body_names=["wrist_3_link"],
)I can then launch the same tutorial with: ./isaaclab.sh -p scripts/tutorials/05_controllers/run_diff_ik.py --robot ur10e --num_envs 10The UR10e loads correctly, but its behavior with Differential IK is very different from the UR10. The robot makes large/unexpected movements, can get into self-colliding configurations, and normally fails to reach the target pose. I'm attaching two videos—one for each robot—so you can see the differences in their behavior. Screencast.From.2026-10-05.13-59-52.mp4Screencast.From.2026-10-05.14-00-46.mp4One thing that I find particularly confusing is the end-effector frame. For the standard UR10 example, the tutorial uses However, when I use SceneEntityCfg.resolve() with the official UR10e_CFG, Isaac Lab reports the following available articulation bodies: and
So although the robots have very similar kinematics, Isaac Lab is actually loading conceptually different USD assets for them. Besides, in joint_pos={
"shoulder_pan_joint": 3.141592653589793,
"shoulder_lift_joint": -1.5707963267948966,
"elbow_joint": 1.5707963267948966,
"wrist_1_joint": -1.5707963267948966,
"wrist_2_joint": -1.5707963267948966,
"wrist_3_joint": 0.0,
}The UR10e configuration also explicitly disables self-collisions: enabled_self_collisions=FalseHoewever, there is an interesting point: the official UR10e RL environments work. This makes me wonder whether the difference in the USD hierarchy, articulation bodies, or end-effector frame is relevant to the Differential IK behavior. In particular, I am not sure whether I would therefore appreciate clarification on what the intended end-effector frame for the official Most importantly, what would be the recommended way to make Differential IK work correctly with the official UR10e_CFG? Is there an existing example, configuration, or known fix for using I would like to keep using the standard |
Replies: 2 comments
|
I've made some progress by modifying universal_robots.py as follows: UR10e_CFG = ArticulationCfg(
spawn=sim_utils.UsdFileCfg(
usd_path=f"{ISAAC_NUCLEUS_DIR}/Robots/UniversalRobots/ur10e/ur10e.usd",
rigid_props=sim_utils.RigidBodyPropertiesCfg(
disable_gravity=False,
max_depenetration_velocity=5.0,
),
articulation_props=sim_utils.ArticulationRootPropertiesCfg(
enabled_self_collisions=False, solver_position_iteration_count=16, solver_velocity_iteration_count=1
),
activate_contact_sensors=False,
),
init_state=ArticulationCfg.InitialStateCfg(
joint_pos={
"shoulder_pan_joint": 0.0,
"shoulder_lift_joint": -1.712,
"elbow_joint": 1.712,
"wrist_1_joint": 0.0,
"wrist_2_joint": 0.0,
"wrist_3_joint": 0.0,
},
),
actuators={
# 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'
"shoulder": ImplicitActuatorCfg(
joint_names_expr=["shoulder_.*"],
stiffness=1320.0,
damping=72.6636085,
friction=0.0,
armature=0.0,
),
"elbow": ImplicitActuatorCfg(
joint_names_expr=["elbow_joint"],
stiffness=600.0,
damping=34.64101615,
friction=0.0,
armature=0.0,
),
"wrist": ImplicitActuatorCfg(
joint_names_expr=["wrist_.*"],
stiffness=216.0,
damping=29.39387691,
friction=0.0,
armature=0.0,
),
},
)However, during control, the effector appears to remain at a certain offset from the target: Screencast.From.2026-10-06.10-03-35.mp4Remember that the end-effector link is still set to |
|
I found the cause of the issue, so I wanted to document the solution and close this discussion. The problem was related to the structure of the UR10e USD asset. I created a flattened copy of the
After these changes, robot_entity_cfg = SceneEntityCfg(
"robot",
joint_names=[".*"],
body_names=["ee_link"],
)instead of using There was also a second issue with the initial joint configuration. The original joint_pos={
"shoulder_pan_joint": 0.0,
"shoulder_lift_joint": -1.712,
"elbow_joint": 1.712,
"wrist_1_joint": 0.0,
"wrist_2_joint": 0.0,
"wrist_3_joint": 0.0,
}With the modified USD and this initial configuration, the standard One additional observation: So, in my case, the original problem was caused by the USD/articulation structure, while the remaining small Z offset with gravity enabled is a consequence of using Thanks! |


I found the cause of the issue, so I wanted to document the solution and close this discussion.
The problem was related to the structure of the UR10e USD asset. I created a flattened copy of the
ur10e.usd(https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1/Isaac/Robots/UniversalRobots/ur10e/ur10e.usd) and reorganized its joints/links to match the structure used by the working UR10 asset. In particular:ee_jointunder wrist_3_link.ee_joint.ee_linkwas properly included as a rigid body in the articulation.A…