Ackermann robot front tires only steer but don't drive

So I followed the first two ros2 tutorials along with some other resources and was able to get my ackermann robot to listen to twist messages and calculate steering angles using the AckermannSteering omnigraph node, then using two articulation controllers write rear velocity directly from the twist message, and steering position from the AckermannSteering. With angular position and velocity from the twist message I’m able to get the robot to steer and the rear tires to start spinning, however, the tires should have yaw movements based on commands and freely rotate in the pitch, which they don’t. Assume the roll pitch yaw is for the tire:


When I send drive commands, it’s as if the front tires have very high friction with the ground. I did follow the advice here and set 10000, 0 stiffness and damping for position commands respectively and 0, 10000 for velocity commands based on another example I saw which I can’t find right now.

I’m wondering if I need to add another joint that is not a drive joint between the steering link and the tire to allow for free movement of the tire. Or is there something I can do with the frictions?

P.S. the help link for the AckermannSteering omnigraph node is broken.


For better visibility, I am moving your topic to the Isaac Sim category.


So I created a new URDF where I added a steering hinge between the base_link and each front tire.

Now when I import both robots and setup an ActionGraph for each, the previous one still does the same, where it moves the rear tires and I can give steering to the front ones, but the front tires aren’t spinning along the movement axis. And the new robot starts moving a little forward, then completely stops. This series of movements for the new robot is completely independent of whatever commands I send to it.

For the new urdf:
I have setup stiffness and damping for each velocity/position joint according to this.
I added a PhysicsMaterial according to this and connected all 4 tires to it and played around with friction values and nothing changed the behaviour. It also looks like the new setup isn’t listening to the commands at all.

In regards to your actions graph are you using on tick / on playback or on startup?

Your first example sounds like you are getting a initial forward command and nothing after. So wondering if it’s constantly firing or only once?

I followed this tutorial, so I’m using On Playback Tick.

So I resolved the problem, and here’s a list of all the steps I took:

Added continuous joints between the steering hinges and the tires.

Using xacro robot.urdf.xacro > robot.urdf I made a urdf from the xacro file.

Similar to here I had virtual joints for the front and rear and made sure to delete those in the urdf file.

According to URDF Import: Turltebot:

  1. Added a scene (in my case the warehouse with forklifts)
  2. Opened the URDF importer extension Isaac Utils > Workflows > URDF Importer
    • Unchecked clear stage
    • Unchecked Fix Base Link (Since my robot is a mobile robot)
    • Changed Joint Drive to Velocity
    • Located the URDF file in Input File
    • I specified an Output Directory
  3. I fixed the masses for the meshes as they weren’t imported properly from the URDF
  4. Following the instruction here I added an Articulation Root to the base of the robot with all the joints connected to it by clicking on the USD, then clicking +Add in the Property Tab, and added Physics > Articulation Root.
  5. Then I changed the stiffness and damping of all joints, based on whether they are position or velocity controlled according to this.
  6. From the hinge_to_tire joints for the front wheels, I removed the Drive Property from the joints I wanted to move freely thanks to this post
  7. Followed all the steps mentioned here to build an ActionGraph. My robot was Ackermann drive so instead of using the Differential Controller I used the Ackermann Steering node and used two Articulation Controller nodes. One with position control for the steerings, and one with velocity control for the rear tires. For the Ackermann Steering I used the information from here to configure the omnigraph node to my robot’s setup.
  8. At the end, I wrote a joy2twist node so that I can drive the robot around the sim.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.