Files
calibration/docs/雷达-IMU标定.md
T

166 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 雷达–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)。