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

  1. AcquisitionGPS_PROVIDER exclusivement (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 thread nvh-gnss.
  2. QualificationGnssSpeedSession.qualify() rejette avant tout calcul : vitesse non finie ou négative, fix simulé, fix en retard de livraison (> 2 s).
  3. EstimationKalmanSpeedEstimator [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.
  4. Validité — une estimation est VALID (frais, σv ≤ 1,5 m/s), DEGRADED (σv inconnu ou entre 1,5 et 3 m/s) ou INVALID (pas de fix ou horizon de 2 s dépassé). INVALID ⇒ kinematicSpeedMps() rend null : le suivi d'ordres est suspendu, jamais prolongé sur un chiffre figé.
  5. 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.

V1000 n'a pas encore de σ. L'incertitude propre de V1000 (rayon dynamique du pneu, arrondis de rapport) n'est pas modélisée : elle peut dominer le terme GNSS. Caractérisation prévue (plan 5.3 / GPS-5).

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

Tous les seuils ci-dessus proviennent de profils de simulation sur un seul chipset (émulateur). La campagne GPS-5 (3 téléphones vs vérité terrain, biais/MAE/RMSE/P95, couverture σ, A/B full-tracking, gel des paramètres) n'a pas encore eu lieu. Tant qu'elle n'a pas eu lieu, cette chaîne est exploitable en essai exploratoire, pas comme référence qualifiée — le code le dit explicitement (PROVISIONAL).