Differential Thrust

I inherited a boat project that was set up with three airplane motors (brushless motors, non-reversing airplane ESC).
I initially set this up with a Navio2 and ArduPlane with differential thrust (servo1 - left throttle, servo2 - throttle, servo3 - right throttle). This worked perfectly in Manual mode, but failed in Auto - no surprise as an airplane with no airspeed is in trouble, while a boat is not. I tried shutting off FailSafes, but there were too many checks (stall, etc) to get it working compared (or so I thought) to converting to ArduRover (3.4.1).
I have been trying to get skid-steer working, and while can get the center motor working (throttle, with trim set to low - 1000), the two outer motors seem to assume that they are set up for reversable ESCs and are not responding as expected.
Is there a way to convert skid-steer into differential thrust (via adjusting the trim or some other variable)?
Is there a way to set up mixing of two channels (throttle and rudder) to create differential thrust (as can be done on an RC transmitter)?
As a side issue, I am using an 8 channel transmitter (Spektrum), it configures correctly in plane and rover software, but the rover only shows 4 active output servos, even when I set 5-7 for a variable (rudder, elevator, etc). Am I missing something here?

1 Like

Hi Howard,

Setting it up as you have should basically work althogh we dont support non-reversing motors yet (its on the to-do list). In what way does it not respond as expected? I wonder if perhaps it might work better if the central motor is disabled.

If you have a log i can have a look.

Thanks for the help. Knowing that it is not officially there saves me the trouble of trying to find it.
I have it quasi-working at the moment.
Channel1 = LeftThrottle
Channel2 = Throttle
Channel3 = RightThrottle
PILOT_STEERING_TYPE = 2 (assuming 0, 1, 2, 3 options)
In the code it looks like the setup of left and right throttle turn on the skid steering
Pilot Steering = 0 (default) doesn’t seem to do anything
Pilot Steering = 1 had the left responding to when the aileron was moved from center to the left, and the right responded when the aileron was moved from center to the right.
Pilot Steering = 2 had both left and right responding to any aileron movement in the opposite directions (Differential Thrust!!)
The only problem is that the throttle only activates when moved beyond the mid-point. Not sure if the top is only half throttle, or full throttle (with the full range squeezed into half of the range). I thought that lowering the trim to the minimum would lower the neutral point (reverse/forward), but it doesn’t seem to. Raising the trim (to about 1500) just turns on the motor when the throttle is all the way down.
This a workable option for now, though will also go back and play with ArduPlane a bit more.
If there was a way to work with non-reversing ESC, it would be solved; but I can see where that would change a tremendous amount of assumptions about most rovers.
There is a lot of work in this software and a lot of challenges when the community comes up with so many variations. Thanks for the input.


The PILOT_STEER_TYPE parameter (wiki page is here) allows choosing how the input from the transmitter should be interpreted. Because your vehicle doesn’t go backwards you probably can just stick to 0.

“1” is for two-paddle-input. so this would be the option to pick if the transmitter had two vertically moving sticks and you wanted it so that pushing the left stick high would cause the vehicle to turn right, pushing the right stick high would cause the vehicle to turn left. pushing both forward would cause the vehicle to drive forward.

The throttle only activating when moved beyond the mid point is totally normal for Rovers/Boats because most can move forward and reverse. Moving the throttle to the top is interpreted as meaning full speed forward. Throttle to the bottom is full speed in reverse. A sprung throttle works best for rovers.

Some users get confused between input and output settings. RCx_ parameters are for input, SERVOx_ parameters are for outputs. I would have expected setting the RCx_TRIM to a low value would allow you to change when the vehicle starts to move forward.

We’ve got an item on the to-do list here to improve support for vehicles that can’t reverse. That might make it into Rover-3.5 but I’d better not make promises.

1 Like

It looks like non-reversing motors didn’t make it into 3.5. Any update on this issue? Any possibility of differential thrust, there are several people (including myself) who could use it.


No progress on supporting non-reversing motors I’m afraid. It may be possible to make it sort of work by setting the RCx_TRIM value to the RCx_MIN value (or make them very close).

1 Like

A motor that doesn’t go reverse is not supported at all? I need new motors then :sob:


As mentioned above, it may work somewhat. I have put ArduPilot on a car with an ESC that couldn’t go into reverse. It worked, it just tended not to slowdown well.

It’s normally more about the ESCs rather than the motor.

@webbhm, just re-reading your comment above, ArduPilot does support differential thrust (aka skid-steering). Perhaps I’m misunderstanding something though…

You may be able to ‘fake out’ the logic for a non-reversing motor. In another post with @mckay9, I believe he was suggesting to set the mid-point (neutral) of the servo to the same value as the low point. This effectively should make the motor work as if it was non-reversing (anything above the mid-point is considered ‘forward’).

Thanks for the reply. I will change the esc’s. It will be able to go reverse direction. Battery’s 12V so it means my motors must be 12V right? I didn’t use my multimeter on the motors as I’m not sure where to connect what

The esc that I am familiar with can take 12v (even 16), and handle what the motor needs. I am using 12v motorcycle batteries and things run fine.

1 Like