LiDAR、双天线 RTK、IMU 标定数据说明
====================================

文档日期：2026-07-23
配套代码仓库：calibration
标定目标：求解 3D LiDAR 到后轮轴中心车体系的外参 T_body_lidar。


一、重要说明
------------

1. 三批数据的记录格式和用途并不完全相同。export 是每站多帧的完整解码数据，prepared 是从中每站选一帧并配好 RTK 车体位姿后的标定输入。
2. 第一批（data1）、第二批(data2)目前上传的是已经从原始 dlog 数据以及导出的 NPZ 数据。
3. data4 保留了完整逐站 LiDAR dlog 和独立 RTK/IMU rscap，可以从原始记录开始复现。
4. 每一个站点采集 LiDAR 点云时车辆均静止，因此当前 LiDAR-RTK 标定没有使用 IMU进行点云运动畸变校正。
5. data4 中的 IMU 数据保持在 IMU 原始传感器坐标系；当前流程只解析、关联和保存 IMU，没有求解 IMU 外参。
6. 不要修改站点目录名称、prepared 中 station_*.npz 的顺序或 manifest。B 文件中的运动对索引依赖这些顺序。


二、目录结构
----------------------

LiDAR_RTK_calibration_data/
  数据说明.txt
  data1/
     raw/
    export/
    prepared/   
  data2/
      raw/
    export/
    prepared/
  data4/
    raw/
      RTKIMUraw/
    prepared/              
    combined/(三传感器混合后的数据，data1、2没有IMU的数据。)      
说明：

- data1/export 和 data2/export 是从逐站 dlog 导出的数据。raw 是完整原始数据。
- data1/prepared 和 data2/prepared 是每站选择一帧并重建 RTK 车体位姿后的标定输入。
- data4/raw 是完整原始数据，能够重新生成 export、parsed、combined 和 prepared。
它们可以由 raw 重新生成。


三、第一批数据（data1）
-----------------------

1. 数据范围

- 静止站点数量：38 站。
- 站点编号：01～38。
- 传感器：3D LiDAR + 双天线 RTK。
- 不包含 IMU。
- 记录格式：旧式逐站 dlog 中同时记录 LiDAR 和 GPS-POST-Z；当前云盘包从已导出的 NPZ 开始。

2. RTK 特点

- 实际 RTK 记录约 10 秒一条，并非预期的 10 Hz。
- 每站有效 RTK 样本较少，部分站点约 1～11 个有效样本。
- 因车辆在每站静止，仍可对站内 RTK 样本做均值并构造站点位姿；但时间同步精度和航向统计能力弱于第二批。

3. 当前用途

- 第一批只作为辅助复核数据。
- 不作为当前部署外参的主要求解数据。
- 不应把第一批写成严格独立的“验证集”，因为 RTK 过于稀疏，且它和第二批的场景、采集流程相近。

4. 上传内容

data1/export/

- 当前文件数约 803。
- 当前大小约 0.088 GB（约 90 MB）。
- 含逐站导出的 LiDAR NPZ、RTK sidecar、manifest 和质量报告。

data1/prepared/

- 当前文件数约 118。
- 当前大小约 0.049 GB（约 50 MB）。
- 核心内容包括：
  frames_all/station_*.npz
  body_poses_rear_gga_raw_rear_to_front.csv
  station_summary.csv
  manifest.json


四、第二批数据（data2）
-----------------------

1. 数据范围

- 静止站点数量：38 站。
- 原始站点编号：39～76。
- prepared 中重新顺序编号为 station_01～station_38。
- 传感器：3D LiDAR + 双天线 RTK。
- 不包含 IMU。
- 记录格式与第一批相同，但 RTK 采样正常且明显更密集。

2. RTK 特点

- 每站约有 125～412 个有效 RTK 样本。
- 已使用 fix 4/fix 5 和有效 heading 进行筛选。
- 站内 heading 圆标准差上限使用 0.5°，本批 38 站均通过。

3. 当前用途

- 第二批是当前部署外参的主要求解数据。
- 使用 small_gicp 和 Open3D GICP 分别求 B，再做与 X 无关的质量筛选和跨后端一致性筛选。
- 当前部署外参主要由第二批求得，第一批仅辅助复核。

4. 上传内容
data2/export/

- 当前文件数约 759。
- 当前大小约 0.127 GB（约 130 MB）。
- 含逐站导出的 LiDAR NPZ、RTK 信息、manifest 和质量报告。

data2/prepared/

- 当前文件数约 82。
- 当前大小约 0.033 GB（约 34 MB）。
- 核心内容包括：
  frames_all/station_*.npz
  body_poses_rear_gga_raw_rear_to_front.csv
  station_summary.csv
  manifest.json


五、data4 数据
--------------

1. 数据范围

- 静止站点数量：34 站。
- 站点编号：001～034。
- 传感器：3D LiDAR + 双天线 RTK + IMU。
- LiDAR 位于每个站点自己的原始 dlog 中。
- RTK 和 IMU 位于独立 rscap 文件中，存放在 RTKIMUraw 目录。
- 原始目录共约 152 个文件，大小约 12.488 GB。

2. RTK/IMU 原始记录

- RTKIMUraw 中当前包含 3 个 RTK rscap 和 3 个 IMU rscap。
- 本次 34 站标定使用 20260723-051627 开始的长时间 RTK/IMU session。
- 该 session 的 capture 审计结果：
  RTK：54256 个记录块，missing_chunks=0，bad_record_crc=0，干净关闭，footer CRC 有效。
  IMU：26719 个记录块，missing_chunks=0，bad_record_crc=0，干净关闭，footer CRC 有效。

3. 时间关联与导出结果

处理顺序为：

统一时间轴
  -> 分别解析 LiDAR、RTK、IMU
  -> 按每个 LiDAR 帧关联最近有效 RTK
  -> 保存 LiDAR 帧前后各 100 ms 的 IMU 窗口
  -> 导出 combined NPZ
  -> 每站选择一个静止帧生成 prepared

当前关联统计：

- LiDAR 帧总数：11678。
- 34 个站点全部有数据。
- rtk_valid：11678。
- heading_valid：11678。
- fixed RTK：11678。
- IMU 窗口非空：11678。
- RTK 最大允许关联时间差：150 ms。
- IMU 窗口：LiDAR 时刻前后各 100 ms。

时间基础：LiDAR 和串口 host UTC 用于当前关联；RTK GNSS 时间和 IMU 设备时间同时保留，供后续进一步建立精确时钟模型。

4. 当前用途

- data4 用于独立重新求解一套外参，并与历史第二批结果做跨批比较。
- data4 中 IMU 没有参与当前 LiDAR-RTK 外参求解。
- data4 结果与历史部署外参相差约 1.592 cm / 0.234°，但 data4 自身 AX 残差更高，因此当前仍保留历史第二批结果作为部署值。

如果已经上传 data4/raw，则 export、combined 和 parsed 均可以用代码重新生成。为了节省云盘空间，可只额外上传 prepared 和 calibration。


六、三批数据差异汇总
--------------------

第一批：
- 38 站，旧式 LiDAR+RTK dlog，无 IMU。
- RTK 极稀疏，约 10 秒一条。
- 当前上传从 export 开始。
- 只用于辅助复核。

第二批：
- 38 站，旧式 LiDAR+RTK dlog，无 IMU。
- RTK 密集、航向稳定。
- 当前上传从 export 开始。
- 用于当前部署外参的主要求解。

data4：
- 34 站，逐站 LiDAR dlog + 独立 RTK/IMU rscap。
- 保存完整原始数据，可从 raw 开始复现。
- 用于独立重算和跨批比较。
- IMU 只保存和关联，尚未完成 IMU 外参标定。


七、标定坐标与主要参数
----------------------

- 外参定义：T_body_lidar，将 LiDAR 原始点变换到后轮轴中心车体系。
- 车体系：x 向前，y 向左，z 向上。
- 手眼方程：A_ij X = X B_ij。
- A_ij：由 RTK 后轮轴中心位置和双天线 heading 构造；当前为 yaw-only 姿态。
- B_ij：由两个静止站点的原始 LiDAR 点云通过 GICP 求得。
- heading_offset_deg：21.226°（本车安装参数，不是通用常数）。
- 后天线在车体系杆臂：[ -0.320, -0.365, 0.620 ] m。（手量）
- 后轮轴中心离地高度：0.2335 m，用于地面约束；不是 LiDAR 离地高度。


八、数据使用注意事项
--------------------

1. data1、2 的manifest 中可能仍保留旧脚本生成的 train/validation 字段。这些字段是历史元数据；当前严谨流程将第二批用于求解、第一批用于辅助复核，不把同一批内部的小样本划分描述为高可信度验证集。
2. 不要使用已经变换到车体系的点云求 B，必须使用 NPZ 中的 points_raw。
3. 可视化时，frames_all 必须与生成 B 文件时的站点数量和顺序完全一致。
4. 模式 3（GICP B）本身已经错位时，应优先检查点云配准和场景退化；只有模式 3 正常而模式 4（X^-1 A X）系统性错位时，才优先检查 RTK A、坐标约定或外参 X。
5. 当前结果是工程标定结果，不是由全站仪或高精度标靶认证的绝对真值。


九、配套代码位置
----------------

本机代码仓库：
calibration

根 README.md 包含：
- 从原始数据/导出数据开始的完整复现流程；
- code、tools、run 中每个主要文件的职责；
- small_gicp、Open3D GICP、consensus B 的处理逻辑；
- AX=XB 与地面约束求 X 的方式；
- 残差、Hessian/条件数、bootstrap、跨批检查和 3D 可视化方法。

