Anybody linearized the motor power yet?

One of the most straight-forward ways to do this is to square or cube the value. You just need to be careful about the type of value you’re storing. If you can’t store too large a value and you start cubing values around 100, you can hit the limit. Meanwhile, if you adjust early and use something that only stores integers, you can lose gradation. The basic idea is as follows:

Using rational numbers (like float):

  1. Store the axis value.
  2. Divide by the maximum value to give you a value between -1 and +1.
  3. Square or cube that, still giving between -1 and +1. (If you square, you need to put the sign back on it.)
  4. Multiply by the maximum value.
  5. Assign the new value to the motor.

Using integers (like int), assuming they may not store values around 1,000,000:

  1. Store the axis value.
  2. Square that.
  3. Divide by the maximum axis value.
  4. Multiply again (cubing it).
  5. Divide by the maximum (if you want cubed) or divide by the absolute value of the stored axis value (if you want squared).
  6. Assign the new value to the motor.

It’s not really so many steps in programming since you can lump all that math together in the same line where you assign the value to the motor. But you might to the calculations separately, in the same place where you set a dead band. Even in such a case, though, you’re only looking at the same or nearly the same number of lines of code as setting the dead band in the first place.