# V1 标准中间数据格式

**用途：** 标定程序读入的 CSV/NPZ 约定，以及新车原始数据如何导出。总览见根目录 [README](../README.md)。

## 从原始数据导出

**推荐（新 H32 + HI13）：** HI13 `.rscap` + 雷达 Medulla dlog / recovered zip（raw MSOP + DIFOP）。

```powershell
python tools\export_rscap_to_v1.py `
  --imu-rscap path\to\hi13r4-imu.rscap `
  --imu-kind hi13 `
  --lidar-dlog path\to\session_or_dlog_or_recovered.zip `
  --host-start 2026-08-08T17:40:05 `
  --host-end 2026-08-08T17:45:15 `
  --out path\to\session_v1 `
  --frame-stride 5 `
  --require-difop
```

`--lidar-dlog` 可为：标准 `dobject/`+`dobject_recording/` 目录，或 recovered zip（`indices.log` + `data.bin`）。  
`--imu-kind`：`hi13` / `n300` / `auto`（默认按文件名推断）。  
`--host-start/end`：按本地墙钟切窗（仅裁剪；标定主轴仍是设备时间）。  
默认 DObject：`frontlidar-msop-raw`、`frontlidar-difop-raw`。

**兼容旧 MSOP-only `.rscap`：**

```powershell
python tools\export_rscap_to_v1.py `
  --imu-rscap path\to\n300.rscap `
  --lidar-rscap path\to\h32_msop.rscap `
  --out path\to\session_v1 `
  --frame-stride 1
```

产出：`imu.csv`、`lidar/`（含 `frames_index.csv`）、`export_summary.json`。  
标定主轴仍是**设备时间**；同时写出**主机 UTC 接收时间**，用于把雷达帧桥接到 IMU 设备钟（禁止把两边设备时间第一帧强行重合）。

## IMU

文件：`imu.csv` 或 `imu.npz`

### CSV

```text
t,gx,gy,gz,ax,ay,az,t_host_utc_s,receive_utc_ticks
0.000000000,0.01,-0.02,0.00,0.05,-0.03,9.81,1754646005.123,6389...
...
```

| 列 | 含义 | 单位 |
|---|---|---|
| t | IMU 设备时钟时间 | s |
| gx,gy,gz | 角速度 | rad/s |
| ax,ay,az | 比力/加速度 | m/s² |
| t_host_utc_s | 主机 UTC 接收时间（Unix） | s |
| receive_utc_ticks | 同上，.NET UTC ticks | — |

### NPZ

数组：`t (N,)`, `gyro (N,3)`, `acc (N,3)`，含义同上。

> IMU 与 LiDAR 的时间原点可以不同。流水线会估计常值偏置：`t_imu = t_lidar + delta_t`。

## LiDAR

目录结构：

```text
lidar_session/
├── frames_index.csv
└── frames/
    ├── frame_00000.npz
    ├── frame_00001.npz
    └── ...
```

### frames_index.csv

```text
frame_id,filename,t_start,t_end,host_receive_utc_ticks,t_host_utc_s,host_receive_utc_end_ticks,t_host_utc_end_s
0,frames/frame_00000.npz,10.000,10.100,6389...,1754646005.12,6389...,1754646005.22
```

| 列 | 含义 |
|---|---|
| t_start / t_end | H32 MSOP **设备时间**（秒） |
| t_host_utc_s / t_host_utc_end_s | 帧首/末包 **HostReceiveUtcTicks** → Unix 秒 |

也兼容旧列名 `file`。对齐脚本用主机 UTC 把 `t_*` 重写到 IMU 设备钟后再跑标定。

### 每帧 NPZ

- `points`: `float64/float32`，形状 `(N, 3)`，LiDAR 直角坐标系，单位米

## 时间不同步能不能用？

可以，前提是：

1. 两边都覆盖同一段**有角速度激励**的物理运动（尤其是转弯）；
2. 偏置近似为**常数**（短会话）；
3. `--time-offset-search-s` 足够覆盖可能的偏移（默认 ±1 s，可加大）。

若两段数据完全不是同一趟行驶，或只有静止 IMU、没有重叠运动，则无法估 δt，标定会被 `blocked`。

## 最小可用会话

- IMU：建议含静止段 + 运动段，采样率稳定
- LiDAR：建议 ≥ 20 帧，场景有墙/柱等结构，含转弯
