Central engineering reference and operations manual for the MRDT Autonomy Software.
View the Project on GitHub MissouriMRDT/Autonomy_Software
Return to RoveSoDocs Guides for Today, Tomorrow, and Forever.
The Control and Actuation subsystem translates spatial navigation targets and steering setpoints into physical motor commands, accounting for skid-steer kinematics, ground friction, and chassis pitch/roll limits.
The control pipeline translates target headings and velocities into dual-track motor commands:
[Path / Steering Setpoint]
|
v
[Lateral Controller Selection]
- PIDController (Heading tracking)
- PredictiveStanleyController (Cross-track & heading tracking with Unicycle prediction)
- PurePursuitController (Lookahead circle-arc pursuit)
|
v
[Inverse Kinematics] (DifferentialDrive.hpp)
- Deadband Filtering (0.02 threshold, rescaled to full dynamic range)
- Arcade Drive or Curvature Drive Models
- Input Squaring (DRIVE_SQUARE_CONTROL_INPUTS)
|
v
[Safety & Terrain Multipliers] (DriveBoard.cpp)
- Inclinometer Slope Damping (Pitch & Roll weighting)
- Master Throttle Scaling (SETMAXSPEED callback)
- Maximum Safe Power Clamp (DRIVE_MAX_SAFE_POWER)
|
v
[Network Actuation]
- RoveComm UDP Packet (DRIVELEFTRIGHT) -> Core Board Microcontroller
The autonomy software includes three lateral controllers:
PIDController.cpp)Used for orienting the rover toward single waypoints, search legs, or during visual servoing:
PredictiveStanleyController.cpp)Used for following continuous, multi-waypoint paths generated by GeoPlanner:
UnicycleModel.hpp) projecting the rover state $N$ timesteps into the future to compensate for chassis mass and actuation lag.PurePursuitController.cpp)Alternative geometric path follower:
DifferentialDrive.hpp)Because the rover uses skid-steer (tank-style) drive rather than Ackermann steering, turning requires independent velocity control of the left and right wheel sets.
Inputs with absolute magnitude $< 0.02$ are zeroed. Values above the deadband are rescaled so the remaining interval maps smoothly across $[0.0, 1.0]$, preventing sudden motor jump at low throttle.
Maps forward speed $v$ and rotation rate $\omega$: \(\text{Left Power} = v + \omega\) \(\text{Right Power} = v - \omega\) Powers are normalized if either exceeds $\pm 1.0$: \(\text{Power}_{\text{max}} = \max(|\text{Left}|, |\text{Right}|, 1.0)\) \(\text{Left} = \frac{\text{Left}}{\text{Power}_{\text{max}}}, \quad \text{Right} = \frac{\text{Right}}{\text{Power}_{\text{max}}}\)
Controls the radius of curvature rather than raw turning rate:
DRIVE_CURVATURE_KINEMATICS_ALLOW_TURN_WHILE_STOPPED is true.When DRIVE_SQUARE_CONTROL_INPUTS is enabled, input magnitudes are squared while preserving sign:
\(u_{\text{squared}} = \text{sgn}(u) \cdot u^2\)
This provides fine, granular steering control at low speeds while retaining full power at maximum deflection.
DriveBoard.cpp)Raw kinematic commands pass through multi-layered safety conditioning before transmission:
The DriveBoard subscribes to telemetry from the rover’s onboard inclinometer:
constants::DRIVE_BOARD_MIN_DAMP (e.g., $0.50$).A RoveComm UDP callback listens for SETMAXSPEED packets from the Basestation GUI, allowing operators to scale rover velocity across $[0.0, 1.0]$ in real time.
All final track outputs are clamped to constants::DRIVE_MAX_SAFE_POWER (e.g., $0.90$) to prevent motor stall overcurrent and fuse trips.
NavigationBoard.manifest::Core::COMMANDS["DRIVELEFTRIGHT"]: RoveComm UDP packet containing two 32-bit floats $[P_{\text{left}}, P_{\text{right}}] \in [-1.0, 1.0]$.