计算机视觉(10)-杂糅(自动驾驶中的多传感器素材融合)
自动驾驶中的多传感器数据融合
一、理论篇
常用传感器硬件介绍
1.1 Camera 介绍
- a) 工作原理:
通过镜头接收光线,CMOS/CCD 感光元件将光信号转换为电信号,经 ISP 处理生成 RGB 图像。
关键参数:焦距 (f)、视场角 (FOV)、分辨率 (e.g., 1920×1080)、帧率 (e.g., 30 FPS)。 - b) 自动驾驶中的应用:
车道线检测、交通标志识别、目标检测 (YOLO/SSD)、语义分割 (DeepLab)。
- a) 工作原理:
1.2 Lidar 介绍
- a) 工作原理:
发射激光脉冲,测量反射时间 (ToF) 计算距离。点云公式:
d=c⋅Δt2(c=光速)d = \frac{c \cdot \Delta t}{2} \quad (c = \text{光速})d=2c⋅Δt(c=光速) - b) 分类:
- 机械式 (e.g., Velodyne HDL-64E):360° 旋转扫描
- 固态 (e.g., Ouster OS1):MEMS 微振镜
- Flash Lidar (e.g., Continental HFL110):单次泛光成像
- c) 应用:
高精度 3D 环境建模 (PointPillars)、SLAM。
- a) 工作原理:
1.3 Radar 介绍
- a) 工作原理:
发射毫米波 (77 GHz),利用多普勒效应测速:
v=fd⋅c2f0(fd=频移)v = \frac{f_d \cdot c}{2f_0} \quad (f_d = \text{频移})v=2f0fd⋅c(fd=频移) - b) 应用:
自适应巡航 (ACC)、盲点监测 (BSD),抗雨雾干扰。
- a) 工作原理:
1.4 IMU 介绍
- a) 工作原理:
加速度计测量线性加速度,陀螺仪测量角速度。姿态解算 (四元数更新):
qt+1=qt⊗exp(12ωΔt)\mathbf{q}_{t+1} = \mathbf{q}_t \otimes \exp\left(\frac{1}{2}\boldsymbol{\omega}\Delta t\right)qt+1=qt⊗exp(21ωΔt) - b) 应用:
车辆位姿估计、传感器运动补偿。
- a) 工作原理:
1.5 GNSS 与 RTK 介绍
- a) GNSS 与 GPS:
GPS (美国) + GLONASS (俄) + Galileo (欧) + 北斗 (中),定位误差约 1–5 m。 - b) RTK:
基准站校正移动站信号,精度提升至厘米级。 - c) 应用:
高精度定位 (结合 IMU 滤波)。
- a) GNSS 与 GPS:
1.6 其它传感器
- a) 超声波雷达:
短距检测 (0.1–5 m),泊车辅助。 - b) 红外传感器:
夜视系统。
- a) 超声波雷达:
多传感器同步理论
- 2.1 时间硬同步
- a) 传感器频率:
统一时钟源 (e.g., PTP 协议),相机 30 Hz、Lidar 10 Hz、IMU 100 Hz。 - b) 硬件触发:
使用 GPIO 触发信号同步采集。
- a) 传感器频率:
- 2.2 时间软同步
- a) 时间索引:
为数据打时间戳 (e.g., ROSHeader.stamp)。 - b) 时间插值:
线性插值 IMU 数据对齐图像时间戳。
- a) 时间索引:
- 2.3 空间同步
- a) 运动补偿:
利用 IMU 数据校正运动畸变 (Lidar 点云)。 - b) 传感器标定:
- 内参标定:相机焦距 fx,fyf_x, f_yfx,fy、畸变系数 k1,k2k_1, k_2k1,k2
- 外参标定:求变换矩阵 Tlidarcamera∈R4×4T_{\text{lidar}}^{\text{camera}} \in \mathbb{R}^{4\times4}Tlidarcamera∈R4×4
- a) 运动补偿:
- 2.1 时间硬同步
多传感器信息融合理论
- 3.1 传感器融合基本原理
- a) 传统方法:
卡尔曼滤波 (KF)、扩展卡尔曼滤波 (EKF)、粒子滤波 (PF)。 - b) 深度学习方法:
BEVFormer (Bird’s Eye View 融合)、TransFuser (多模态 Transformer)。
- a) 传统方法:
- 3.2 融合体系架构
- a) 集中式:
原始数据直接融合 (e.g., 原始点云 + 像素)。 - b) 分布式:
各传感器独立处理,融合结果 (e.g., 目标级融合)。 - c) 混合式:
分层融合 (e.g., 特征级 + 决策级)。
- a) 集中式:
- 3.3 融合级别分类
- a) 数据级融合:
直接合并原始数据 (e.g., 点云投影到图像)。 - b) 特征级融合:
提取特征后融合 (e.g., CNN 特征拼接)。 - c) 目标级融合:
融合检测结果 (e.g., 加权框融合)。
- a) 数据级融合:
- 3.1 传感器融合基本原理
二、实战篇
传感器同步实战
- 1.1 多相机同步
使用硬件触发信号同步曝光 (e.g., Arduino 生成 PWM 触发脉冲)。 - 1.2 相机与 IMU 同步
Kalibr 工具标定时间偏移 δt\delta tδt 和空间变换。 - 1.3 相机与 Lidar 同步
- a) 时间同步:
插值对齐时间戳:from scipy.interpolate import interp1d lidar_times = [0.1, 0.2, 0.3] # Lidar 时间戳 lidar_data = [...] # 点云数据 camera_time = 0.25 # 相机时间戳 interp_func = interp1d(lidar_times, lidar_data, axis=0) synced_data = interp_func(camera_time) - b) 空间同步:
使用标定板计算外参矩阵:# OpenCV 相机标定 ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(...) # 点云到图像的投影 points_cam = T_lidar_to_cam @ lidar_points pixels = K @ points_cam[:3, :] / points_cam[2, :]
- a) 时间同步:
- 1.4 Lidar 与 IMU 同步
运动补偿代码:for point in point_cloud: dt = point.time - scan_start_time # 点相对时间 rotation = imu.get_rotation(dt) # IMU 插值旋转 point = rotation.apply(point) - 1.5 相机与 Radar 同步
坐标转换:Radar 极坐标 → 笛卡尔坐标 → 相机坐标系。
- 1.1 多相机同步
传感器信息融合实战
- 2.1 多相机融合
立体匹配生成深度图 (SGM 算法)。 - 2.2 相机 + IMU 融合
VIO 算法 (e.g., VINS-Fusion):// VINS-Fusion 关键流程 processImage(ImageData img) { if (first_image) initFrame(...); else trackFeature(...); processIMU(imu_data); // 预积分 optimizePose(); // 滑动窗口优化 } - 2.3 相机 + Lidar 融合
代码示例:点云投影到图像并融合检测结果def fuse_camera_lidar(img, point_cloud, calib): # 投影点云到图像 pixels = calib.project_lidar_to_image(point_cloud) # 过滤图像外点 mask = (pixels[:,0] >= 0) & (pixels[:,0] < img_w) & ... pixels = pixels[mask] # 在图像上绘制点云深度 for u, v, z in pixels: cv2.circle(img, (u,v), 2, color_map(z), -1) return img - 2.4 相机 + Radar 融合
关联图像检测框与 Radar 目标 (IoU + 速度一致性)。 - 2.5 多 Lidar 融合
ICP 算法配准点云:from sklearn.neighbors import KDTree def icp(source, target, max_iter=100): for _ in range(max_iter): tree = KDTree(target) dist, idx = tree.query(source) T = compute_transform(source, target[idx]) # SVD求解变换 source = apply_transform(source, T) - 2.6 Lidar + IMU 融合
LIO-SAM 框架:IMU 预积分 + Lidar 位姿优化。 - 2.7 Lidar + Radar 融合
代码示例:互补目标检测def fuse_lidar_radar(lidar_objects, radar_objects): fused_objects = [] for lidar_obj in lidar_objects: matched = False for radar_obj in radar_objects: if distance(lidar_obj, radar_obj) < threshold: # 融合位置和速度 pos = (lidar_obj.pos * w_lidar + radar_obj.pos * w_radar) vel = radar_obj.vel # Radar 测速更准 fused_objects.append(FusedObject(pos, vel)) matched = True break if not matched: fused_objects.append(lidar_obj) # 保留未匹配的Lidar目标 return fused_objects
- 2.1 多相机融合
关键挑战与解决方案
| 挑战 | 解决方案 |
|---|---|
| 时间异步 | 硬件触发 + 时间插值 |
| 空间标定误差 | 在线标定 (LiDAR-Camera Net) |
| 多模态数据对齐 | 深度学习特征融合 (BEVFusion) |
| 极端天气干扰 | 多传感器冗余 (Radar + Lidar) |
| 实时性要求 | 优化算法 (CUDA 加速) |
标定工具推荐:
- 相机内参:MATLAB Camera Calibrator / OpenCV
- Lidar-相机:Autoware Calibration Tool
- IMU-相机:Kalibr
- 多传感器联合:COLMAP + LIO-SAM
浙公网安备 33010602011771号