# 从 LiDAR–IMU 平移困难到 RTK–IMU 工程外参

本文解释为什么仓库同时保留 LiDAR–IMU 与 RTK–IMU 两条链路、为什么本轮将天线–IMU 外参的工程验证重心转向 RTK–IMU，以及两条链路如何避免互相混淆。

## 决策结论

保留两条链路，不删除 LiDAR–IMU。LiDAR–IMU 仍然是雷达与 IMU 旋转/时间关系的有效工具，也记录了平移失败的具体证据；RTK–IMU 是针对“天线相位中心到 IMU 的杆臂”采用的独立观测模型。它们共享基础数学与 IMU 预积分，但不共享求解器或验收结论。

当前 RTK–IMU 结果应描述为：**机械测量锚定的杆臂，经 RTK+IMU 动态数据一致性验证的工程候选**。它不是 data-only 平移标定，也不是已正式 engineering 放行的结果。

## LiDAR–IMU 为什么暂时不能交平移

LiDAR–IMU 链路将相邻关键帧的点云配准相对运动，与同一区间 IMU 预积分运动做手眼/联合优化。当前实车数据中旋转和时间关系可得到稳定结果，但平移受两个独立问题限制：

1. **IMU 位移预积分不可靠。** 加速度积分对重力与加速度零偏敏感；当前 `Δp` 尤其 Z 分量会发散。已有证据显示点云相对旋转残差中位约 `0.16°`，而 IMU 位移增量模长常大于 `1 m`，说明这不是单纯旋转误差。
2. **运动激励不足。** 现有重点窗口以水平转弯为主，缺少连续坡道/俯仰激励，竖直杆臂弱可观。即使加入很强的平移先验，求解也可能只是先验回显，而非数据观测。

因此 LiDAR–IMU 的状态是：旋转与时间对齐可用，`full_se3`/平移不可作为安装参数交付。详细证据在 [LiDAR–IMU 现状与问题](20260808_LiDAR-IMU标定现状与问题.md) 和 [问题清单](问题清单.md)。

## 为什么 RTK–IMU 更适合验证天线杆臂

RTK 直接给出天线相位中心的 GNSS 位置与 Doppler 速度；双天线还给出 ANT1→ANT2 基线方向。对固定旋转 `R_WI` 和杆臂 `l_I = p_ANT1^I`，观测模型为：

```text
p_ANT1^W = p_IMU^W + R_WI * l_I
v_ANT1^W = v_IMU^W + R_WI * ((omega - b_g) × l_I)
```

转弯时的 `omega × l_I`、加减速和坡道中的姿态变化，都会直接增强杆臂可观性；这比把加速度二次积分当作唯一位移来源更适合做天线–IMU 一致性检查。

双天线基线本身只有 2DoF 方向信息，不能凭空构造完整三轴姿态。本项目采用：

1. R1b：以基线和 IMU 动态估计 ANT1→ANT2 在 IMU 中的 2DoF 方向。
2. R2V：以基线和高质量 Doppler velocity 做独立诊断。
3. R2G：在确认水平的静止场地，以基线 + 重力 + 地面水平先验补齐完整旋转。
4. R3：跨会话、block-out、协方差和可观性复核。

正式固定旋转来源是 `R2G_gravity_level_prior`；旧式 GNHPR 三轴姿态手眼只保留为诊断，不作为正式外参。

## RTK–IMU 平移如何求解和验证

每个 GNSS node 使用 15DoF 状态 `(R,p,v,bg,ba)`，相邻 node 由 covariance-whitened IMU preintegration 与 bias random-walk 连接。因子包括：

- BESTNAVA：天线相位中心 XYZ；
- GGA：仅在 BEST 缺失时约束 XY，不混用 MSL 高度到 ENU Z；
- Doppler：天线速度；
- HPR：可选基线/姿态观测，direct 与短 bridge 使用不同协方差；
- 静止段：gravity candidate 与 ZUPT 分离，禁止将匀速直线误作 ZUPT。

杆臂的判断流程不是“优化器有数值就算成功”：

1. 先用无机械先验的 free solve 评估 Schur 边缘化后的 3×3 杆臂信息、协方差、最弱方向和多初值稳定性。
2. 若完整 XYZ 不可观，冻结 free 结果为诊断基线，不继续无限增加非线性 free solve。
3. 以机械测量作为绝对杆臂来源，比较 fixed-mechanical、soft-prior 与 free 的代价和物理残差。
4. 在 circle、left-right、slope 高动态窗口，以及与标定窗口不重叠的 held-out 数据上固定杆臂验证。
5. 做旋转扰动敏感性、独立 innovation 与 propagation root-cause audit；这些审计不重新优化杆臂。

## 本次结果应如何理解

- 当前固定工程候选：`l_I = [-0.4518015159, -0.2644749820, 0.7314656115] m`。
- 机械测量决定杆臂绝对值；RTK+IMU 动态数据用于独立一致性和稳定性验证。
- 47 个非重叠标定窗口表明机械先验与数据拟合相容，但没有足够的数据驱动信息去有意义地细化机械值。
- held-out 物理验证和旋转敏感性通过；杆臂敏感的高动态数据没有发现机械外参明显冲突。
- 低速、低角速度独立传播仍有约 `0.20 m/s²` 的公共加速度偏差；这更像 propagation nuisance，而不是由 `omega × l` 消失后的杆臂错误造成。该问题尚未关闭，故 `engineering_translation_accepted=false`。

这解释了两个同时成立的事实：机械外参没有被动态数据否定，但整个传播模型尚未达到正式放行标准。机器可读结果见 [工程 release 决策](../artifacts/rtk_imu_calibration_v3/engineering_release_decision.json)。

## 代码边界和共享模块

```text
imu_lidar/
  lidar_io.py, lidar_deskew.py, registration.py, keyframes.py
  motion_pairs.py, phase_a.py, pipeline.py, joint_optimizer.py
  -> LiDAR–IMU 专用

rtk_imu/
  rtk_io.py, rtk_attitude.py, rtk_imu_rotation.py
  rtk_imu_multisource.py, rtk_imu_engineering.py, rtk_imu_node_graph.py
  -> RTK–IMU 专用

imu_lidar/contracts.py, geometry.py, geodesy.py, imu_io.py,
imu_preintegration.py, rotation_handeye.py
  -> 两条链路可复用的基础能力
```

RTK–IMU 只能 import 这 6 个共享模块，不应 import LiDAR 专用求解文件。命令入口都在 `tools/`，并按 `run_rtk_imu_*`、`audit_rtk_imu_*` 与 LiDAR 工具名称区分。

## 进一步工作

在宣称正式工程放行前，应优先关闭低速传播公共加速度偏差：区分图优化 nuisance accel bias 与可迁移物理 bias，复核静态 bias、重力泄漏和短时传播。不要用调机械先验、调 covariance 或扩大 free solve 来掩盖该问题。

RTK–IMU 的完整工程流程、当前变换和复现命令见 [README_RTK_IMU.md](../README_RTK_IMU.md)。
