Two steering schemes are mostly popular when it comes to ground vehicles: Differential, or skid steering, and Ackermann steering. Differential steering vehicles, despite their fancy name, look just like the typical two-wheel robot chassis found pretty much everywhere:

Differential steering vehicles, as the name suggests, use differential thrust to turn. Most are made of two wheels on a single axle providing differential thrust to the vehicle, and a third freely rotating caster wheel for balance. Tracked vehicles steer the same way, but without the need for a caster wheel. The steering principle is shown below:

Ackermann steering, on the other hand, is the steering method used in just about every automobile. The vehicle steers by varying the angle of their front wheels. In Ackermann steering, the normal vectors of the rotation center of each wheel converge to a single point.

This is a very effective steering method because it ensures that no wheel is skidding at any time, whether the vehicle is moving straight or steering. This is not possible with differential steering setups with wheels on more than a single axis. Here’s a diagram showing the Ackermann steering principle:

Differential vehicles can emulate Ackermann steering behavior of vehicles of any geometry. Let us suppose that we have a differential steering vehicle with two coaxial wheels and a hypothetical Ackermann steering vehicle of known dimensions and geometry. The following equations describe the velocity of each wheel of the differential vehicle:

)

where *V* is the vehicle’s forward velocity, *R* is the steering radius and *d* is any lateral distance from the desired thrust centerline, i.e. the centerline of the emulated Ackermann vehicle. If the desired centerline is at the midpoint of each driving wheel and the differential steering vehicle width is *W*, then and . If the centerline is asymmetrical, an offset can be added to d, which gives us the following equations:

and

*R* is a variable dependent on the steering angle of the Ackermann steering vehicle as follows:

where *L* is the distance between front and rear axle, and *θ* the steering angle of the hypothetical Ackermann car. Note that θ corresponds to the hypothetical steering angle at the centerline of the Ackermann car. This is also where R is measured from. *θ* is output by the pilot model. With these equations at hand, it is easy to write an algorithm to drive the differential drive wheels. In python, the algorithm would look like this:

1 2 3 4 5 6 7 8 9 10 11 12 |
def calc_diff_thrust(l_a, w_d, w_o) ''' Calculate motor thrust for a differential steering vehicle. ''' angle_radians = math.radians(angle) steer_tan = math.tan(angle_radians) r = l_a / steer_tan l_throttle = throttle * (1.0 - (w_d * 0.5 - w_o)/r ) * \ config.differential_car.left_mult r_throttle = throttle * (1.0 + (w_d * 0.5 + w_o)/r ) * \ config.differential_car.right_mult return l_throttle, r_throttle |

The differential steering algorithm mentioned above has made it into the latest version of Burro. Using Burro, you can emulate an Ackermann steering vehicle faithfully using a differential steering rover. All you need to do is input the dimensions of your vehicle, and the Burro differential mixer takes care of proper driving of the motors. Note that most geometry settings in Burro only affect differential steering vehicles; the behavior of real Ackermann steering cars is defined by the actual configuration of their parts. The only required option in this case (which Burro includes) is the maximum steering angle.