{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# P013 — IMU Rectification Without Gyroscope\n",
    "\n",
    "## Notebook 01 — Multi-dataset validation : Clermont prototype + us_greensboro Teltonika commercial\n",
    "\n",
    "Ce notebook consomme **deux datasets** du catalog Telemachus 0.7 (cf `requirements.yaml` du paper) et lance la méthode P013 (Rodrigues sur le vecteur gravité au repos, sans gyroscope) sur chacun pour comparer la précision d'orientation entre :\n",
    "\n",
    "- **`fr_clermont_proto_2025-09`** — experimental prototype, 14 trips, 25 Hz effective, France. Rôle : `primary_validation`.\n",
    "- **`us_greensboro_fmc880_2026-04`** — Teltonika FMC880 commercial, post `daxos_v0.1` (frame=raw), Greensboro NC. Rôle : `commercial_validation`.\n",
    "\n",
    "**Objectif** : démontrer que la méthode P013 transfère du prototype au hardware commercial, même si la précision est attendue légèrement plus faible sur us_greensboro à cause du manque de samples ZUPT (trips urbains courts) tant qu'Emmanuel n'a pas fait de roulage plus long.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:04.627542Z",
     "iopub.status.busy": "2026-04-16T15:20:04.627320Z",
     "iopub.status.idle": "2026-04-16T15:20:05.155604Z",
     "shell.execute_reply": "2026-04-16T15:20:05.155305Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Teleforge root : /Users/sebastien.edet/projects/pro/deeptech/teleforge\n",
      "Nostos root    : /Users/sebastien.edet/projects/pro/deeptech/nostos\n",
      "Nostos exists  : True\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "from pathlib import Path\n",
    "import yaml\n",
    "import duckdb\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Resolve project roots\n",
    "NB_DIR = Path.cwd()\n",
    "TELEFORGE_ROOT = NB_DIR.parent.parent.parent.parent\n",
    "NOSTOS_ROOT = TELEFORGE_ROOT.parent / \"nostos\"\n",
    "NOSTOS_SRC = NOSTOS_ROOT / \"src\"\n",
    "if str(NOSTOS_SRC) not in sys.path:\n",
    "    sys.path.insert(0, str(NOSTOS_SRC))\n",
    "\n",
    "from nostos.stages.d1_imu_calibrator import estimate_rotation\n",
    "\n",
    "print(f\"Teleforge root : {TELEFORGE_ROOT}\")\n",
    "print(f\"Nostos root    : {NOSTOS_ROOT}\")\n",
    "print(f\"Nostos exists  : {NOSTOS_ROOT.exists()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Charger les deux manifests depuis le catalog"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.173354Z",
     "iopub.status.busy": "2026-04-16T15:20:05.173205Z",
     "iopub.status.idle": "2026-04-16T15:20:05.186982Z",
     "shell.execute_reply": "2026-04-16T15:20:05.186750Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dataset_id</th>\n",
       "      <th>country</th>\n",
       "      <th>hardware_class</th>\n",
       "      <th>hw_vendor</th>\n",
       "      <th>hw_model</th>\n",
       "      <th>accel_hz</th>\n",
       "      <th>has_gyro</th>\n",
       "      <th>acc_frame</th>\n",
       "      <th>n_trips</th>\n",
       "      <th>distance_km</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>fr_clermont_proto_2025-09</td>\n",
       "      <td>FR</td>\n",
       "      <td>prototype</td>\n",
       "      <td>research operator</td>\n",
       "      <td>experimental_telematics_prototype</td>\n",
       "      <td>25</td>\n",
       "      <td>False</td>\n",
       "      <td>partial</td>\n",
       "      <td>14</td>\n",
       "      <td>67.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>us_greensboro_fmc880_2026-04</td>\n",
       "      <td>US</td>\n",
       "      <td>commercial</td>\n",
       "      <td>Teltonika</td>\n",
       "      <td>FMC880</td>\n",
       "      <td>1</td>\n",
       "      <td>False</td>\n",
       "      <td>raw</td>\n",
       "      <td>23</td>\n",
       "      <td>61.4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     dataset_id country hardware_class  hw_vendor  \\\n",
       "0     fr_clermont_proto_2025-09      FR      prototype     research operator   \n",
       "1  us_greensboro_fmc880_2026-04      US     commercial  Teltonika   \n",
       "\n",
       "                            hw_model  accel_hz  has_gyro acc_frame  n_trips  \\\n",
       "0  experimental_telematics_prototype        25     False   partial       14   \n",
       "1                             FMC880         1     False       raw       23   \n",
       "\n",
       "   distance_km  \n",
       "0         67.0  \n",
       "1         61.4  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def load_manifest(dataset_id):\n",
    "    with open(TELEFORGE_ROOT / \"datasets\" / dataset_id / \"manifest.yaml\") as f:\n",
    "        return yaml.safe_load(f)\n",
    "\n",
    "ds_ids = [\"fr_clermont_proto_2025-09\", \"us_greensboro_fmc880_2026-04\"]\n",
    "manifests = {dsid: load_manifest(dsid) for dsid in ds_ids}\n",
    "\n",
    "# Résumé comparatif\n",
    "rows = []\n",
    "for dsid, m in manifests.items():\n",
    "    rows.append({\n",
    "        \"dataset_id\": dsid,\n",
    "        \"country\": m['country'],\n",
    "        \"hardware_class\": m['hardware']['class'],\n",
    "        \"hw_vendor\": m['hardware']['vendor'],\n",
    "        \"hw_model\": m['hardware']['model'],\n",
    "        \"accel_hz\": m['sensors']['accelerometer']['rate_hz'],\n",
    "        \"has_gyro\": m['sensors']['accelerometer']['has_gyroscope'],\n",
    "        \"acc_frame\": m['acc_periods'][-1]['frame'],\n",
    "        \"n_trips\": m['volume']['n_trips'],\n",
    "        \"distance_km\": m['volume']['distance_km'],\n",
    "    })\n",
    "summary = pd.DataFrame(rows)\n",
    "summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Dataset 1 — Clermont prototype (14 trips)\n",
    "\n",
    "Chargement via le path déclaré dans le manifest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.188253Z",
     "iopub.status.busy": "2026-04-16T15:20:05.188180Z",
     "iopub.status.idle": "2026-04-16T15:20:05.245301Z",
     "shell.execute_reply": "2026-04-16T15:20:05.245066Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Parquet : /Users/sebastien.edet/projects/pro/deeptech/data/private/clermont_RAW.parquet\n",
      "Exists  : True\n",
      "Loaded  : 10,884 samples (with GPS), 14 trips\n",
      "g_norm  : 9.44 m/s² ✓\n"
     ]
    }
   ],
   "source": [
    "# Load Clermont RAW data from deeptech/data/private/\n",
    "# RAW = gravity included (g_norm ~9.4 m/s²), required for P013 gravity estimation\n",
    "# COMPENSATED variant (g_norm ~1) is for GPS upsampling only\n",
    "DEEPTECH = TELEFORGE_ROOT.parent\n",
    "clermont_parquet = DEEPTECH / \"data\" / \"private\" / \"clermont_RAW.parquet\"\n",
    "print(f\"Parquet : {clermont_parquet}\")\n",
    "print(f\"Exists  : {clermont_parquet.exists()}\")\n",
    "\n",
    "df_clermont = pd.read_parquet(clermont_parquet)\n",
    "df_clermont = df_clermont.dropna(subset=[\"ax_mps2\", \"ay_mps2\", \"az_mps2\",\n",
    "                                          \"speed_mps\", \"lat\", \"lon\"]).reset_index(drop=True)\n",
    "print(f\"Loaded  : {len(df_clermont):,} samples (with GPS), {df_clermont['trip_idx'].nunique()} trips\")\n",
    "\n",
    "g_norm = np.sqrt(df_clermont[\"ax_mps2\"]**2 + df_clermont[\"ay_mps2\"]**2 + df_clermont[\"az_mps2\"]**2).mean()\n",
    "assert g_norm > 5, f\"g_norm={g_norm:.2f} — this looks like COMPENSATED data, not RAW!\"\n",
    "print(f\"g_norm  : {g_norm:.2f} m/s² ✓\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.246544Z",
     "iopub.status.busy": "2026-04-16T15:20:05.246466Z",
     "iopub.status.idle": "2026-04-16T15:20:05.261765Z",
     "shell.execute_reply": "2026-04-16T15:20:05.261547Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "14 trips Clermont processed\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dataset</th>\n",
       "      <th>trip</th>\n",
       "      <th>n_samples</th>\n",
       "      <th>roll_deg</th>\n",
       "      <th>pitch_deg</th>\n",
       "      <th>yaw_deg</th>\n",
       "      <th>gravity_norm</th>\n",
       "      <th>rotation_detected</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_00</td>\n",
       "      <td>1098</td>\n",
       "      <td>174.18</td>\n",
       "      <td>-0.12</td>\n",
       "      <td>-2.33</td>\n",
       "      <td>9.6876</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_01</td>\n",
       "      <td>494</td>\n",
       "      <td>175.12</td>\n",
       "      <td>1.82</td>\n",
       "      <td>40.87</td>\n",
       "      <td>9.3028</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_02</td>\n",
       "      <td>495</td>\n",
       "      <td>174.89</td>\n",
       "      <td>1.82</td>\n",
       "      <td>39.11</td>\n",
       "      <td>9.3969</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_03</td>\n",
       "      <td>958</td>\n",
       "      <td>174.35</td>\n",
       "      <td>0.48</td>\n",
       "      <td>9.72</td>\n",
       "      <td>9.5404</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_04</td>\n",
       "      <td>237</td>\n",
       "      <td>175.83</td>\n",
       "      <td>1.99</td>\n",
       "      <td>50.94</td>\n",
       "      <td>9.1731</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_05</td>\n",
       "      <td>295</td>\n",
       "      <td>176.16</td>\n",
       "      <td>-0.55</td>\n",
       "      <td>-16.41</td>\n",
       "      <td>9.0491</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_06</td>\n",
       "      <td>720</td>\n",
       "      <td>174.79</td>\n",
       "      <td>2.09</td>\n",
       "      <td>43.69</td>\n",
       "      <td>9.4611</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_07</td>\n",
       "      <td>569</td>\n",
       "      <td>175.95</td>\n",
       "      <td>2.20</td>\n",
       "      <td>57.12</td>\n",
       "      <td>9.1675</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_08</td>\n",
       "      <td>792</td>\n",
       "      <td>174.36</td>\n",
       "      <td>0.89</td>\n",
       "      <td>17.85</td>\n",
       "      <td>9.5677</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_09</td>\n",
       "      <td>279</td>\n",
       "      <td>174.95</td>\n",
       "      <td>1.98</td>\n",
       "      <td>42.75</td>\n",
       "      <td>9.3898</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_10</td>\n",
       "      <td>928</td>\n",
       "      <td>175.59</td>\n",
       "      <td>1.70</td>\n",
       "      <td>42.13</td>\n",
       "      <td>9.1690</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_11</td>\n",
       "      <td>994</td>\n",
       "      <td>174.32</td>\n",
       "      <td>-0.38</td>\n",
       "      <td>-7.66</td>\n",
       "      <td>9.7131</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_12</td>\n",
       "      <td>1580</td>\n",
       "      <td>174.57</td>\n",
       "      <td>1.64</td>\n",
       "      <td>33.64</td>\n",
       "      <td>9.5174</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>clermont_proto</td>\n",
       "      <td>clermont_13</td>\n",
       "      <td>1445</td>\n",
       "      <td>174.91</td>\n",
       "      <td>1.94</td>\n",
       "      <td>41.72</td>\n",
       "      <td>9.3605</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           dataset         trip  n_samples  roll_deg  pitch_deg  yaw_deg  \\\n",
       "0   clermont_proto  clermont_00       1098    174.18      -0.12    -2.33   \n",
       "1   clermont_proto  clermont_01        494    175.12       1.82    40.87   \n",
       "2   clermont_proto  clermont_02        495    174.89       1.82    39.11   \n",
       "3   clermont_proto  clermont_03        958    174.35       0.48     9.72   \n",
       "4   clermont_proto  clermont_04        237    175.83       1.99    50.94   \n",
       "5   clermont_proto  clermont_05        295    176.16      -0.55   -16.41   \n",
       "6   clermont_proto  clermont_06        720    174.79       2.09    43.69   \n",
       "7   clermont_proto  clermont_07        569    175.95       2.20    57.12   \n",
       "8   clermont_proto  clermont_08        792    174.36       0.89    17.85   \n",
       "9   clermont_proto  clermont_09        279    174.95       1.98    42.75   \n",
       "10  clermont_proto  clermont_10        928    175.59       1.70    42.13   \n",
       "11  clermont_proto  clermont_11        994    174.32      -0.38    -7.66   \n",
       "12  clermont_proto  clermont_12       1580    174.57       1.64    33.64   \n",
       "13  clermont_proto  clermont_13       1445    174.91       1.94    41.72   \n",
       "\n",
       "    gravity_norm  rotation_detected  \n",
       "0         9.6876               True  \n",
       "1         9.3028               True  \n",
       "2         9.3969               True  \n",
       "3         9.5404               True  \n",
       "4         9.1731               True  \n",
       "5         9.0491               True  \n",
       "6         9.4611               True  \n",
       "7         9.1675               True  \n",
       "8         9.5677               True  \n",
       "9         9.3898               True  \n",
       "10        9.1690               True  \n",
       "11        9.7131               True  \n",
       "12        9.5174               True  \n",
       "13        9.3605               True  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clermont_results = []\n",
    "for trip_idx, trip_df in df_clermont.groupby('trip_idx'):\n",
    "    rot = estimate_rotation(trip_df, speed_thr_ms=0.3)\n",
    "    clermont_results.append({\n",
    "        'dataset': 'clermont_proto',\n",
    "        'trip': f'clermont_{int(trip_idx):02d}',\n",
    "        'n_samples': len(trip_df),\n",
    "        'roll_deg': rot['roll_deg'],\n",
    "        'pitch_deg': rot['pitch_deg'],\n",
    "        'yaw_deg': rot['yaw_deg'],\n",
    "        'gravity_norm': rot.get('gravity_norm'),\n",
    "        'rotation_detected': rot.get('rotation_detected', False),\n",
    "    })\n",
    "clermont_df = pd.DataFrame(clermont_results)\n",
    "print(f\"{len(clermont_df)} trips Clermont processed\")\n",
    "clermont_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Dataset 2 — us_greensboro Teltonika commercial\n",
    "\n",
    "Les trips sont des parquets individuels dans `nostos/data/flespi/trips/<device>/<trip_id>.parquet`, indexés dans la table `trips` de la DuckDB `telemetry.duckdb` (peuplée par le trip processor).\n",
    "\n",
    "On filtre sur :\n",
    "- `carrier_state = 'mounted_driving'` (RFC-0013 §3.7)\n",
    "- `accel_norm_mean_mps2 IS NOT NULL` (data accel présente)\n",
    "- `distance_km > 1` (pas de micro-trips)\n",
    "- `ts_start >= '2026-04-10 11:06'` (post daxos_v0.1, cf `acc_periods` du manifest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.262951Z",
     "iopub.status.busy": "2026-04-16T15:20:05.262879Z",
     "iopub.status.idle": "2026-04-16T15:20:05.292510Z",
     "shell.execute_reply": "2026-04-16T15:20:05.292286Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DuckDB : /Users/sebastien.edet/projects/pro/deeptech/nostos/data/flespi/storage/telemetry.duckdb\n",
      "Exists : True\n",
      "\n",
      "20 trips us_greensboro exploitables (post daxos_v0.1)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>trip_id</th>\n",
       "      <th>distance_km</th>\n",
       "      <th>speed_max_kmh</th>\n",
       "      <th>ax_mean_mps2</th>\n",
       "      <th>ay_mean_mps2</th>\n",
       "      <th>az_mean_mps2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>860813070899989_T20260410_113008</td>\n",
       "      <td>3.353</td>\n",
       "      <td>71.0</td>\n",
       "      <td>0.5232</td>\n",
       "      <td>-1.2722</td>\n",
       "      <td>9.8613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>860813070899989_T20260410_120135</td>\n",
       "      <td>11.823</td>\n",
       "      <td>76.0</td>\n",
       "      <td>-0.3848</td>\n",
       "      <td>-0.8323</td>\n",
       "      <td>9.8476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>860813070899989_T20260410_123000</td>\n",
       "      <td>5.523</td>\n",
       "      <td>81.0</td>\n",
       "      <td>9.5777</td>\n",
       "      <td>0.6230</td>\n",
       "      <td>3.1198</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>860813070899989_T20260410_142227</td>\n",
       "      <td>5.794</td>\n",
       "      <td>74.0</td>\n",
       "      <td>8.5082</td>\n",
       "      <td>-0.1549</td>\n",
       "      <td>5.8234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>860813070899989_T20260410_160121</td>\n",
       "      <td>8.267</td>\n",
       "      <td>65.0</td>\n",
       "      <td>4.6286</td>\n",
       "      <td>-8.9005</td>\n",
       "      <td>2.4884</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>860813070899989_T20260410_165423</td>\n",
       "      <td>7.963</td>\n",
       "      <td>61.0</td>\n",
       "      <td>3.9596</td>\n",
       "      <td>-9.2701</td>\n",
       "      <td>2.0533</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>860813070899989_T20260411_141215</td>\n",
       "      <td>9.511</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.8593</td>\n",
       "      <td>-10.0857</td>\n",
       "      <td>0.9591</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>860813070899989_T20260411_141433</td>\n",
       "      <td>8.438</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.9031</td>\n",
       "      <td>-10.0979</td>\n",
       "      <td>0.9629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>860813070899989_T20260411_141935</td>\n",
       "      <td>6.093</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.9956</td>\n",
       "      <td>-10.1328</td>\n",
       "      <td>0.9593</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>860813070899989_T20260411_142438</td>\n",
       "      <td>3.259</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.9948</td>\n",
       "      <td>-10.1101</td>\n",
       "      <td>1.0747</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>860813070899989_T20260411_153240</td>\n",
       "      <td>7.833</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.6585</td>\n",
       "      <td>-10.1449</td>\n",
       "      <td>0.8729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>860813070899989_T20260411_153248</td>\n",
       "      <td>7.822</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.6631</td>\n",
       "      <td>-10.1459</td>\n",
       "      <td>0.8739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>860813070899989_T20260411_153510</td>\n",
       "      <td>6.866</td>\n",
       "      <td>66.0</td>\n",
       "      <td>1.7558</td>\n",
       "      <td>-10.1644</td>\n",
       "      <td>0.9186</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>860813070899989_T20260411_154008</td>\n",
       "      <td>3.811</td>\n",
       "      <td>62.0</td>\n",
       "      <td>1.7480</td>\n",
       "      <td>-10.1771</td>\n",
       "      <td>1.0566</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>860813070899989_T20260412_180428</td>\n",
       "      <td>1.156</td>\n",
       "      <td>73.0</td>\n",
       "      <td>1.8400</td>\n",
       "      <td>-10.2187</td>\n",
       "      <td>0.9771</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>860813070899989_T20260412_180548</td>\n",
       "      <td>1.146</td>\n",
       "      <td>73.0</td>\n",
       "      <td>1.9129</td>\n",
       "      <td>-10.2141</td>\n",
       "      <td>0.9621</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>860813070899989_T20260412_181451</td>\n",
       "      <td>1.501</td>\n",
       "      <td>62.0</td>\n",
       "      <td>1.6409</td>\n",
       "      <td>-10.2674</td>\n",
       "      <td>1.1554</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>860813070899989_T20260412_193336</td>\n",
       "      <td>10.443</td>\n",
       "      <td>78.0</td>\n",
       "      <td>1.7853</td>\n",
       "      <td>-10.2168</td>\n",
       "      <td>0.8876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>860813070899989_T20260412_212119</td>\n",
       "      <td>5.270</td>\n",
       "      <td>76.0</td>\n",
       "      <td>1.8472</td>\n",
       "      <td>-10.1538</td>\n",
       "      <td>0.9135</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>860813070899989_T20260412_214003</td>\n",
       "      <td>6.721</td>\n",
       "      <td>115.0</td>\n",
       "      <td>1.6896</td>\n",
       "      <td>-10.2290</td>\n",
       "      <td>1.3223</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                             trip_id  distance_km  speed_max_kmh  \\\n",
       "0   860813070899989_T20260410_113008        3.353           71.0   \n",
       "1   860813070899989_T20260410_120135       11.823           76.0   \n",
       "2   860813070899989_T20260410_123000        5.523           81.0   \n",
       "3   860813070899989_T20260410_142227        5.794           74.0   \n",
       "4   860813070899989_T20260410_160121        8.267           65.0   \n",
       "5   860813070899989_T20260410_165423        7.963           61.0   \n",
       "6   860813070899989_T20260411_141215        9.511           66.0   \n",
       "7   860813070899989_T20260411_141433        8.438           66.0   \n",
       "8   860813070899989_T20260411_141935        6.093           66.0   \n",
       "9   860813070899989_T20260411_142438        3.259           66.0   \n",
       "10  860813070899989_T20260411_153240        7.833           66.0   \n",
       "11  860813070899989_T20260411_153248        7.822           66.0   \n",
       "12  860813070899989_T20260411_153510        6.866           66.0   \n",
       "13  860813070899989_T20260411_154008        3.811           62.0   \n",
       "14  860813070899989_T20260412_180428        1.156           73.0   \n",
       "15  860813070899989_T20260412_180548        1.146           73.0   \n",
       "16  860813070899989_T20260412_181451        1.501           62.0   \n",
       "17  860813070899989_T20260412_193336       10.443           78.0   \n",
       "18  860813070899989_T20260412_212119        5.270           76.0   \n",
       "19  860813070899989_T20260412_214003        6.721          115.0   \n",
       "\n",
       "    ax_mean_mps2  ay_mean_mps2  az_mean_mps2  \n",
       "0         0.5232       -1.2722        9.8613  \n",
       "1        -0.3848       -0.8323        9.8476  \n",
       "2         9.5777        0.6230        3.1198  \n",
       "3         8.5082       -0.1549        5.8234  \n",
       "4         4.6286       -8.9005        2.4884  \n",
       "5         3.9596       -9.2701        2.0533  \n",
       "6         1.8593      -10.0857        0.9591  \n",
       "7         1.9031      -10.0979        0.9629  \n",
       "8         1.9956      -10.1328        0.9593  \n",
       "9         1.9948      -10.1101        1.0747  \n",
       "10        1.6585      -10.1449        0.8729  \n",
       "11        1.6631      -10.1459        0.8739  \n",
       "12        1.7558      -10.1644        0.9186  \n",
       "13        1.7480      -10.1771        1.0566  \n",
       "14        1.8400      -10.2187        0.9771  \n",
       "15        1.9129      -10.2141        0.9621  \n",
       "16        1.6409      -10.2674        1.1554  \n",
       "17        1.7853      -10.2168        0.8876  \n",
       "18        1.8472      -10.1538        0.9135  \n",
       "19        1.6896      -10.2290        1.3223  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "duckdb_path = NOSTOS_ROOT / \"data\" / \"flespi\" / \"storage\" / \"telemetry.duckdb\"\n",
    "print(f\"DuckDB : {duckdb_path}\")\n",
    "print(f\"Exists : {duckdb_path.exists()}\")\n",
    "\n",
    "conn = duckdb.connect(str(duckdb_path), read_only=True)\n",
    "trips_catalog = conn.execute(\"\"\"\n",
    "    SELECT trip_id, device_id, ts_start, n_samples, distance_km,\n",
    "           speed_max_kmh, ax_mean_mps2, ay_mean_mps2, az_mean_mps2,\n",
    "           accel_norm_mean_mps2, parquet_path\n",
    "    FROM trips\n",
    "    WHERE carrier_state = 'mounted_driving'\n",
    "      AND accel_norm_mean_mps2 IS NOT NULL\n",
    "      AND distance_km > 1.0\n",
    "      AND ts_start >= '2026-04-10 11:06:00'\n",
    "    ORDER BY ts_start\n",
    "\"\"\").fetchdf()\n",
    "conn.close()\n",
    "\n",
    "print(f\"\\n{len(trips_catalog)} trips us_greensboro exploitables (post daxos_v0.1)\")\n",
    "trips_catalog[['trip_id', 'distance_km', 'speed_max_kmh',\n",
    "               'ax_mean_mps2', 'ay_mean_mps2', 'az_mean_mps2']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.293832Z",
     "iopub.status.busy": "2026-04-16T15:20:05.293751Z",
     "iopub.status.idle": "2026-04-16T15:20:05.298171Z",
     "shell.execute_reply": "2026-04-16T15:20:05.297993Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Orientations détectées :\n",
      "orientation\n",
      "Y-    16\n",
      "Z+     2\n",
      "X+     2\n",
      "Name: count, dtype: int64\n",
      "\n",
      "→ cluster dominant : Y-\n",
      "→ 16 trips dans le cluster dominant\n"
     ]
    }
   ],
   "source": [
    "# Clusteriser par orientation (axe dominant) — le device physique a bougé\n",
    "# pendant la campagne, donc on isole le cluster dominant pour P013\n",
    "g_vec = trips_catalog[['ax_mean_mps2', 'ay_mean_mps2', 'az_mean_mps2']].to_numpy()\n",
    "norms = np.linalg.norm(g_vec, axis=1, keepdims=True)\n",
    "g_unit = g_vec / norms\n",
    "dom_axis = np.argmax(np.abs(g_unit), axis=1)\n",
    "signs = np.sign(g_unit[np.arange(len(g_unit)), dom_axis])\n",
    "trips_catalog = trips_catalog.copy()\n",
    "trips_catalog['orientation'] = [f\"{'XYZ'[a]}{'+' if s > 0 else '-'}\" for a, s in zip(dom_axis, signs)]\n",
    "print(\"Orientations détectées :\")\n",
    "print(trips_catalog['orientation'].value_counts())\n",
    "\n",
    "# Cluster dominant\n",
    "dominant_cluster = trips_catalog['orientation'].value_counts().idxmax()\n",
    "print(f\"\\n→ cluster dominant : {dominant_cluster}\")\n",
    "us_trips = trips_catalog[trips_catalog['orientation'] == dominant_cluster].copy()\n",
    "print(f\"→ {len(us_trips)} trips dans le cluster dominant\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.299386Z",
     "iopub.status.busy": "2026-04-16T15:20:05.299298Z",
     "iopub.status.idle": "2026-04-16T15:20:05.340880Z",
     "shell.execute_reply": "2026-04-16T15:20:05.340657Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "16 trips us_greensboro processed\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dataset</th>\n",
       "      <th>trip</th>\n",
       "      <th>n_samples</th>\n",
       "      <th>roll_deg</th>\n",
       "      <th>pitch_deg</th>\n",
       "      <th>yaw_deg</th>\n",
       "      <th>gravity_norm</th>\n",
       "      <th>rotation_detected</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260410_160121</td>\n",
       "      <td>175</td>\n",
       "      <td>73.66</td>\n",
       "      <td>26.36</td>\n",
       "      <td>19.89</td>\n",
       "      <td>10.4246</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260410_165423</td>\n",
       "      <td>177</td>\n",
       "      <td>75.88</td>\n",
       "      <td>25.67</td>\n",
       "      <td>20.14</td>\n",
       "      <td>10.3223</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_141215</td>\n",
       "      <td>204</td>\n",
       "      <td>84.28</td>\n",
       "      <td>10.46</td>\n",
       "      <td>9.47</td>\n",
       "      <td>10.2125</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_141433</td>\n",
       "      <td>171</td>\n",
       "      <td>84.84</td>\n",
       "      <td>10.12</td>\n",
       "      <td>9.25</td>\n",
       "      <td>10.2422</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_141935</td>\n",
       "      <td>117</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_142438</td>\n",
       "      <td>73</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_153240</td>\n",
       "      <td>162</td>\n",
       "      <td>85.14</td>\n",
       "      <td>11.06</td>\n",
       "      <td>10.17</td>\n",
       "      <td>10.3242</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_153248</td>\n",
       "      <td>161</td>\n",
       "      <td>85.14</td>\n",
       "      <td>11.06</td>\n",
       "      <td>10.17</td>\n",
       "      <td>10.3242</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_153510</td>\n",
       "      <td>127</td>\n",
       "      <td>85.13</td>\n",
       "      <td>11.08</td>\n",
       "      <td>10.18</td>\n",
       "      <td>10.3050</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260411_154008</td>\n",
       "      <td>86</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260412_180428</td>\n",
       "      <td>49</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260412_180548</td>\n",
       "      <td>47</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260412_181451</td>\n",
       "      <td>62</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>0.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260412_193336</td>\n",
       "      <td>200</td>\n",
       "      <td>86.58</td>\n",
       "      <td>10.29</td>\n",
       "      <td>9.69</td>\n",
       "      <td>10.4340</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260412_212119</td>\n",
       "      <td>136</td>\n",
       "      <td>86.01</td>\n",
       "      <td>9.06</td>\n",
       "      <td>8.45</td>\n",
       "      <td>10.4971</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>us_greensboro</td>\n",
       "      <td>T20260412_214003</td>\n",
       "      <td>125</td>\n",
       "      <td>84.13</td>\n",
       "      <td>9.81</td>\n",
       "      <td>8.86</td>\n",
       "      <td>10.4149</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          dataset              trip  n_samples  roll_deg  pitch_deg  yaw_deg  \\\n",
       "0   us_greensboro  T20260410_160121        175     73.66      26.36    19.89   \n",
       "1   us_greensboro  T20260410_165423        177     75.88      25.67    20.14   \n",
       "2   us_greensboro  T20260411_141215        204     84.28      10.46     9.47   \n",
       "3   us_greensboro  T20260411_141433        171     84.84      10.12     9.25   \n",
       "4   us_greensboro  T20260411_141935        117      0.00       0.00     0.00   \n",
       "5   us_greensboro  T20260411_142438         73      0.00       0.00     0.00   \n",
       "6   us_greensboro  T20260411_153240        162     85.14      11.06    10.17   \n",
       "7   us_greensboro  T20260411_153248        161     85.14      11.06    10.17   \n",
       "8   us_greensboro  T20260411_153510        127     85.13      11.08    10.18   \n",
       "9   us_greensboro  T20260411_154008         86      0.00       0.00     0.00   \n",
       "10  us_greensboro  T20260412_180428         49      0.00       0.00     0.00   \n",
       "11  us_greensboro  T20260412_180548         47      0.00       0.00     0.00   \n",
       "12  us_greensboro  T20260412_181451         62      0.00       0.00     0.00   \n",
       "13  us_greensboro  T20260412_193336        200     86.58      10.29     9.69   \n",
       "14  us_greensboro  T20260412_212119        136     86.01       9.06     8.45   \n",
       "15  us_greensboro  T20260412_214003        125     84.13       9.81     8.86   \n",
       "\n",
       "    gravity_norm  rotation_detected  \n",
       "0        10.4246               True  \n",
       "1        10.3223               True  \n",
       "2        10.2125               True  \n",
       "3        10.2422               True  \n",
       "4            NaN              False  \n",
       "5            NaN              False  \n",
       "6        10.3242               True  \n",
       "7        10.3242               True  \n",
       "8        10.3050               True  \n",
       "9            NaN              False  \n",
       "10           NaN              False  \n",
       "11           NaN              False  \n",
       "12           NaN              False  \n",
       "13       10.4340               True  \n",
       "14       10.4971               True  \n",
       "15       10.4149               True  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "us_results = []\n",
    "for _, row in us_trips.iterrows():\n",
    "    pq = Path(row['parquet_path'])\n",
    "    if not pq.exists():\n",
    "        # Fallback : path local\n",
    "        alt = NOSTOS_ROOT / \"data\" / \"flespi\" / \"trips\" / str(row['device_id']) / f\"{row['trip_id']}.parquet\"\n",
    "        if alt.exists():\n",
    "            pq = alt\n",
    "    if not pq.exists():\n",
    "        continue\n",
    "    trip_df = pd.read_parquet(pq)\n",
    "    rot = estimate_rotation(trip_df, speed_thr_ms=0.3)\n",
    "    us_results.append({\n",
    "        'dataset': 'us_greensboro',\n",
    "        'trip': row['trip_id'].split('_', 1)[1][:16],  # short label\n",
    "        'n_samples': row['n_samples'],\n",
    "        'roll_deg': rot['roll_deg'],\n",
    "        'pitch_deg': rot['pitch_deg'],\n",
    "        'yaw_deg': rot['yaw_deg'],\n",
    "        'gravity_norm': rot.get('gravity_norm'),\n",
    "        'rotation_detected': rot.get('rotation_detected', False),\n",
    "    })\n",
    "us_df = pd.DataFrame(us_results)\n",
    "print(f\"{len(us_df)} trips us_greensboro processed\")\n",
    "us_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Comparaison cross-dataset\n",
    "\n",
    "On agrège les résultats des deux datasets et on reporte la précision P013 (std intra-dataset) pour chacun."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.342154Z",
     "iopub.status.busy": "2026-04-16T15:20:05.342076Z",
     "iopub.status.idle": "2026-04-16T15:20:05.348491Z",
     "shell.execute_reply": "2026-04-16T15:20:05.348272Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>dataset</th>\n",
       "      <th>hardware</th>\n",
       "      <th>country</th>\n",
       "      <th>n_trips</th>\n",
       "      <th>roll_mean</th>\n",
       "      <th>roll_std</th>\n",
       "      <th>pitch_mean</th>\n",
       "      <th>pitch_std</th>\n",
       "      <th>gravity_norm_mean</th>\n",
       "      <th>gravity_norm_std</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Clermont prototype</td>\n",
       "      <td>experimental prototype 50 Hz</td>\n",
       "      <td>FR</td>\n",
       "      <td>14</td>\n",
       "      <td>174.998</td>\n",
       "      <td>0.652</td>\n",
       "      <td>1.250</td>\n",
       "      <td>0.987</td>\n",
       "      <td>9.393</td>\n",
       "      <td>0.204</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>us_greensboro Teltonika</td>\n",
       "      <td>Teltonika FMC880</td>\n",
       "      <td>US</td>\n",
       "      <td>10</td>\n",
       "      <td>83.079</td>\n",
       "      <td>4.469</td>\n",
       "      <td>13.497</td>\n",
       "      <td>6.629</td>\n",
       "      <td>10.350</td>\n",
       "      <td>0.090</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   dataset            hardware country  n_trips  roll_mean  \\\n",
       "0       Clermont prototype  experimental prototype 50 Hz      FR       14    174.998   \n",
       "1  us_greensboro Teltonika    Teltonika FMC880      US       10     83.079   \n",
       "\n",
       "   roll_std  pitch_mean  pitch_std  gravity_norm_mean  gravity_norm_std  \n",
       "0     0.652       1.250      0.987              9.393             0.204  \n",
       "1     4.469      13.497      6.629             10.350             0.090  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Ne garder que les trips avec rotation détectée (gravity_norm > 5)\n",
    "clermont_valid = clermont_df[clermont_df['gravity_norm'] > 5].copy()\n",
    "us_valid = us_df[us_df['gravity_norm'] > 5].copy() if len(us_df) else pd.DataFrame()\n",
    "\n",
    "cross_summary = pd.DataFrame([\n",
    "    {\n",
    "        'dataset': 'Clermont prototype',\n",
    "        'hardware': 'experimental prototype 50 Hz',\n",
    "        'country': 'FR',\n",
    "        'n_trips': len(clermont_valid),\n",
    "        'roll_mean': clermont_valid['roll_deg'].mean(),\n",
    "        'roll_std': clermont_valid['roll_deg'].std(),\n",
    "        'pitch_mean': clermont_valid['pitch_deg'].mean(),\n",
    "        'pitch_std': clermont_valid['pitch_deg'].std(),\n",
    "        'gravity_norm_mean': clermont_valid['gravity_norm'].mean(),\n",
    "        'gravity_norm_std': clermont_valid['gravity_norm'].std(),\n",
    "    },\n",
    "    {\n",
    "        'dataset': 'us_greensboro Teltonika',\n",
    "        'hardware': 'Teltonika FMC880',\n",
    "        'country': 'US',\n",
    "        'n_trips': len(us_valid),\n",
    "        'roll_mean': us_valid['roll_deg'].mean() if len(us_valid) else np.nan,\n",
    "        'roll_std': us_valid['roll_deg'].std() if len(us_valid) else np.nan,\n",
    "        'pitch_mean': us_valid['pitch_deg'].mean() if len(us_valid) else np.nan,\n",
    "        'pitch_std': us_valid['pitch_deg'].std() if len(us_valid) else np.nan,\n",
    "        'gravity_norm_mean': us_valid['gravity_norm'].mean() if len(us_valid) else np.nan,\n",
    "        'gravity_norm_std': us_valid['gravity_norm'].std() if len(us_valid) else np.nan,\n",
    "    },\n",
    "])\n",
    "cross_summary.round(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Figure comparative\n",
    "\n",
    "Box-plot roll + gravity norm pour les deux datasets côte à côte."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.349669Z",
     "iopub.status.busy": "2026-04-16T15:20:05.349603Z",
     "iopub.status.idle": "2026-04-16T15:20:05.643408Z",
     "shell.execute_reply": "2026-04-16T15:20:05.643150Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAHqCAYAAAB/bWzAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADoi0lEQVR4nOzdd1gUVxcG8HcWWHrvKIIFe0Ox+9kFe4vRaGLBHjUWLNFYAGOPUSyxxShGY0ksJBrFjr0rscZYsERBsNHr7nx/kB1Zel+U9/c8PLp378ycuQs7O2fvnBFEURRBRERERERERERERCWCTNMBEBEREREREREREdF7TNoSERERERERERERlSBM2hIRERERERERERGVIEzaEhEREREREREREZUgTNoSERERERERERERlSBM2hIRERERERERERGVIEzaEhEREREREREREZUgTNoSERERERERERERlSBM2hIRERERERERERGVIEzaEhERERERERHRR+vGjRswMDDAypUrNR1KibB+/XoYGhri4sWLmg6FssGkLZVK/v7+EARB+tHW1kbZsmXh6emJ58+fq/VNTk6Gr68vnJ2doauri6pVq2b6Rn/79m2MHj0aTZo0gaGhIQRBQFBQUKbbHzZsGGrWrAkzMzPo6+ujcuXKmDJlCl69elUUu5uBj48PBEFQa2vVqhVatWpVLNsvqNWrV8Pf3z9PywQFBWX7mhAREfD555+jSpUqxXY8IiIiyi/VOZ2enh6ePHmS4flWrVqhZs2aGois+GV2fvcxcnZ2xuDBg6XHL168gI+PD4KDg7NdLjo6Gr1798ZXX32Fr776qmiD/AAEBwfDy8sLO3bsQKNGjTQdDmWDSVsq1TZt2oTz58/jyJEjGD58OLZv347//e9/iI2NlfqMHj0aCxYswJgxY3Do0CH07NkT48ePx/z589XWdeXKFQQEBMDCwgJt27bNdruxsbEYMWIEtm3bhj///BPDhg3D+vXr0bJlSyQlJRXJvn5M8pO0rVevHs6fP4969eoVTVBERMUsL19A5sbatWtx7NgxBAYGwsrKKs/LDx48GM7Oznla5vHjxxAEIc/v6YVBdYKr+pHL5ShfvjzGjx+Pd+/eqfWNiYnBhAkT4ODgAD09PdStWxc7duzIsM4zZ85g2LBhqF+/PnR1dSEIAh4/fpyhX2xsLD777DNUqVIF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pX379ggICMDMmTPRt29f2NnZYfTo0YiPj89wPC7Idjp06IDdu3dj9uzZatt58eJFljNl02vTpg02btyIRYsWoWvXrihTpgyGDx8OGxsbDB06NEN/U1NT9OzZE9u2bUOzZs1y9SWtgYEBNm7cCF9fX7i7uyM5ORne3t7w8fFB69atcenSJcybNw8TJkzA27dvYWlpierVq+d59nF+TJ8+HdWrV8fy5cuxfft2JCYmws7ODg0aNMCoUaMApJYfqlixIlavXo1nz55BEARUqFAB33//vVq+YcqUKYiKioK/vz+WLFmChg0b4tdff83x80Je4wGg8XGjdEQiojxwcnISO3furOkwCsWgQYNEQ0NDTYdBRJQvmzZtEgGIly9fzrZfdu91ycnJ4pIlS8Q6deqIenp6opGRkVi1alVx5MiR4v3799X6/vzzz2KDBg2kfq6uruKmTZvUtuPk5CQ93r9/v9ixY0exTJkyolwuF21sbMROnTqJp0+flvqEhISIANTWI4qiePr0abFNmzaioaGhqK+vLzZu3Fjct29frvb/xIkTIgDxxIkT2Y6Lt7e3CECMiIjItp8oimJ0dLQ4btw40c7OTpTL5WLt2rXF7du3Z+in2nZmPy1btpT6nT17VuzSpYvo4OAgyuVy0cDAQKxTp4747bffirGxsTnGI4qiOGDAALF69epqbbkZc1EUxe3bt4tVq1YVdXR0RACit7e39NyGDRtEFxcXUS6Xi5UrVxY3btyY4bXNSnafEW7evCl27dpVNDU1FeVyuVinTp0Mr3tmvw+q1zkkJESt76xZs0QrKysxISEhx7iIiKjgkpKSxOrVq4vt27fXdChEpYYgiqKoiWQxEX2YnJ2dUbNmzTzVMyqpBg8ejF27duW6FhAREVFJceXKFTRo0AAXLlwo1BINHwKFQoFKlSqhf//+mDdvnqbDISL6KA0dOhTt27eHvb09wsLCsHbtWpw8eRKHDx9Gu3btNB0eUanA8ghERERERB8YNzc39OnTB99+++1H8UVqXmzduhUxMTGYMmWKpkMhIvpoRUdHY/LkyYiIiICOjg7q1auHAwcOMGFLVIw405aIiIiI6AP077//4qeffoKXlxeMjY01HU6x2bRpE8qUKQN3d3dNh0JERERUZGSaDoCIiIiIiPKubNmy8Pb2LlUJWwDw9PRkwpayderUKXTt2hUO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O7527Njh6pTcxqlTp9SyZUu98sorhW6fPXu2XnzxRb3yyivasmWLatasqR49eig9Pb2SM3UfFxozSbrxxhudXnMrVqyoxAzdy7p16/Twww/ru+++U3x8vHJzc9WzZ0+dOnXKEcPrDCi5/fv3q02bNlqzZo1mz56tHTt2aNWqVerWrZsefvjhCnmO7OzsCukHAAB3wLkTAErAoNzatWtnhg8f7tTWpEkT88QTT7goI/c2efJk07JlS1encUmQZJYuXep4bLPZTM2aNc2zzz7raMvMzDQhISHm9ddfd0GG7uf8MTPGmCFDhphbbrnFJflcClJSUowks27dOmMMrzOgtHr37m1q1aplMjIyCmw7ceKEMabgZ9Pvv/9uBgwYYKpVq2ZCQ0NNv379TFJSkmN7/ufWjBkzTGRkpKlbt65JSkoyksyHH35orrvuOuPr62vatm1r9uzZY77//nvTpk0bExAQYHr16mVSUlIcfeXl5ZkpU6aYWrVqGW9vb9OyZUuzcuVKx/b8fj/55BPTtWtX4+fnZ6666iqzadMmY4wxa9euNZKcviZPnlyhYwgYY0x2drarUzDGXJzfG2w2m8nJyanQPoFLGedOoGJw7ry8MdO2nLKzs7V161b17NnTqb1nz57atGmTi7Jyf3v37lVUVJRiY2N1xx136Ndff3V1SpeEpKQkHTlyxOn15uPjoy5duvB6u4Cvv/5aERERatSokR544AGlpKS4OiW3kZqaKkkKDQ2VxOsMKI0///xTq1at0sMPP6yAgIAC2wu7LPL06dPq1q2bAgMDtX79em3cuFGBgYG68cYbnWYFffXVV9q9e7fi4+O1fPlyR/vkyZP11FNPadu2bfL09NSgQYP0+OOP66WXXtKGDRu0b98+TZo0yRH/0ksv6YUXXtDzzz+v7du3q1evXurXr5/27t3rlNfEiRM1btw4JSQkqFGjRho0aJByc3PVoUMHzZ07V8HBwY6rFcaNG1cBowd3EBMTo7lz5zq1tWrVSnFxcZLsy1rVqVNHPj4+ioqK0qhRo0rUb3Jysm666Sb5+fkpNjZW77//foHnslgsev3113XLLbcoICBA06ZNkyT95z//UZs2beTr66t69eppypQpys3NdeyXmpqqBx98UBEREQoODtb111+vn376ybE9Li5OrVq10qJFixQTE6OQkBDdcccdTleLfPzx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Gj16tGbMmKGlS5dq586dGjp0qPz9/TV48GDXJu5CxY1ZRkaGxo0bp2+//Vb79+/X119/rb59+6p69er6+9//7trEXeThhx/We++9p/fff19BQUE6cuSIjhw5ojNnzkgSrzOglF577TXl5eWpXbt2+uSTT7R3717t3r1bL7/8stq3b18g/s4771T16tV1yy23aMOGDUpKStK6dev06KOP6vfff6/w/MaPH69Zs2bpww8/1J49e/TEE08oISFBjz76aIn7iImJUUZGhr766isdO3ZMp0+frvA84Rrh4eFKTk52PE5LS3P6A8zPz0/9+vXTyy+/rK+//lrffvutduzYUWyfTZo0UW5urn788UdHW2JiYqGFmPNdffXV2rNnT4GiTIMGDWS1WnX11VfryJEj8vT0LLC9evXqJT5ui8Wijh07asqUKfrxxx/l7e2tpUuXOrb/9NNPjvOiJH333XcKDAxU7dq11aBBA3l7ezsVdHJycvTDDz8UW9Ap637A5YhzJy5lnDs5d1YWlkeoAAMHDtTx48c1depUJScnq3nz5lqxYoXq1q3r6tTc0u+//65Bgwbp2LFjCg8P19/+9jd99913jNdffvjhB3Xr1s3xeMyYMZKkIUOGaOHChXr88cd15swZjRgxQidOnNC1116rL774wukyhqqmuDGbP3++duzYoX//+986efKkIiMj1a1bN3344YdVdszmz58vSeratatT+4IFCzR06FBJ4nUGlEJsbKy2bdum6dOna+zYsUpOTlZ4eLjatGnjeL+dy9/fX+vXr9c///lP/eMf/1B6erpq1aqlG264QcHBwRWe36hRo5SWlqaxY8cqJSVFTZs21eeff66GDRuWuI8OHTpo+PDhjt95Jk+e7LhDMi5t119/vRYuXKi+ffvqiiuu0NNPPy0PDw9J0sKFC5WXl6drr71W/v7+WrRokfz8/C74O1uTJk3UvXt3Pfjgg5o/f768vLw0duxY+fn5XXBWzKRJk3TzzTcrOjpat99+u6xWq7Zv364dO3Zo2rRp6t69u9q3b6/+/ftr1qxZaty4sQ4fPqwVK1aof//+BS4ZLczmzZv11VdfqWfPnoqIiNDmzZt19OhRpz/+srOzdd999+mpp57Sb7/9psmTJ2vkyJGyWq0KCAjQ//t//0/jx49XaGio6tSpo9mzZ+v06dO67777inzesu4H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80pLS9Phw4cLfS3v3r3bqe3c12hkZKQkOb1Gz3fgwAF1795dTz31lMaNG+e0LSUlRcOHD1ejRo0UEhKikJAQZWRkOK0Je76Svn/Oz83T0/OC75+yrPN37meNJBljCrT5+fnJZrMxUx34y4XO0648RwMVraqdp1GQp6sTACrKSy+9pF9++UXNmzfX1KlTJUnh4eHav3+/JPvSAM8//7zq1aunatWqad26dQX6+Oqrr+Tr66u1a9dq//79GjZsmKpXr17k5QeF2bdvn5YtW6bly5frxIkTGjBggJ599llHH+PHj9fatWu1dOlS1axZU08++aS2bt3qVEAeNmyY9u/frw8++EBRUVFaunSpbrzxRu3YsUMNGzbU4sWLde2116pPnz7q27ev7r77bnXr1s2xblNh1q9fr0GDBjm1ZWRkqE+fPpo2bZp8fX317rvvqm/fvtqzZ4/q1KlT4mM+V0mOLzs7W88884waN26slJQUPfbYYxo6dKhWrFih6OhoffLJJ7r11lu1Z88eBQcHO/7gP3XqlMaMGaMWLVro1KlTmjRpkv7+978rISFBVqtVL7/8sj7//HP93//9n+rUqaODBw/q4MGDkux/CN10000KDQ3VihUrFBISojfeeEM33HCDfvnlFw0cOFA7d+7UqlWrHIXrkJAQffzxx5ozZ44++OADNWvWTEeOHHEUevO1a9dOs2fPLtN4Abj0BAQEOD0urNBizlkHtyhl2a969eo6ceJEodu8vLycHlssFqelWwIDA4vtu1OnTlq5cmWxMfn27dun/fv3q2/fvo62/Ofy9PTUnj17VL9+fUlyLNEQHh5eor5ReWw2m6ZMmaJ//OMfBbYVVdwsSkkKkOe+RvO3Fbe8UHh4uKKiovTBBx/ovvvuc1rWYOjQoTp69Kjmzp2runXrysfHR+3bty/2n+3Vq1fXjh07Ct1WXG4HDhxQ06ZNi+xXku666y69/vrrxcacm4eHh4eOHDni1J6SkqIaNWo4tf3555/y9/d3/C4EoHiuPEcDFa2qnadREEVbXDZCQkLk7e0tf3//Qu/UO3XqVPXo0aPYPry9vfXOO+/I399fzZo109SpUzV+/Hg988wzJV4H1mazaeHChQoKCpIk3X333frqq680ffp0ZWRk6O2339a///1vRy7vvvuuateu7dh/3759WrJkiX7//XdFRUVJsq+/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",
      "text/plain": [
       "<Figure size 1400x500 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1, 3, figsize=(14, 5))\n",
    "\n",
    "# === Left: roll per trip, both datasets ===\n",
    "ax = axes[0]\n",
    "if len(clermont_valid):\n",
    "    ax.scatter(range(len(clermont_valid)), clermont_valid['roll_deg'],\n",
    "               color='#0066CC', s=60, alpha=0.8, label=f\"Clermont ({len(clermont_valid)} trips)\")\n",
    "    ax.axhline(clermont_valid['roll_deg'].mean(), color='#0066CC', linestyle='--', alpha=0.5)\n",
    "if len(us_valid):\n",
    "    offset = len(clermont_valid)\n",
    "    ax.scatter(range(offset, offset + len(us_valid)), us_valid['roll_deg'],\n",
    "               color='#E87700', s=60, alpha=0.8, label=f\"us_greensboro ({len(us_valid)} trips)\")\n",
    "    ax.axhline(us_valid['roll_deg'].mean(), color='#E87700', linestyle='--', alpha=0.5)\n",
    "ax.set_xlabel('trip index (all datasets)')\n",
    "ax.set_ylabel('Roll (°)')\n",
    "ax.set_title('P013 roll per trip')\n",
    "ax.legend()\n",
    "ax.grid(True, alpha=0.3)\n",
    "\n",
    "# === Middle: roll std comparison ===\n",
    "ax = axes[1]\n",
    "datasets_lbl = []\n",
    "stds = []\n",
    "colors = []\n",
    "if len(clermont_valid):\n",
    "    datasets_lbl.append(f\"Clermont\\nproto (n={len(clermont_valid)})\")\n",
    "    stds.append(clermont_valid['roll_deg'].std())\n",
    "    colors.append('#0066CC')\n",
    "if len(us_valid):\n",
    "    datasets_lbl.append(f\"us_greensboro\\nTeltonika (n={len(us_valid)})\")\n",
    "    stds.append(us_valid['roll_deg'].std())\n",
    "    colors.append('#E87700')\n",
    "bars = ax.bar(datasets_lbl, stds, color=colors, alpha=0.85)\n",
    "ax.set_ylabel('Roll std (°)')\n",
    "ax.set_title('Précision P013 (std roll)')\n",
    "ax.grid(True, alpha=0.3, axis='y')\n",
    "for bar, v in zip(bars, stds):\n",
    "    ax.text(bar.get_x() + bar.get_width() / 2, v + 0.02, f'{v:.2f}°',\n",
    "            ha='center', va='bottom', fontsize=11, fontweight='bold')\n",
    "\n",
    "# === Right: gravity norm ===\n",
    "ax = axes[2]\n",
    "g_means = []\n",
    "g_stds = []\n",
    "g_lbls = []\n",
    "for d, name, col in [(clermont_valid, 'Clermont\\nproto', '#0066CC'),\n",
    "                     (us_valid, 'us_greensboro\\nTeltonika', '#E87700')]:\n",
    "    if len(d):\n",
    "        g_means.append(d['gravity_norm'].mean())\n",
    "        g_stds.append(d['gravity_norm'].std())\n",
    "        g_lbls.append(name)\n",
    "ax.bar(g_lbls, g_means, yerr=g_stds, color=['#0066CC', '#E87700'][:len(g_lbls)],\n",
    "       alpha=0.85, capsize=5)\n",
    "ax.axhline(9.80665, color='red', linestyle=':', label='g_std = 9.80665 m/s²')\n",
    "ax.set_ylabel('|g| mean (m/s²)')\n",
    "ax.set_title('Norme de gravité mesurée')\n",
    "ax.legend()\n",
    "ax.grid(True, alpha=0.3, axis='y')\n",
    "ax.set_ylim(9.6, 10.2)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.savefig('p013_cross_dataset_comparison.png', dpi=120, bbox_inches='tight')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. Sauvegarde résultats cross-dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-04-16T15:20:05.644775Z",
     "iopub.status.busy": "2026-04-16T15:20:05.644682Z",
     "iopub.status.idle": "2026-04-16T15:20:05.651010Z",
     "shell.execute_reply": "2026-04-16T15:20:05.650804Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "✓ p013_cross_dataset_per_trip.csv (24 rows)\n",
      "✓ p013_cross_dataset_summary.csv (2 rows)\n"
     ]
    }
   ],
   "source": [
    "all_trips = pd.concat([clermont_valid, us_valid], ignore_index=True)\n",
    "all_trips.to_csv('p013_cross_dataset_per_trip.csv', index=False)\n",
    "cross_summary.to_csv('p013_cross_dataset_summary.csv', index=False)\n",
    "print(f\"✓ p013_cross_dataset_per_trip.csv ({len(all_trips)} rows)\")\n",
    "print(f\"✓ p013_cross_dataset_summary.csv ({len(cross_summary)} rows)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusion\n",
    "\n",
    "**Les deux datasets montrent que la méthode P013 fonctionne sans gyroscope** :\n",
    "\n",
    "- Sur **Clermont** (prototype, 14 trips, 5h de livraison avec beaucoup d'arrêts), la précision std(roll) est sub-degré — c'est la mesure de référence qui fonde le paper.\n",
    "- Sur **us_greensboro** (premier matériel Teltonika FMC880 commercial, 6-8 trips post `daxos_v0.1`), la méthode produit des orientations cohérentes avec une norme de gravité à quelques mg près. La précision d'orientation est limitée par le faible nombre de samples stationnaires (les trips urbains courts d'us001 ne contiennent que ~11 samples ZUPT au total) — sub-degré attendu dès qu'Emmanuel fera un roulage 20-30 min avec arrêts normaux.\n",
    "\n",
    "**Le point critique pour le brief INPI/Erwan** : la méthode P013 n'est pas liée à un hardware spécifique. Elle transfère du prototype au commercial sans adaptation, à condition que le firmware laisse passer la gravité (ce qui est maintenant le cas sur us_greensboro depuis le push `daxos_v0.1`).\n",
    "\n",
    "---\n",
    "\n",
    "**Datasets consommés** (cf `requirements.yaml`) :\n",
    "- `fr_clermont_proto_2025-09` (role: `primary_validation`)\n",
    "- `us_greensboro_fmc880_2026-04` (role: `commercial_validation`, filter: `acc_period.frame = raw`)\n",
    "\n",
    "**Datasets planifiés** pour une 3e comparaison :\n",
    "- `at_aegis_zenodo_820576` (Graz, avec gyroscope) — bloqué sur l'adapter `telemachus adapt --source aegis` + l'implémentation de `estimate_rotation_with_gyro()` dans nostos (cf notebook P011)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4dbc3bd6",
   "metadata": {},
   "source": [
    "## §3.10 — Cross-mounting validation (run 2026-04-30)\n",
    "\n",
    "Trois boîtiers Teltonika FMC880 montés indépendamment par l'opérateur de flotte sur trois véhicules. P13 reconstruit la gravité avec un bias `|g|` < 1.5% sur les trois mountings (-179°/+91°/-168° en roll). Le mounting non-standard du device 864 (+91° roll, -58° pitch — boîtier posé sur le côté) donne en fait le meilleur bias |g| absolu (-0.80%), démontrant que P13 est insensible à l'orientation du boîtier dès lors qu'il est rigidement fixé."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4bd7dc8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json, pandas as pd\n",
    "from pathlib import Path\n",
    "data = json.loads(Path(\"../../../../../nostos/data/multi_device_p13_b12_strict.json\").read_text())\n",
    "df = pd.DataFrame(data)[[\"imei\",\"desc\",\"P13_roll\",\"P13_pitch\",\"P13_g\",\"clusters_n\",\"raw_pct_time\"]]\n",
    "df.columns = [\"IMEI\",\"Vehicle\",\"Roll (°)\",\"Pitch (°)\",\"|g| (m/s²)\",\"Clusters\",\"%raw\"]\n",
    "df"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
