FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
0034 — Auv yaw and pitch rate damping are independent of the forward speed
ID 0034
Class KNOWN-LIMITATION
Severity 2
Status ready
Models Auv/Vehicle
Found 2026-09-22

Evidence

src/auv/Auv.cpp, Auv::CrossFlowStripWrench:

const double crossFlowY = relVel_d[1] + omega_d[2] * sectionX[k];
const double crossFlowZ = relVel_d[2] - omega_d[1] * sectionX[k];
const double crossFlowSpeed =
std::sqrt(crossFlowY * crossFlowY + crossFlowZ * crossFlowZ + kCrossFlowSpeedEpsilon);

relVel_d[0], the axial relative velocity, appears nowhere in the section velocity, the section force or the section moment. Cross-flow drag is by definition independent of the axial flow, and the strip loop is the only source of yaw and pitch damping in the class. The yaw moment in pure yaw is therefore

M_z = -K r |r|, K = sum_k 0.5 rho Cd_cf D_k L_k x_k^2 |x_k|,

with no u in it at all. tests/Auv_Test.cpp, Auv_YawRateDampingDoesNotDependOnTheForwardSpeed and Auv_YawRateImpulseDecaysAtTheSameRateWhateverTheForwardSpeed, assert exactly that: the same yaw history at 0 m/s and at 1.5 m/s, matching the closed form above to 1e-4 rad.

The same argument makes a uniform hull produce no yaw or pitch moment in steady sideslip, because the sections are symmetric about the origin and so sum_k x_k c_k = 0.

Narrowed after increment E. The fins added in Auv::RudderWrench do carry u, through their dynamic pressure, so the vehicle's rate damping is now partly speed coupled while the hull's is not. The two simulation cases named above therefore run on fixtures with RudderArea = 0, which is what keeps them testing the hull term this issue is about. The gap that remains is the hull's own lift-derived N_r(u) and M_q(u); a fin is a small fraction of a slender body's lifting area, so the fins do not close it.

Effect

Two things a reader is likely to expect are absent, and both are consequences of the one modelling choice:

  • The hull's rate damping does not grow with speed. A real slender body has a lift-derived N_r(u) that is roughly linear in the forward speed and dominates the quadratic cross-flow term at cruise, so this model under-damps a turn at 1.5 m/s and over-damps a slow pirouette relative to reality.
  • The bare hull has no destabilising sideslip moment. That moment is the Munk moment, MunkMomentFactor, which is a separate term and defaults to zero (plan risk 4). The hull is therefore over-stable in yaw rather than directionally unstable.

The practical consequence for the survey scenario is a turn rate that settles slightly slower than a real REMUS-class vehicle would, absorbed by the heading PID once the closed loop lands. Nothing in the model is inconsistent; the limitation is one of coverage.

Possible fix

Add the lifting terms rather than smuggling u into the cross-flow speed. The standard form is a linear damping pair alongside the cross-flow term,

N += N_r_linear * u * r, M += M_q_linear * u * q,

with the two coefficients from slender-body theory or a fit, and the Munk moment enabled in the same change so that the destabilising and stabilising lift terms arrive together. Introducing either half alone moves the open-loop stability in a direction that is hard to defend.

Putting the axial component into w_k would be wrong: it makes cross-flow drag grow with forward speed even in pure surge, which double-counts the axial drag.

Test that would prove it

Auv_YawRateDampingDoesNotDependOnTheForwardSpeed is the test that pins the present behaviour, and a fix must replace it rather than merely extend it. The fix wants: yaw decay at 1.5 m/s measurably faster than at rest, both still matching a closed form; the cross-flow term alone still reproducing the present numbers when the lift coefficients are zero; and a sideslip case where the Munk moment and the lift moment are checked separately before being enabled together.

Risk

Enabling either the lift damping or the Munk moment changes every open-loop Auv trajectory and every closed-loop settling time. Plan risk 4 already schedules the Munk moment as an explicit experiment after the closed loop lands, which is the right point to take this one too.