第2章 数据采集与传感器标定
说实话,数据采集和标定这件事,看着基础,但坑特别多。我见过太多团队在回放闭环里折腾半天,最后发现是采集时传感器没对齐,或者标定参数差了几个像素——整个闭环验证直接白费。这一章,咱们就把相机、激光雷达、毫米波雷达、IMU/GNSS的采集规范和联合标定原理彻底聊透。
2.1 相机采集规范与标定
相机这东西,看着简单,但采集时稍不注意,后面的算法就得遭殃。我个人习惯,采集前一定先检查三件事:曝光是否锁定、白平衡是否固定、帧率是否稳定。你想想看,如果曝光在采集过程中来回跳,那回放出来的图像亮度一直在变,算法根本没法稳定工作。
相机内参标定,我推荐用棋盘格或AprilTag。别小看标定板平整度——我见过有人用打印纸贴在纸箱上,结果标定出来的畸变参数全是错的。标定板一定要贴在刚性平板上。
# 相机标定示例 (OpenCV)
import cv2
import numpy as np
# 准备棋盘格角点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
# 采集多张不同角度图像
img_points = []
obj_points = []
for img in images:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
img_points.append(corners2)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
print("内参矩阵:\n", mtx)
2.2 激光雷达采集与标定
激光雷达的数据采集,核心就一句话:保证点云不畸变。车在动,激光雷达也在转,如果车速快或者转弯急,一帧点云里就会出现运动畸变。我建议采集时尽量保持直线匀速,或者后期用IMU做去畸变。
- 采集规范: 激光雷达安装位置要避开遮挡,车顶是最常见的。注意反射率标定——不同物体反射强度不一样,这个对后续目标检测很重要。
- 联合标定: 激光雷达到相机的标定,我习惯用标定板上的反光特征。找一块带棋盘格的平板,激光雷达能看到板子的边缘,相机也能看到角点,然后做PnP求解。
2.3 毫米波雷达采集规范
毫米波雷达的数据稀疏,但速度信息特别准。采集时要注意多径干扰——隧道、护栏旁边容易出假目标。我个人习惯,采集时同时记录雷达的原始点云和目标列表,回放时可以根据需要选。
标定方面,毫米波雷达和相机/激光雷达的联合标定比较麻烦。因为雷达点太稀疏,很难找到特征点。我常用的方法是:用角反射器作为标定目标,雷达能看到强回波,相机也能拍到,然后手动关联。
2.4 IMU/GNSS 采集与时空基准
IMU和GNSS是闭环回放的“时间锚点”。没有精准的时间同步,后面所有传感器数据都是乱的。我建议用PTP(精确时间协议)或者GPS脉冲同步所有传感器。
| 传感器 | 时间同步方式 | 典型精度 |
|---|---|---|
| 相机 | PTP / 硬件触发 | < 1ms |
| 激光雷达 | GPS PPS + 时间戳 | < 1ms |
| 毫米波雷达 | CAN 时间戳 / PTP | < 2ms |
| IMU/GNSS | 自身授时 + PPS | < 0.1ms |
IMU的零偏和标度因子,我建议每次采集前做静态初始化。把车停稳,记录2分钟IMU数据,然后取平均算零偏。别小看这一步,它直接影响回放时位姿推算的精度。
① 基于标定物的联合优化(如棋盘格+反光板)
② 无目标自然场景标定(利用道路特征,但精度稍低)
③ 手眼标定法(针对机械臂/车辆运动)
我个人最推荐第一种,稳定可靠,就是标定过程繁琐点。
2.5 数据采集避坑清单
- 采集前检查所有传感器时间戳是否对齐——我吃过亏,回放时发现相机和激光雷达差了200ms,整个场景都是错位的。
- 标定板不要用反光材料,激光雷达打上去会过曝。
- IMU和GNSS天线安装位置要记录精确,回放时需要用到杆臂补偿。
- 每次采集任务开始和结束,都录一段标定板视频,方便后期校验。
嗯,这一章内容不少,但都是实打实的干货。数据采集和标定做扎实了,后面的回放闭环才能跑得顺。下一章咱们聊聊数据存储与格式,到时候我会分享一些关于数据压缩和索引的经验。