[solved] sanity check on forward/reverse throttle

I’ve got a dual-motor boat that is almost up and running, but I’m stuck trying to get it to reverse, and I could use some help. I can grab full logs, but I wanted to first check if I even have the right mental model for what I’m trying to do.

The two motors are mounted side-by-side, spread a bit apart, so differential thrust works great for steering. I have the output channels set up as ThrottleLeft and ThrottleRight. I can steer and drive around forwards in manual mode without issues. At zero throttle, I can tank-steer just fine using the ‘rudder’ input. Of note, rudder control at 0 throttle works to spin a motor in reverse. This isn’t an issue of reversing ESC’s - that’s working fine.

I have a spring-return right stick on my controller, and I’d like to map the up/down of that stick to forward/reverse throttle. (I won’t use this in all modes, but I found it works super well for slow maneuvers while docking)

I’ve got my controller to output 1000 us at full “down” on the stick, and 2000 us at full “up”. What I’m getting right now is a throttle range from 0% to 100% forward. I’d like this to instead map from 100% reverse to 100% forward.

So my question:

Is this a setup that other people are doing? Using <1500us throttle axis to reverse a boat?

I think I need some kind of “Neutral throttle means 0%” setting, instead of “neutral throttle means 100%”, but I really thought that would be default already for tank steering. I have all my RC3_MIN, RC3_TRIM, etc. set to the defaults, and I’m definitely getting values of 1000-2000 in Ardupilot on the throttle channel.

Any obvious parameters I should learn about? Am I approaching this all wrong?

Notes:

In case it matters, FRAME_CLASS is set to ‘boat’.

I’ve also tried setting my receiver up to use a separate channel for “go in reverse”, and to use controller-side mapping to flip that ‘go-in-reverse channel’ when the throttle stick is below neutral. I couldn’t figure out how to set up a channel as a reverse-throttle switch though, and this seems like an ugly hack.

One quirk that might factor into this: I’m using the new ExpressLRS Mavlink-RC mode, which (as I understand it) shows up as MAVLink2 data for the RC input for Ardupilot. I don’t think that’s affecting things though, since I’m seeing the full range on RC3 coming into the system.

What ESC you are using? How is the ESC controlled?
What setting you used on mot-pwm-type?

The ESCs are some kind of rebranded something, sold with the thrusters I’m using:

Unfortunately, they only handle PWM, so MOT_PWM_TYPE = 0 (normal). I definitely wish they supported any of the protocols with feedback.

Ok, fine, the ESC is working with around 1000µsec full rev - 1500µsec stop - 2000µsec full fwd.
So, if this not happens than your FC settings are wrong.
Please provide your PARAMS file?
Did you run RC calibration on mission planner?

Good news and bad news. I somehow fixed it, but I can’t explain how.

I tried temporarily changing FRAME_CLASS, then PILOT_STEER_TYPE, and then finally changed RC3_MIN/TRIM/MAX from 1000/1500/2000 to 1500/1750/2000. That shook something loose, and 1500-1750 is would get me reverse throttle control. Changing back to 1000/1501/2000 got me the reverse throttle control I had wanted all along.

I can’t explain it. I swear RC3 was at 1000/1500/2000 previously. No changes to the controller-side mapping at all. Maybe I had the values for RC3_MIN and RC3_TRIM swapped and my eyes previously just saw what I expected?

If I had been smart l, I would have saved the parameters and I’d be able to know for sure.

FWIW, no automated tuning has been done aside from RC calibration in QGC. And I’ve only used QGC, not MissionPlanner.

Thank you for helping debug, even though this was on the ‘user did something dumb and fixed it on their own’ category.

To answer my own question: yes, it is common to use the lower half of the RC throttle input range to control reverse on rovers. But some small parameter change can drastically alter behavior.

For anyone else stuck and reading this: try a full parameter reset, but save a copy of your parameters for comparison later!