Starting point

Remora is a 1.1 m catamaran with two fixed thrusters — no rudder, pure differential thrust. ArduPilot Rover supports this out of the box (FRAME_CLASS=2, boat), but the default parameters are tuned for a wheeled rover on dirt, not 9 kg of foam on chop.

First autonomous mission: a clean square in the plan, a drunken sine wave on the water.

Order of operations

Tuning ArduRover has a strict dependency chain. Doing it out of order wastes days:

  1. Speed & throttle (ATC_SPEED_*, CRUISE_THROTTLE)
  2. Turn rate controller (ATC_STR_RAT_*)
  3. Navigation (NAVL1_PERIOD, WP_RADIUS)

Speed controller

Set CRUISE_SPEED and CRUISE_THROTTLE from a manual run at your intended survey speed (ours: 1.4 m/s at 55%). Then tune the speed PID watching desired vs achieved in the logs. Water adds huge damping, so we ended up at roughly half the default P and double the I of the land defaults — the boat accelerates slowly and the integrator has to do the long-haul work against drag.

Turn rate: where boats differ

The steering rate controller is where differential-thrust boats punish you. Key numbers for Remora:

  • ATC_STR_RAT_FF — do FF first. Command fixed turn rates in Acro, plot commanded vs achieved, set FF to close ~90% of the gap.
  • ATC_STR_RAT_P — small. Ours: 0.08. High P + wave yaw disturbance = thruster oscillation and hot ESCs.
  • ATC_STR_RAT_D — nearly zero on water. Wave noise makes D a liability.

L1 navigation

NAVL1_PERIOD controls how aggressively the boat chases the line. Default 20 was hopeless in crosswind — the boat crabbed a lazy arc downwind of every leg. We stepped down: 17, 14, then 12, where line capture is crisp without S-turning. Below 10 it oscillated.

WP_RADIUS at 2 m gives clean corners at survey speed. For lawnmower bathymetry patterns we also set WP_OVERSHOOT=0.5 to keep cross-track error honest on the long legs.

Wind, the invisible parameter

Everything above was tuned in <8 kn wind. At 15 kn:

  • Upwind legs run ~0.3 m/s slow — the speed integrator handles it.
  • The bow blows off during slow waypoint turns. Mitigation: ATC_STR_ANG_P up from 2.0 to 2.6, and never plan turns slower than 0.8 m/s.

Resulting performance

Cross-track error over a 2 km lawnmower pattern, sea state 2: mean 0.4 m, max 1.1 m. Good enough that the sonar swaths overlap cleanly, which is the entire point.

Full parameter file is in the repo alongside the dataflash logs from every tuning session.