# LiDAR–IMU 外参标定

用连续行驶中的 LiDAR 与 IMU 相对运动，估计安装外参与时间偏置：

```text
p_IMU = T_IMU_lidar · p_lidar
```

**当前阶段：** 算法与合成自检已闭环；已提供 `tools/export_rscap_to_v1.py`（N300 `.rscap` + H32 dlog/MSOP → 中间格式）；**合格实车验收尚未完成**，故正式外参尚未对实车落盘交付。

---

## 先看什么（对外三份就够）


| 顺序  | 文档                                     | 用途                   |
| --- | -------------------------------------- | -------------------- |
| 1   | **本 README**                           | 做什么、怎么跑、结果怎么判        |
| 2   | [docs/V1_数据格式.md](docs/V1_数据格式.md)     | 中间格式 + 原始数据导出命令 |
| 3   | [docs/标定流程与采集清单.md](docs/标定流程与采集清单.md) | 现场怎么采（合格数据要求）        |


其余（方法细述、测试说明、源码职责、CHANGELOG）给深入阅读 / 改代码时用，见文末。

---



## 1. 输入 / 输出


| 输入        | 说明                                                          |
| --------- | ----------------------------------------------------------- |
| `imu.csv` | `t,gx,gy,gz,ax,ay,az`（秒；rad/s；m/s²）；`t` 用设备时间               |
| 雷达会话目录    | `frames_index.csv` + `frames/*.npz`（米制 XYZ）                 |
| 车辆 YAML   | 轴向与时间语义；外参真值可空（`config/vehicle_installation.template.yaml`） |



| 输出                 | 说明                     |
| ------------------ | ---------------------- |
| `T_IMU_lidar.json` | 外参                     |
| `time_offset.json` | `t_imu = t_lidar + δt` |
| `summary.json`     | 状态、残差、可观性              |


新车原始数据导出（H32 dlog/zip + HI13 rscap）：

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

---



## 2. 一键复现（合成，不需实车）

```powershell
cd <本仓库根目录>
python -m pip install -e ".[dev]"
python -m pip install -e ".[open3d]"   # 推荐
powershell -File tools\reproduce_synthetic.ps1
```

证明：链路可跑通，能收回已知 yaw / δt。  
不证明：实车安装精度、平移可交付。

产物在 `examples/synthetic_session/out/`（含 `summary.json` 与 `motion_pairs.json`）。叠点查看：

```powershell
# 优先读取 summary 同目录的 motion_pairs.json，按需加载点云（无需重算配准）
python tools\visualize_pair_3d.py `
  --lidar examples\synthetic_session\lidar `
  --summary examples\synthetic_session\out\summary.json `
  --pair-index 0
```

旧标定目录若缺少缓存，可只补导出运动对（不重求解外参）：

```powershell
python tools\export_motion_pairs_for_viz.py `
  --lidar path\to\lidar `
  --imu path\to\imu.csv `
  --summary path\to\out\summary.json
```

键 `1`–`4` 切换叠点模式；`N`/`P` 切换运动对。

---



## 3. 真实数据怎么跑

1. 按采集清单录制（设备时间；静止 + 低速转弯；有结构场景）
2. 导出中间格式（第1节命令）
3. 填写车辆 YAML 的轴向与时间语义
4. 标定：

```powershell
python -m imu_lidar.cli run `
  --vehicle-config config\vehicle_installation.template.yaml `
  --imu path\to\session_v1\imu.csv `
  --lidar path\to\session_v1\lidar `
  --output path\to\out `
  --mode rotation_only `
  --time-offset-search-s 2.0
```

1. 看 `summary.json`，再叠点 / 用验证会话复核后才交付


| 模式                  | 交付      | 成功标志                        |
| ------------------- | ------- | --------------------------- |
| `rotation_only`（先做） | 旋转 + δt | `rotation_only_accepted`    |
| `full_se3`（激励够再试）   | + 可观平移  | `full_se3_accepted`（否则平移拒绝） |



| `summary.json` 状态                              | 含义          |
| ---------------------------------------------- | ----------- |
| `rotation_only_accepted` / `full_se3_accepted` | 可进入验证       |
| `full_se3_rejected_due_to_observability`       | 旋转可用，平移不交   |
| `blocked`                                      | **不可作安装参数** |


预期量级：旋转约 0.5°–2°；水平平移数厘米～十几厘米；无坡时竖直常不可观。

---



## 4. 方法（一句话）

关键帧雷达配准得 **B**，同区间 IMU 预积分得 **A**，解 `R_A R_X ≈ R_X R_B`；再估 δt。可观时才在 `full_se3` 下交平移。

---



## 5. 试验边界（勿误读）


|        | 合成 pytest                | 旧车 S2 线下          |
| ------ | ------------------------ | ----------------- |
| 目的     | 回归算法                     | 验证旧主机时间数据上链路能跑完   |
| 期望     | `rotation_only_accepted` | `blocked`**（预期）** |
| 当安装参数？ | 否                        | **否**             |


细节：[tests/README.md](tests/README.md)。

---



## 6. 仓库结构与其余文档

```text
imu_lidar/   算法与 CLI
config/      车辆配置模板
docs/        采集清单、数据格式、方法细述
tools/       导出、合成复现、可视化
tests/       自动化测试
```


| 文档                                               | 何时看              |
| ------------------------------------------------ | ---------------- |
| [docs/IMU-LiDAR标定.md](docs/IMU-LiDAR标定.md)       | 要看方法约定与实现状态表     |
| [tests/README.md](tests/README.md)               | 要看合成用例 / S2 烟测记录 |
| [imu_lidar/文件职责说明.md](imu_lidar/文件职责说明.md)       | 要改源码             |
| [imu_lidar/CHANGELOG.md](imu_lidar/CHANGELOG.md) | 要查改动史            |


改算法请同步职责说明与 CHANGELOG；改对外用法请更新本 README。