Created
March 7, 2026 22:20
-
-
Save mrpollo/8cbcf15e6d3e73874ee5dc4367d7d6ca to your computer and use it in GitHub Desktop.
SIH Ackermann rover default tuning analysis: speed overshoot and hairpin stall
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # rover: SIH Ackermann default tuning causes 56% speed overshoot and hairpin stall | |
| ## Summary | |
| The SIH Ackermann rover airframe (`10045_sihsim_rover_ackermann`) ships with default parameters that produce poor control behavior in two areas: | |
| 1. **Speed overshoot (56%):** The feedforward term `RO_MAX_THR_SPEED=3.2` commands near-full throttle (94%) for a 3.0 m/s setpoint, but the SIH plant can only sustain ~2.6 m/s at full throttle (F_thrust=400*thr vs F_drag=50*v^2). The P and I gains (0.001) are effectively zero, so there's no closed-loop correction. | |
| 2. **Hairpin heading stall:** During sharp turns, `RO_SPEED_RED` slows the rover, which reduces kinematic yaw slew rate at low speed, which prevents the rover from turning fast enough, which keeps heading error high, which keeps speed reduced. The yaw accel/decel slew limiters make this worse by artificially capping the yaw rate command. | |
| ## Reproduction | |
| ```sh | |
| make px4_sitl_sih sihsim_rover_ackermann | |
| # Upload a mission with a 180-deg hairpin or a straight-line 3.0 m/s cruise | |
| ``` | |
| ## Data | |
| Automated parameter sweep (14 hairpin configs, 16 speed configs) with ULog analysis. Each config: fresh PX4 start, MAVSDK mission upload, ULog metrics extraction. | |
| ### Speed Control (straight-line mission, 3.0 m/s target) | |
| | Config | RO_MAX_THR_SPEED | RO_SPEED_P | RO_SPEED_I | Overshoot | RMSE | Achievable Speed | | |
| |---|---|---|---|---|---|---| | |
| | Default | 3.2 | 0.001 | 0.001 | 56.4% | 1.270 | 4.15 m/s* | | |
| | FF only | 6.0 | 0 | 0 | **4.0%** | 0.249 | 2.82 m/s | | |
| | FF+P | 5.0 | 0.2 | 0 | 11.5% | 0.220 | 3.11 m/s | | |
| | FF+P+I | 5.0 | 0.2 | 0.01 | **9.9%** | 0.179 | 2.97 m/s | | |
| | FF+P+I | 5.0 | 0.2 | 0.1 | 15.5% | **0.148** | 3.03 m/s | | |
| *Default "achievable" is inflated because overshoot peaks dominate the measurement window. | |
| The root cause is `throttle = speed_setpoint / RO_MAX_THR_SPEED`. At 3.0/3.2 = 0.94 throttle, the plant overshoots because the drag model limits max speed to ~2.6 m/s. Increasing `RO_MAX_THR_SPEED` to 5.0-6.0 fixes the FF scaling. | |
| ### Hairpin Heading (180-deg turn, 3m jog width) | |
| | Config | Change | Yaw RMSE | Max Error | Settling | Status | | |
| |---|---|---|---|---|---| | |
| | No slew limits | RO_YAW_ACCEL_LIM=0, DECEL=0 | **5.4** | **36.2** | **0.3s** | PASS | | |
| | No speed reduction | RO_SPEED_RED=0 | 5.9 | 41.6 | 0.3s | PASS | | |
| | Higher gains | RO_YAW_P=8, RATE_P=0.4 | 6.3 | 49.3 | 0.4s | MARGINAL | | |
| | Accel limit 600 | RO_YAW_ACCEL_LIM=600 | 6.6 | 50.4 | 0.4s | MARGINAL | | |
| | Combined best | all above | 6.3 | 48.6 | 0.3s | MARGINAL | | |
| Disabling slew rate limits alone is the single biggest improvement. | |
| ## Suggested Default Changes | |
| For the SIH airframe specifically (`10045_sihsim_rover_ackermann`): | |
| ``` | |
| param set-default RO_MAX_THR_SPEED 5.0 # was 3.2 (FF too aggressive for SIH plant) | |
| param set-default RO_SPEED_P 0.2 # was 0.001 (effectively zero) | |
| param set-default RO_SPEED_I 0.01 # was 0.001 (effectively zero) | |
| ``` | |
| ## Questions for Maintainer | |
| 1. Should the SIH plant model parameters (`SIH_KDV=50`, thrust=400*thr) be adjusted instead of / in addition to the controller defaults? The current plant has a max steady-state speed of ~2.6 m/s at full throttle, which is below the 3.0 m/s commonly used in missions. | |
| 2. The yaw slew rate limiters (`RO_YAW_ACCEL_LIM`, `RO_YAW_DECEL_LIM`) hurt hairpin performance on this plant. Are they tuned for real hardware and just not applicable to SIH, or is this a general concern? | |
| 3. Are the `RO_SPEED_P/I` defaults of 0.001 intentional (pure FF control), or were they placeholder values? | |
| ## Test Script | |
| Full test suite: `Tools/simulation/sih_rover_tuning.py` | |
| ```sh | |
| python3 Tools/simulation/sih_rover_tuning.py --track both --speed-factor 2 | |
| ``` | |
| Generates per-run ULog analysis plots and comparison bar charts in `sih_tuning_results/`. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment