diff --git a/README.md b/README.md index 95ff8cf..d9847b1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # 双天线RTK—3D LiDAR直接手眼标定 本仓库从静态站点原始数据复现 `T_RTK_lidar`:把原始雷达坐标转换到RTK导航坐标系。它**不是** `base_link` 车体外参,也不会在求解阶段使用车体航向偏置或RTK到后轮轴的XY杆臂。 +数据下载地址:https://fs.fairylandtech.com:5001/FRLD/#file_id=963272954246902180 账号:lichun.qu@fairylandtech.com 密码:lichun.qu ## 1. 输出坐标约定 diff --git a/ScreenCapture_2026-07-24-09-32-29.png b/ScreenCapture_2026-07-24-09-32-29.png new file mode 100644 index 0000000..47e339f Binary files /dev/null and b/ScreenCapture_2026-07-24-09-32-29.png differ diff --git a/ScreenCapture_2026-07-24-09-32-30.png b/ScreenCapture_2026-07-24-09-32-30.png new file mode 100644 index 0000000..47e339f Binary files /dev/null and b/ScreenCapture_2026-07-24-09-32-30.png differ diff --git a/T_body_lidar标定数据说明.txt b/T_body_lidar标定数据说明.txt new file mode 100644 index 0000000..0a30dfd --- /dev/null +++ b/T_body_lidar标定数据说明.txt @@ -0,0 +1,240 @@ +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 可视化方法。 + diff --git a/results/final_T_RTK_lidar.json b/results/final_T_RTK_lidar.json new file mode 100644 index 0000000..f81d27a --- /dev/null +++ b/results/final_T_RTK_lidar.json @@ -0,0 +1,45 @@ +{ + "convention": "T_RTK_lidar maps raw LiDAR points into the RTK navigation frame: p_RTK = T_RTK_lidar * p_lidar", + "translation_m": [ + 1.6381793500373911, + -0.24084479868828831, + 0.08448123595331278 + ], + "rotation_rpy_deg_xyz": [ + -0.8171674587248069, + 1.323288118779805, + -22.104163317857477 + ], + "quaternion_xyzw": [ + -0.004784711987091957, + 0.012700096588977744, + -0.19160273666049008, + 0.9813787267829084 + ], + "matrix_4x4": [ + [ + 0.926254197701683, + 0.37594816689521215, + 0.026760737062740007, + 1.6381793500373911 + ], + [ + -0.3761912321127582, + 0.926530995670823, + 0.004524482591229066, + -0.24084479868828831 + ], + [ + -0.02309368141930373, + -0.014257975640431828, + 0.9996316281556624, + 0.08448123595331278 + ], + [ + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] +}