合并并完善双链路标定文档

This commit is contained in:
lichun.qu
2026-08-25 15:37:35 +08:00
parent 8358b3f933
commit d1fa69c89b
19 changed files with 462 additions and 1948 deletions
+166
View File
@@ -0,0 +1,166 @@
# 雷达–IMU 标定
本文是本仓库雷达–IMU 标定的唯一规范说明,覆盖目标、数据格式、运行方式、当前实车结果和采集要求。
## 目标与当前结论
目标是求雷达坐标系到 IMU 坐标系的安装关系:
```text
p_IMU = T_IMU_lidar · p_lidar
```
`T_A_B` 表示把 B 坐标系中的点变换到 A 坐标系。流程利用连续行驶中的相对运动,而不是把 IMU 加速度二次积分的长时间轨迹当作绝对真值。
当前 2026-08-08 实车数据的结论是:**旋转和主机桥接后的时间关系可作为候选冻结;完整平移不可交付。** 不应把旋转结果和零平移拼成看似完整的 4×4 外参,更不能把当前 IMU 位移预积分用于正式平移标定。
| 项目 | 当前状态 |
| --- | --- |
| 连续运动雷达–IMU 流程 | 已实现并有合成测试 |
| 实车旋转候选 | 三个窗口一致,可用于进一步验证 |
| 实车时间关系 | 主机桥接后冻结为 `0 s`,不再自由精修 |
| 实车完整平移 | 不可观且受预积分位移误差影响,拒绝交付 |
## 方法概览
```text
设备时间与惯性质量检查
→ 估计或确认两传感器时间关系
→ 雷达关键帧配准得到相对运动
→ 同一时间区间的 IMU 预积分得到相对运动
→ 先求旋转手眼关系
→ 只有平移可观时才进入完整六自由度优化
```
对关键帧区间 `[i, j]`
```text
A_ij ≈ IMU 预积分相对运动
B_ij ≈ 雷达点云配准相对运动
A_ij · X ≈ X · B_ij
X = T_IMU_lidar
```
旋转子问题为 `R_A · R_X = R_X · R_B`。旋转通常比平移稳定:加速度偏置和重力方向的微小误差会在位移积分中快速累积,平面转弯又难以提供竖直杆臂信息。因此,完整六自由度只有在残差、跨会话一致性和可观性同时通过时才允许输出。
## 当前实车结果与限制
当前可用的三段优先窗口均在主机时间桥接后固定 `time_offset_s=0`,并禁用自由的有符号时间精修:
| 会话窗口 | roll / pitch / yaw(°) | 手眼旋转 RMS(°) |
| --- | --- | ---: |
| `priority_174005_174515` | `-0.398 / 0.108 / 89.998` | 0.625 |
| `priority_174905_175450` | `-0.316 / -0.352 / 90.002` | 0.293 |
| `priority_175910_180530` | `-0.373 / -0.036 / 90.005` | 0.786 |
三段旋转相互差约为 `0.15°–0.47°`。但以下问题阻止平移放行:
1. IMU 预积分的位移,尤其竖直分量,会出现米级甚至更大的漂移;它不能作为可靠平移观测。
2. 当前重点会话以平面转弯为主,缺少持续坡道或俯仰激励,竖直平移弱可观。
3. 允许时间偏移自由精修时,时间与旋转曾发生相互补偿,产生跨窗口矛盾的航向。因此桥接后的偏移固定为零,而不是再次为降低残差调整它。
4. 单一窗口残差小不等于外参正确;必须检查跨窗口一致性与点云叠加。
这也是仓库增加 RTK–IMU 流程的原因:不是替代雷达旋转标定,而是为天线相位中心到 IMU 的平移提供更直接的 GNSS 位置和速度观测。两条流程边界见仓库 [README](../README.md)。
## 输入、输出与配置
### 输入
```text
imu.csv
t,gx,gy,gz,ax,ay,az
单位:秒、rad/s、m/s²;t 应为设备时间
lidar_session/
frames_index.csv 帧编号、文件名、开始/结束时间
frames/frame_XXXXX.npz 米制 XYZ 点云
vehicle_installation.yaml
坐标轴、时间语义、可选机械安装信息
```
原始 HI13 IMU `.rscap` 和 H32 雷达 dlog/MSOP 可转换为上述格式:
```powershell
python tools\export_rscap_to_v1.py `
--imu-rscap path\to\hi13-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
```
### 输出
| 文件 | 含义 |
| --- | --- |
| `T_IMU_lidar.json` | 通过验收时的外参;仅旋转模式下不能把其中平移当交付值 |
| `time_offset.json` | 定义为 `t_imu = t_lidar + δt` 的时间关系 |
| `summary.json` | 状态、残差、可观性和拒绝原因 |
| `motion_pairs.json` | 用于复核和点云可视化的相对运动对 |
## 运行与判读
安装依赖:
```powershell
python -m pip install -e ".[dev]"
python -m pip install -e ".[open3d]" # 点云处理需要时安装
```
先运行仅旋转模式:
```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
```
| `summary.json` 状态 | 含义 |
| --- | --- |
| `rotation_only_accepted` | 旋转与时间关系可进入独立验证;不代表平移可用 |
| `full_se3_accepted` | 仅当完整平移可观且门禁通过时,才可交付完整外参 |
| `full_se3_rejected_due_to_observability` | 旋转可用,平移拒绝 |
| `blocked` | 时间、质量或模型门禁失败,不能作安装参数 |
合成复现可验证软件链路,不证明实车精度:
```powershell
powershell -File tools\reproduce_synthetic.ps1
python -m pytest -q
```
## 采集要求
单次有效会话建议:
```text
静止 20–30 s → 连续低速多方向转弯 3–8 min → 静止 1020 s
```
- 必须保留雷达和 IMU 的设备时间戳;不能仅依赖主机接收时间。
- 在结构化环境采集,保证点云配准具有稳定几何约束。
- 旋转标定优先包含左右圆或“8”字;直线加减速有助于时间和水平平移。
- 若要尝试完整平移,增加连续缓坡、俯仰或其他竖直激励;仅平面运动通常不足。
- 标定全过程不得改变两传感器安装关系。
## 代码结构
`imu_lidar/` 是雷达–IMU 专用实现:
| 组件 | 作用 |
| --- | --- |
| `cli.py``pipeline.py` | 命令行入口与流程编排 |
| `lidar_io.py``registration.py``keyframes.py` | 点云读取、配准和关键帧 |
| `timestamp_audit.py``imu_audit.py``time_offset.py` | 时间和 IMU 质量检查、时间关系估计 |
| `imu_preintegration.py``motion_pairs.py` | IMU 预积分与相对运动对 |
| `rotation_handeye.py``joint_optimizer.py``observability.py` | 旋转求解、联合优化和可观性门禁 |
| `finalize.py` | 结果写出 |
历史改动见 [imu_lidar/CHANGELOG.md](../imu_lidar/CHANGELOG.md),自动化测试说明见 [tests/README.md](../tests/README.md)。