Notebook client du framework nostos.benchmarks. Aucune logique métier inline :
Les loaders de datasets sont dans
nostos.benchmarks.datasetsLes 18 méthodes yaw sont dans
nostos.stages.yaw_methodsLe 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¶
| Dataset | Hardware | Ground truth |
|---|---|---|
| AEGIS top-5 | BeagleBone + gyro | Gyro (absolu) |
| Clermont | Fluidy proto 25 Hz | Visuel |
| Greensboro post-daxos_v0.1 | Teltonika FMC880 | Visuel |
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)
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)))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