TelemetrySign in

Cornering G

Algorithm speed-1.0.0 (channel) and segments-1.0.0+segment-results-1.0.0 (sustained) · source engine/src/dtta/engine/speed/analysis.py, engine/src/dtta/engine/segments/results.py.

Definition

Cornering G is the kinematic lateral acceleration of the car's path: how hard the car is actually changing direction. It comes from GPS only.

alat,path=vanalysisψ˙,ψ=atan2(y˙,x˙)a_{lat,path} = v_{analysis}\,\dot\psi, \qquad \psi = \operatorname{atan2}(\dot y, \dot x)

  • x˙,y˙\dot x, \dot y: Savitzky–Golay first derivatives of the local east/north position (window sg_window_heading_s = 1.0 s, order sg_polyorder = 2).
  • ψ\psi: path heading, unwrapped, then zero-phase low-passed at speed_cutoff_hz (1 Hz). Positive counter-clockwise: left turns increase ψ\psi.
  • ψ˙\dot\psi: Savitzky–Golay derivative of ψ\psi (same window and order).
  • Masked (undefined) where vanalysis<v_{analysis} < heading_min_speed_ms (3 m/s).
  • Equivalent form v2κv^2\kappa with path curvature κ=ψ˙/v\kappa = \dot\psi / v.

Sign: positive in a left turn. Displayed in g: a/9.80665a / 9.80665.

Because it is built from speed and heading of the path, it contains no gravity, no banking and no body roll. That is what makes it the driver-facing lateral number: it answers "how hard did the car corner", independent of how the camera is mounted.

Sustained value (per segment)

Gsus=maxt1Wtt+Walat,pathdτ,W=sustained_window_s=1.0sG_{sus} = \max_t \frac{1}{W}\int_t^{t+W} |a_{lat,path}|\,d\tau, \qquad W = \texttt{sustained\_window\_s} = 1.0\,\mathrm{s}

Inside a segment the channel is resampled onto a uniform 20 ms time axis and the maximum sliding-window mean of a|a| is taken. A spike of amplitude SS and duration dd can move it by at most Sd/WS\,d/W; the Phase 8 spike test injected a 5 g sample into a real 1.5 g corner and measured a change below 0.01 g. The window was chosen from 0.5 / 0.75 / 1.0 / 1.5 s: lap-to-lap spread of the per-corner value is within noise for all candidates and 1.0 s is 8–16 % of a corner's duration, so it measures the loaded phase, not the whole corner. Mean and peak (filtered) values are also computed; the raw accelerometer peak is never called Cornering G.

Cross-validation

check result on the fixtures
Synthetic constant-speed circle, radius RR alat=v2/Ra_{lat} = v^2/R within 2 %
Net rotation per lap: rVdt\int r_V\,dt (gyro, vehicle frame) vs ψ˙dt\int \dot\psi\,dt (GPS) 0.957–1.033 vs 0.996–1.023 turns, i.e. ≤ 5 % on every stable lap
Bias between the gyro-derived lateral and Cornering G within ±0.03 g on stable laps
Two cameras in the same car, gyro lateral 0.084–0.097 g RMS agreement

The instantaneous comparison with the gyro was expected to agree to 0.15 g RMS in the plan, and it does not on dirt (0.47–0.74 g RMS): the body yaw rate leads the path heading rate while the car is rotated into the corner (slip-angle rate RMS 0.17–0.31 rad/s, identical on two cameras). That is physics, not error; the gyro channel is therefore shown to engineers as body-yaw lateral and never labelled Cornering G (Amendment A2 of the deployment plan).

Engineer channels on the same page

  • Body-yaw lateral (gyro): alat,gyro=vrV/cosλ^a_{lat,gyro} = v\,r_V/\cos\hat\lambda with rVr_V the yaw rate in the vehicle frame (bias removed on stationary data) and λ^\hat\lambda the low-passed lean estimate (lean_lowpass_hz 0.5 Hz).
  • Slip-rate diagnostic: rV/cosλ^ψ˙gpsr_V/\cos\hat\lambda - \dot\psi_{gps}, reported as an RMS per lap.

Limitations

  • Undefined below 3 m/s and in the first/last 0.5 s of a GPS run.
  • Heading from positions at 10–18 Hz limits the bandwidth to ~1 Hz; very short transients are smoothed.
  • Shares the GPS lag (0.15–0.40 s behind the IMU clock); the delta between two laps is unaffected.

Verified

docs/proofs/phase-06, docs/proofs/phase-08/REPORT.md; tests engine/tests/synthetic, engine/tests/unit/test_speed_filters.py, regression goldens cornering_g_sustained per corner ± 0.02 g.