In our robot code, we make use of deadbands to account for the fact that our joysticks drift slightly.
In previous years, we just did a simple cutoff of our values:
// Constants final double deadband = 0.1; // Loop double rotation = oi.getTurn(); rotation = (Math.abs(rotation) > deadband)? 0.0 : rotation;
Although this worked, it raised the following problem that was mentioned by mimirgames. This causes a hard cut in the motor input. For example, with a deadband of
0.1: when the joystick reads
0.09 the output will be
0.0%, but with a reading of
0.11, the output will be
0.11%. While this does not seem too bad, it causes a loss of fine control from the driver’s input. They can only go
0.1%. Nothing in between.
For most inputs, small changes of small values matter much more than small changes of big values. For example, going 5 mph faster then intended is much more serious when parking a car than when one is driving on the freeway (source: mimirgames).
To achive this, we use this “fancy equation”. Essentially, we pass our input through a cubic scaling funciton:
w = precision //(0 <= w <= 1) d = deadband //(0 <= d <= 0.9) x = joystick_input //(-1 <= x <= 1) output = ((w * (x ^ 3) + (1.0 - w) * x) - (abs(x) / x) * (w * (d ^ 3) + (1.0 - w) * d)) / (1.0 - (w * (d ^ 3) + (1.0 - w) * d))
This visualization of our cubic scaling function can be interacted with via the two labled sliders. To view the full Desmos project, click here