ArticulationAction completely ignoring desired velocities

Isaac Sim Version

5.0.0

Operating System

Ubuntu 24.04

GPU Information

  • Model: GeForce RTX 3090
  • Driver Version: 575.64.03

Topic Description

Detailed Description

Velocities are not being honored at all by ArticulationAction(). Instead, my quadruped seemingly consistently defaults to the maximum velocity as set in my urdf of 9.52rad/s, even when I assign the velocities to all be 0 rad/s

Steps to Reproduce

Code:

########## ISAAC SIM AI AGENT JOINT CONTROL ##########

def apply_joint_angles_isaac(current_servo_config, target_angles, mid_angles, movement_rates):
    """
    Apply joint angles directly for Isaac Sim AI agent training.
    This function moves all joints to their target angles in a single ArticulationAction.
    
    Args:
        current_servo_config: Current servo configuration with CURRENT_ANGLE values
        target_angles: Target joint angles for each leg (similar to SERVO_CONFIG structure)
        mid_angles: Mid joint angles for each leg (similar to SERVO_CONFIG structure)
        movement_rates: Movement rate parameters for each leg
    """
    try:
        joint_count = len(config.ISAAC_ROBOT.dof_names)
        joint_positions = numpy.zeros(joint_count)
        joint_velocities = numpy.zeros(joint_count)
        
        # Define joint order (same as working functions)
        joint_order = [
            ('FL', 'hip'), ('FL', 'upper'), ('FL', 'lower'),
            ('FR', 'hip'), ('FR', 'upper'), ('FR', 'lower'),
            ('BL', 'hip'), ('BL', 'upper'), ('BL', 'lower'),
            ('BR', 'hip'), ('BR', 'upper'), ('BR', 'lower')
        ]
        
        # STEP 1: Move to mid angles first
        logging.info("(fundamental_movement.py): === MOVING TO MID ANGLES ===")
        for leg_id, joint_name in joint_order:
            joint_full_name = f"{leg_id}_{joint_name}"
            joint_index = config.JOINT_INDEX_MAP.get(joint_full_name)
            
            if joint_index is not None:
                # Get mid angle from the AI agent's output
                mid_angle = mid_angles[leg_id][joint_name]
                
                # FORCE VELOCITY TO 0 TO PROVE ISAAC SIM IGNORES VELOCITY TARGETS
                velocity = 0.0  # Force to 0 to demonstrate velocity targets are ignored
                
                joint_positions[joint_index] = mid_angle
                joint_velocities[joint_index] = velocity
                
                # Update the current angle in config
                config.SERVO_CONFIG[leg_id][joint_name]['CURRENT_ANGLE'] = mid_angle
                
                # DETAILED LOGGING FOR FORUM POST
                logging.info(f"(fundamental_movement.py): {joint_full_name}: MID angle={math.degrees(mid_angle):.1f}° ({mid_angle:.4f} rad), velocity={velocity:.4f} rad/s")
            else:
                logging.error(f"(fundamental_movement.py): Joint {joint_full_name} not found in JOINT_INDEX_MAP\n")
        
        # Apply mid angle positions
        mid_action = ArticulationAction(
            joint_positions=joint_positions,
            joint_velocities=joint_velocities
        )
        
        logging.info(f"(fundamental_movement.py): Applying mid angles with velocities forced to 0.0")
        ARTICULATION_CONTROLLER.apply_action(mid_action)

        time.sleep(0.1)

# NOTE: I omitted moving to target angles as its logically identical to the above
        
    except Exception as e:
        logging.error(f"(fundamental_movement.py): Failed to apply AI agent joint angles for Isaac Sim: {e}\n")

Error Messages

No errors, but my log displays pitifully slow velocity radians and yet the legs clearly move at 9.52 rad/s, the URDF limit:

… more log …
(fundamental_movement.py): === MOVING TO MID ANGLES ===
(fundamental_movement.py): FL_hip: MID angle=11.6° (0.2018 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FL_upper: MID angle=25.7° (0.4490 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FL_lower: MID angle=25.1° (0.4377 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FR_hip: MID angle=6.3° (0.1102 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FR_upper: MID angle=1.2° (0.0207 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FR_lower: MID angle=13.5° (0.2349 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BL_hip: MID angle=2.2° (0.0379 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BL_upper: MID angle=-10.2° (-0.1774 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BL_lower: MID angle=35.1° (0.6131 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BR_hip: MID angle=7.4° (0.1288 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BR_upper: MID angle=-32.4° (-0.5661 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BR_lower: MID angle=4.3° (0.0743 rad), velocity=0.0000 rad/s
(fundamental_movement.py): Applying mid angles with velocities forced to 0.0
(fundamental_movement.py): === MOVING TO TARGET ANGLES ===
(fundamental_movement.py): FL_hip: TARGET angle=-6.3° (-0.1102 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FL_upper: TARGET angle=7.8° (0.1363 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FL_lower: TARGET angle=-30.5° (-0.5328 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FR_hip: TARGET angle=14.4° (0.2512 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FR_upper: TARGET angle=-31.4° (-0.5484 rad), velocity=0.0000 rad/s
(fundamental_movement.py): FR_lower: TARGET angle=-14.9° (-0.2600 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BL_hip: TARGET angle=-10.4° (-0.1813 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BL_upper: TARGET angle=34.5° (0.6013 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BL_lower: TARGET angle=-12.3° (-0.2143 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BR_hip: TARGET angle=7.3° (0.1276 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BR_upper: TARGET angle=-20.5° (-0.3576 rad), velocity=0.0000 rad/s
(fundamental_movement.py): BR_lower: TARGET angle=-27.5° (-0.4793 rad), velocity=0.0000 rad/s
(fundamental_movement.py): Applying target angles with velocities forced to 0.0
(fundamental_movement.py): Applied AI agent joint angles for Isaac Sim (mid → target) - VELOCITIES FORCED TO 0.0 TO DEMONSTRATE ISAAC SIM IGNORES VELOCITY TARGETS
… more log …

Screenshots or Videos

Additional Information

What I’ve Tried

  1. set_joint_drive_properties() - Failed: Robot still moved at max speed

  2. Physics timestep adjustment - Increased to 1000 Hz (physics_dt=0.001) - Failed: No effect on velocity control

  3. Enhanced physics solver settings - solver_iteration_count=8, solver_type=“TGS” - Failed: No effect on velocity control

  4. Zero velocity test - Set all velocities to 0.0 - Failed: Robot still moved, proving ArticulationAction() velocities completely ignored

Related Issues

I understand that this has been an issue in the past and was fixed, so I know that it’s 99.9% my fault… Am I missing something here? Any help regarding controlling both position and velocity at the same time from Isaac Sim Veterans would be extremely appreciated

Hi @matthewthomasbeck, thank you for posting your question. Can you check on the joint controller parameters on the robot? Make sure that the damping on the Drive API in the joint properties is not zero or close to zero, otherwise the controller will not track commanded joint velocities.

Hi, thanks for replying

I have messed around with different damping ratios and natural frequencies (I have 45kg servos at the axle and the legs are made out of 15% infill PLA, the legs are in the real world very snappy, they have nearly crushed my hands in the past)

I have tried damping ratios of 0.4-0.7, and these have not worked unfortunately. I am training with PPO and my agent has the option to choose velocities from 0 - 9.52 (the max in radians), and it is unable to do anything to control the velocities