Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

P019 — Benchmark des 18 méthodes d’estimation du lacet véhicule sans gyroscope

RoadSimulator3

Notebook client du framework nostos.benchmarks. Aucune logique métier inline :

  • Les loaders de datasets sont dans nostos.benchmarks.datasets

  • Les 18 méthodes yaw sont dans nostos.stages.yaw_methods

  • Le runner et les métriques sont dans nostos.benchmarks.{imu_calibration_bench, metrics}

Reproductibilité : ce notebook peut être ré-exécuté sans modification à chaque refresh de la DuckDB live (via refresh_published_notebook.sh) et les résultats sont automatiquement versionnés dans le CSV du dossier experiments/.

Références : cf. bibliographie §7 du paper P019.md.

from pathlib import Path
import sys

NB_DIR = Path.cwd()
NOSTOS_ROOT = NB_DIR.parent.parent.parent.parent.parent / "nostos"
sys.path.insert(0, str(NOSTOS_ROOT / "src"))

from nostos.benchmarks import (
    load_greensboro, load_clermont, load_aegis,
    run_benchmark, star_verticality, color_flag,
)
from nostos.benchmarks.imu_calibration_bench import format_results_table
from nostos.stages.yaw_methods import ALL_METHODS

print(f"{len(ALL_METHODS)} méthodes yaw disponibles")
18 méthodes yaw disponibles

1. Chargement des datasets

DatasetHardwareGround truth
AEGIS top-5BeagleBone + gyroGyro (absolu)
ClermontFluidy proto 25 HzVisuel
Greensboro post-daxos_v0.1Teltonika FMC880Visuel
datasets = {
    "AEGIS": load_aegis(top_n_trips=5, with_gyro=True),
    "Clermont": load_clermont(),
    "Greensboro": load_greensboro(post_daxos_only=True, stable_cluster_only=False),
}
for name, df in datasets.items():
    print(f"  {name:12s} : {len(df):>7,d} samples")
  AEGIS        : 378,200 samples
  Clermont     :  10,884 samples
  Greensboro   :   3,176 samples

2. Run du benchmark

Le framework applique automatiquement le Niveau 1 Rodrigues (correction roulis/tangage via alignement gravitaire, Syed et al. 2006 [11] et Tedaldi et al. 2013 [12]) avant d’exécuter chaque méthode yaw du catalogue. Pour AEGIS, la vérité terrain gyroscopique est calculée via estimate_yaw_from_gyro (intégration ancrée GPS, précision typique 0.01°/s).

df_results = run_benchmark(ALL_METHODS, datasets, use_ground_truth=True)
print(f"{len(df_results)} résultats (méthodes × datasets)")
df_results[["dataset", "method", "yaw_deg", "ground_truth_yaw_deg", "abs_error_deg", "flag", "exec_time_ms"]].head(20)
/Users/sebastien.edet/projects/pro/deeptech/nostos/src/nostos/stages/yaw_methods.py:402: RuntimeWarning: divide by zero encountered in divide
  weights = np.where(np.abs(arr - median) / mad < k, 1.0, k * mad / np.abs(arr - median))
54 résultats (méthodes × datasets)
Loading...

3. Tableau récapitulatif cross-dataset

Légende : 🟢 erreur < 1° (ou écart visuel < 3°) — 🟡 < 3° (ou < 8°) — 🔴 ≥ 3° — ⚪ non convergé

from IPython.display import Markdown, display
display(Markdown(format_results_table(df_results)))
Loading...

4. Persistance des résultats

Le CSV est versionné dans experiments/yaw_benchmark_18methods_3datasets.csv pour traçabilité et comparaison avec les runs précédents (évolution au fil des nouvelles données collectées).

out_csv = NB_DIR.parent / "experiments" / "yaw_benchmark_18methods_3datasets.csv"
df_results.to_csv(out_csv, index=False)
print(f"✓ {out_csv.relative_to(NB_DIR.parent)}")
✓ experiments/yaw_benchmark_18methods_3datasets.csv