Hello VRC Teams of the world!
Exponential joystick curves, or simply “Expo Drive” is a method to enable fine control of a drivetrain while maintaining top speed. The concept has been around for years now, but has not changed much. That is, until now. I present to you LemLib’s implementation of Expo Drive.
This implementation works the same as typical Expo Drive in concept, a constant is raised to the power of x, where x is a scaled joystick input. However, I’ve made 2 enhancements: joystick deadband and drivetrain deadband.
Joystick Deadband:
Joysticks aren’t perfect. You let go of them, and they won’t return back to 0. Instead, they will usually hover around 5% input. This means that your drivetrain might start moving even if you aren’t touching the joysticks.
A simple solution to this problem is to just set the output to 0 when the joystick input is within a certain range. The drive curve will then look something like this:
But this is not optimal. As you can see, you can’t make small inputs with this method. How do we fix that? Well, we scale
x by a calculated value so it intersects the maximum input/output and the edge of the deadzone, as shown by this graph:With this, you still have the full range of motion of your drivetrain despite having a controller deadband
Drivetrain Deadband:
Like joysticks, your drivetrain is not perfect either. It won’t start moving until you give it enough power, 10% for example. Thats 10% of your joystick you are not using. To fix this, we need to adjust the graph so it looks like this:
You may have noticed this looks a lot like the first graph, and you’d be right. The difference now is that we have fine control over the properties of this graph. The minimum output is now the minimum power the drivetrain needs to move.
Expo Drive:
I’ve only posted images of linear graphs for clarity. Now, lets see what a exponential function looks like with the methods above:
Much nicer! And, we can control how “curved” the graph is to suit our preferences. I’ve created an interactive graph which demonstrates this method:


