Isaac Sim Version
5.1.0
Operating System
Ubuntu 22.04
GPU Information
- Model: RTX 5060
- Driver Version: 580.95.05
Topic Description
I want to simulate a bicycle, so I imported four mechanisms and set up three joints, then contained them within a master xform. I added an Articulation Root to this xform named ebike and created some nodes within the Action Graph to receive my ROS2 control data. I then passed this data into the Articulation Controller to control the bicycle within the simulation.
Detailed Description
I created rigid bodies and colliders for all four links (named ebike_rearwheel, ebike_frame, ebike_handlebar, ebike_frontwheel), with the front and rear wheel colliders set to SDF approximation. I configured Body0 and Body1 for three joints (named frame_handlebar_joint, frame_rearwheel_joint, handlebar_frontwheel_joint). For the rear wheel joint (frame_rearwheel_joint), I set Drive with Type as acceleration, damping at 10000, and Target Velocity at -150. Detailed settings are shown below. I created an Articulation Controller and entered the name of the controlled joint (frame_handlebar_joint) in the jointNames field. After everything was ready, I started my ROS2 node and began simulation, feeding data into the Effort Command, which successfully drove the front handlebar joint (frame_handlebar_joint). However, as I continued development by adding materials to each link and the ground, incorporating the rear wheel joint (frame_rearwheel_joint) into my control scope, and adding Drive and Joint State for the controlled joints… I discovered I could no longer drive the joint using the Effort Command! Yet, when I input the data into the Velocity Command, the vehicle moved successfully. What exactly is going on here?
Steps to Reproduce
- Import 4 STL files (ebike_rearwheel, ebike_frame, ebike_handlebar, ebike_frontwheel)
- Create empty xform objects on each link as articulation points, adjusting their positions to align with component connection locations
- Create three joints, set Local Position to the empty xform locations, and define correct joint orientations
- Create a master xform named ebike containing all links and joints. Add Articulation Root to it, then add simulation environment conditions like lighting, ground, and PhysicsScene. Add mass and rotational inertia properties to each link
- Add ROS subscribers and publishers to the Action Graph, then add and configure the Articulation Controller, connecting them correctly. Successfully drive the vehicle using torque control
- Continue development: Add materials to components and the ground, set material friction coefficients. Add new joint names to the Articulation Controller and link new control input modules.
- Issue encountered: When data is input to the Articulation Controller’s Effort Command, the vehicle remains stationary; however, when data is input to the Velocity Command, the vehicle drives successfully. This confirms the data connections are correct, indicating an issue in the calculation of torque-driven effects.
Screenshots or Videos
Figure 1 : Ation Graph of Successful Torque Drive Cases
Figure 2 : Action Graph for a Torque Drive Failure Case
Additional Information
What I’ve Tried
- Removed the drive item from the joint, but the drive still fails.
- Changing the joint drive type to acceleration still results in drive failure.
- Changing the friction coefficient and elastic modulus of components and floor materials will not result in any changes.
- Input control data into Articulation Controller’s Velocity Command, drive successful; Input data into Position Command, drive failed.
- Changing the damping and stiffness values in the drive has no effect.
Here is more information :
Figure 3 : Settings for Successful Torque Drive Applications
Figure 4: Settings for a torque drive failure case
file 1 : All information is contained within this ZIP file, which includes two USD files detailing both my successful and unsuccessful cases as mentioned above.
usdfile.zip (25.0 KB)
Now I’ve pinpointed the issue—when I increased the torque input to 3000, it finally moved. But a new problem has emerged: when I want to use angle control, sending an angle command doesn’t execute. This whole situation has me utterly confused! It seems I have no understanding of how to use Isaac Sim or concepts like articulation. Should I abandon the graphical interface and switch to Python scripting for my simulation? Are there any courses on learning the Isaac Python API, or detailed materials explaining articulation and joint motion principles?
Thank you for posting this. The issue you’re experiencing is a common point of confusion when working with articulations and the Articulation Controller. Here are a few notes to consider.
Diagnosing Your Articulation Controller Behavior
- Effort (Torque) Command Not Moving the Joint
When controlling a joint via “effort” (i.e., torque), the input value must be sufficient to overcome all opposing physical parameters in the simulation—this includes mass, inertia, gravity, and friction. In Isaac Sim, if the damping, friction, or mass/inertia values for your links or joints are too high, then most low torch values will simply not cause movement, as you saw. Velocity and position drives, by contrast, are more abstracted: they apply internal logic to reach your velocity/position target, sometimes overriding physical limitations if configured as such.
- Joint Drive Settings Interfering
The Drive settings within the joint (found in the USD structure or via the Property panel) interact directly with the effectiveness of the Articulation Controller. For torque control (Effort Command), setting a Drive with “acceleration” or “velocity” type, high damping, or high stiffness can prevent expected behavior. In many physics engines, activating both drives and external torque commands can cause conflicts or override each other, depending on hierarchy and simulation tick order.
- High Input Torque Becomes Successful
When you needed to raise the torque to an unusually high value (e.g., 3000) for movement, it’s a sign that either:
- The mass or inertia is very large.
- The damping or friction is excessive.
- The default scale between SI units and your geometry is off (e.g., STL scale/units).
Double-check your rigid body and collider settings, including the units and mass. Many STL imports are in millimeters—Isaac Sim expects meters by default.
- Position Command Not Executing
Position commands via the Articulation Controller require that the joint’s drive is set up for “position” control, typically with reasonable stiffness and/or damping. If Drive type or controller parameters are not matched to intended control mode, position commands are either ignored or have no effect. Also, ensure that only one controller mode (torque, position, or velocity) is active per update cycle.
Best Practices for Isaac Sim Articulations
- For Torque Control (Effort Command):
- Remove the “Drive” component or set it to pass-through for only those joints you control by torque.
- Keep damping and friction as low as physically reasonable on the joint to allow expected motion.
- Ensure mass and inertia values are physically plausible for your bike model, and collider mesh is close to geometry.
- Check STL import scaling—convert all to meters and ensure transforms are correct.
- Use ROS2 feedback to observe actual torque/force and adjust if needed.
- For Position/Velocity Control:
- Ensure the Drive is present, with correct Drive Type set to “position” or “velocity” as needed.
- Set appropriate stiffness and damping values. Too high will clamp, too low can cause oscillations.
- Don’t mix control modes (i.e., send both torque and position commands to the same joint in the same step).
Step-by-Step Debug Flow
- Verify mass, inertia, and friction parameters on all links and joints; ensure they’re realistic.
- Re-import or adjust STL geometry to confirm units and alignment.
- When using torque (effort) mode, eliminate Drive components on the same joint, or ensure they do not conflict.
- Use Python scripting to send commands and observe feedback, and consider logging physics state each tick for verification.
- Refer to and experiment with official Isaac Sim “articulation_control” and “ros2/ros2_control_articulation” example scripts for robust sample code.
1 Like
Thank you so much for your help! After seeing your response, I spent a week exporting my model to URDF format and successfully imported it into Isaac Sim. However, I’m now facing an issue: when I set upper and lower limits for the steering wheel joints, the wheel automatically rotates to an unintended position at the start of the simulation. This behavior doesn’t occur if I leave the limits unset. This never happened before I modified the model. What could be causing this? I’d really appreciate your help.
Hi, I think the new issue when you setting the limits comes from the lower limits you’re setting. Changing it to something less than 0 you should not see the issue.