Chaîne de vitesse GNSS
La vitesse est l'entrée de référence de toute la mesure : chaque projection d'ordre en dérive. C'est aussi le sous-système le plus abouti du projet — et celui dont les constantes attendent leur validation terrain.
La chaîne en 5 étages
- Acquisition —
GPS_PROVIDERexclusivement (le fournisseur fusionné n'est qu'un secours « INFORMATION_ONLY » qui n'alimente jamais l'estimateur sans provenance GNSS). API 31+ : requête explicite haute précision, zéro intervalle, sans batching. Callbacks sur le threadnvh-gnss. - Qualification —
GnssSpeedSession.qualify()rejette avant tout calcul : vitesse non finie ou négative, fix simulé, fix en retard de livraison (> 2 s). - Estimation —
KalmanSpeedEstimator[vitesse, accélération], dt variable, R = max(σv, plancher)², bruit de jerk blanc, mise à jour en forme de Joseph. La σv du chipset pondère réellement chaque correction. - Validité — une estimation est
VALID(frais, σv ≤ 1,5 m/s),DEGRADED(σv inconnu ou entre 1,5 et 3 m/s) ouINVALID(pas de fix ou horizon de 2 s dépassé). INVALID ⇒kinematicSpeedMps()rendnull: le suivi d'ordres est suspendu, jamais prolongé sur un chiffre figé. - Appariement temporel — la vitesse est évaluée à l'instant BOOTTIME du centre du buffer audio (ancré sur l'horloge matérielle d'AudioRecord) : un DSP en retard ne peut pas apparier un spectre avec une vitesse plus récente que le son.
Qualification des fixes (GPS-12/13)
- Vitesse non finie ou négative → rejet typé
NON_FINITE_SPEED/NEGATIVE_SPEED. - Fix simulé (mock) → rejeté par défaut ; autorisable uniquement pour les builds de test (
acceptMockFixes). - Fix « du passé » (latence de livraison > 2 s) →
STALE_FIX. - La σv n'est jamais remplacée par la précision horizontale : une précision position n'est pas une précision de vitesse (le voyant pré-API 26 l'utilise pour l'affichage uniquement).
Kalman [vitesse, accélération] (GPS-2)
- État [v, a], dt variable, modèle à jerk blanc (Q(dt)), plancher de R pour les σv aberrantes.
- Porte NIS (χ²(1) = 9) : un fix incohérent est rejeté sans détruire l'état ; ré-acquisition exige deux fixes mutuellement cohérents (accélération implicite ≤ 12 m/s²), une soupape à 4 rejets, ou un re-semis après > 5 s.
- Arrêt : hystérésis 0,25 / 0,6 m/s publie un vrai 0 près de l'arrêt, sans mentir sur σ.
- L'ancien estimateur α-β reste disponible comme baseline A/B pour le réglage par rejeu de traces.
- Les paramètres (jerk PSD = 0,5, seuils de validité) sont PROVISOIRES, nommés dans
Config, jusqu'à la campagne GPS-5.
Validité & affichage
- Le voyant GNSS est keyé sur la précision de vitesse (≤ 0,5 m/s = ● bon, ≤ 1,5 = ▲, sinon ✕) — pas sur la précision position, qui peut être verte pendant que le Doppler est dégradé.
- À l'écran, « -- » ≠ 0,0 km/h : l'absence de mesure et un véhicule à l'arrêt sont deux états distincts.
- Changement de provider, sortie du mode LIVE, permission retirée : la session est réinitialisée immédiatement — aucune valeur fantôme avant le premier fix frais (GPS-08).
Budget d'erreur vers les ordres (GPS-4)
σrpm = σv · 1000 / V1000 σf(Hn) = n · σrpm / 60 fenêtre de recherche = k·σf + Δf (k = 2 ≈ bande 95 %) suspension si k·σf > h1 / 2 (« ordre non identifiable »)
Exemple audit (V1000 = 10 km/h, σv = 1,8 km/h) : σf(H18) ≈ 54 Hz — l'ancienne fenêtre fixe de ±1 bin (±21,5 Hz) contenait du bruit, pas la raie. Désormais la fenêtre suit l'incertitude réelle, et si elle ne peut pas distinguer l'ordre de ses voisins, le suivi s'arrête au lieu d'inventer.
Reconstruction RTS au rejeu (GPS-4.4)
À la capture, le sidecar stocke la vitesse causale (le Kalman ne voit que le passé). À l'analyse d'un fichier, SpeedReconstruction + RtsSpeedSmoother relisent la piste : Kalman avant + lissage RTS arrière, rejet des points aberrants hors ligne, découpe aux trous > 5 s. Le statut (« lissée (RTS) » vs « brute (interpolée) » pour les sidecars v1/v2) est affiché et imprimé sur le rapport. Le futur est utilisé au rejeu — l'erreur en début de rampe est plus faible qu'en direct, et c'est documenté.
Validation — ce qui manque
PROVISIONAL).