无人驾驶传感器融合系列(十)—— 目标追踪之相机与激光雷达数据融合

无人驾驶传感器融合系列(十)—— 目标追踪之相机与激光雷达数据融合

本章摘要:前几章讲了单独相机实现目标追踪,这一章讲解如何实现相机和激光雷达数据融合。整体思路是这样的,1、先是坐标对齐,将雷达坐标转换到相机坐标。2、然后将激光点往像平面投影,得到投影到像平面的点云。3、借助图像检测的框图(前面提到的YOLOv3检测)对点云实现过滤聚类。4、对聚类点后处理。

0、概述

前视相机得到下面的图片:
在这里插入图片描述
前视某一区域的雷达点云俯视图如下:
在这里插入图片描述
我们的目标就是综合相机图片,雷达点云数据,最终得到下面的多目标跟踪结果:
在这里插入图片描述
下面我们就来分析如何一步步达到这样的效果。

一、坐标对齐

相机坐标和激光雷达坐标位置不同,如果想把点云投影到图片上,需要对两坐标进行对其。将一个坐标和另一个坐标对齐,无非就是平移,旋转。

坐标平移:

下面通过二维坐标讲解下平移,将其转化到三维坐标道理是一样的。
在这里插入图片描述
上面可以看来,平移只是在相应的维度上加上平移量。但是为了将这种相加的形式改变为相乘的形式,这里使用了齐次坐标。齐次坐标只是在原来的维度上加一个维度,这样矩阵相加的形式就可以变成相乘的形式,这样所有的坐标变换(平移、缩放)都可以变成矩阵相乘的形式了。关于欧几里得空间、齐次坐标之间的转化如下:

在这里插入图片描述

坐标旋转:

二维坐标的旋转:
在这里插入图片描述
同样的道理,三维坐标的旋转可以看作,依次绕着三个轴旋转,联合的结果就可以得到最终的效果:
在这里插入图片描述

二、三维向二维平面投影

经过了坐标平移、旋转实现了激光雷达,相机的坐标对其。之后就可以将三维物体向像平面投影了,三维物体向二维平面投影变换如下:
在这里插入图片描述
下面是投影关系,从上面的几何关系,可以得到下面的变换公式。式子中k,l为单位变换缩放,从米缩放到像素。
在这里插入图片描述
此投影变换用矩阵的方式表达如下:
在这里插入图片描述
对上面的结果采用齐次坐标的形式,可以得到如下变换结果:
在这里插入图片描述
经过上面一些列的变换,平移、旋转、投影,最终将雷达点云投影到了像平面上了。整体表示如下:
在这里插入图片描述
对每个点云数据进行上面变换之后,就得到了像平面上的齐次坐标,然后将其转化回欧几里得坐标(公式上面提过),最终求得投影到像平面的结果。

三、KITTI数据集介绍

我们高速公路相机图片,点云数据来自KITTI数据集,下面大概介绍下要用的KITTI传感器配置、标定参数说明:
在这里插入图片描述
在文件 "calib_velo_to_cam.txt“ 中给了激光雷达到左边相机的平移、旋转参数:

calib_time: 15-Mar-2012 11:37:16

R: 7.533745e-03 -9.999714e-01 -6.166020e-04 1.480249e-02 7.280733e-04 -9.998902e-01 9.998621e-01 7.523790e-03 1.480755e-02

T: -4.069766e-03 -7.631618e-02 -2.717806e-01

在文件 “calib_cam_to_cam.txt” 中给了投影参数。

calib_time: 09-Jan-2012 13:57:47
…
R_rect_00: 9.999239e-01 9.837760e-03 -7.445048e-03 -9.869795e-03 9.999421e-01 -4.278459e-03 7.402527e-03 4.351614e-03 9.999631e-01

P_rect_00: 7.215377e+02 0.000000e+00 6.095593e+02 0.000000e+00 0.000000e+00 7.215377e+02 1.728540e+02 0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00 0.000000e+00
…

P_rect_00:就是上面的投影K值。
R_rect_00: is the 3x3 rectifying rotation to make image planes co-planar, i.e. to align both cameras of the stereo rig 。

四、投影前处理

点云开始向像平面投影之前需要对其进行处理,需要把下面这些点云过滤掉:

… positioned behind the Lidar sensor and thus have a negative x coordinate.
… too far away in x-direction and thus exceeding an upper distance limit.
… too far off to the sides in y-direction and thus not relevant for collision detection
… too close to the road surface in negative z-direction.
… showing a reflectivity close to zero, which might indicate low reliability.

for(auto it=lidarPoints.begin(); it!=lidarPoints.end(); ++it) {
        float maxX = 25.0, maxY = 6.0, minZ = -1.4; 
        if(it->x > maxX || it->x < 0.0 || abs(it->y) > maxY || it->z < minZ || it->r<0.01 )
        {
            continue; // skip to next point
        }

最后得到的投影结果如下:
在这里插入图片描述

五、投影后处理

点云投影之后,需要对点云进行聚类,表明那些点云属于属于一个目标。联合 YOLO目标检测 讲过的框图,可以将投影到框图内的点云聚类成一类,得到下面的结果:
在这里插入图片描述
关于框图的所包含的数据如下:

struct BoundingBox { // bounding box around a classified object (contains both 2D and 3D data)

    int boxID; // unique identifier for this bounding box
    int trackID; // unique identifier for the track to which this bounding box belongs

    cv::Rect roi; // 2D region-of-interest in image coordinates
    int classID; // ID based on class file provided to YOLO framework
    double confidence; // classification trust

    std::vector<LidarPoint> lidarPoints; // Lidar 3D points which project into 2D image roi
    std::vector<cv::KeyPoint> keypoints; // keypoints enclosed by 2D roi
    std::vector<cv::DMatch> kptMatches; // keypoint matches enclosed by 2D roi
};
一些问题:
  • 发现框图往往会比实际物体大一些,这样的话,会把一些不属于目标物体的点,聚类到该物体上了。所以往往会在原来框图的基础上缩小一定比例,然后将投影在缩小之后的小框图上的点保留,下面分别是缩小10%,25%的结果。
    在这里插入图片描述
    实际运用过程中往往会缩小5-10%,会达到比较好的聚类效果。
  • 框图交叉时,有些点云会同时属于多个框图,造成聚类错误,比如下面的情景:
    在这里插入图片描述
    常规的做法是,将同时属于多个框图的点云去除掉,避免的它们的干扰。

算法运用

算法的应用,详见github,SFND_3D_Object_Tracking

文章说明:

Udacity 传感器融合课程笔记

### 点云融合用于目标检测的技术方法 #### 技术背景 在自动驾驶领域,为了提高目标检测的精度和可靠性,通常采用多模态数据融合技术。其中,点云像的融合是一种常见且有效的方式。通过结合激光雷达产生的三维点云数据以及摄像头拍摄的二维像信息,可以实现更精确的目标识别。 #### 数据预处理阶段 对于来自不同传感器的数据,在进入模型之前需要经过一系列预处理操作以确保两者能够有效地结合起来。这包括但不限于时间同步、空间校准等过程[^2]。具体来说: - **时空对齐**:由于LiDAR 和相机采集频率差异较大,因此首先要解决的就是如何让两者的观测在同一时刻对应起来;另外还需要考虑车辆运动带来的影响。 - **坐标转换**:将点云映射到像平面或者相反方向上,以便后续网络可以直接利用这些特征进行训练。 #### 融合策略分类 根据实际需求和技术特点,目前主流的点云融合方案主要分为三类: - #### 早期融合 (Early Fusion) 将原始输入层面的信息直接拼接在一起送入神经网络中共同学习。这种方式简单直观但可能会引入大量冗余计算资源消耗,并且容易受到噪声干扰的影响[^1]。 - #### 中期融合 (Intermediate Fusion) 首先分别提取各自模态下的高级语义表示再加以组合。相比前者这种方法能够在一定程度上去除掉不必要的细节从而减轻负担并提升性能表现。 - #### 后期融合 (Late Fusion) 对两个独立分支得到的结果做最后一步加权求和或者其他形式的操作完成最终决策输出。它允许各子模块专注于自己擅长的部分进而获得更好的泛化能力。 #### 应用场景实例分析 ##### 自动驾驶中的行人监测 借助于上述提到的不同层次上的融合机制,可以在复杂环境下准确无误地捕捉到道路上行走的人群位置姿态变化情况。例如当遇到雨雾天气视线受阻时依靠LiDAR穿透性强的优势弥补可见光成像不足之处。 ##### 物体尺寸测量 除了基本的身份确认之外还可以进一步获取物体的具体尺度参数这对于判断障碍物类型至关重要。比如区分小型动物还是大型静止物体有助于规划合理的避障路径。 ```python import numpy as np from sensor_fusion import LidarCameraFusionModel def detect_objects(lidar_data, camera_image): fusion_model = LidarCameraFusionModel() # Perform early fusion by concatenating features from both sensors fused_features = fusion_model.early_fuse(lidar_data, camera_image) # Use the model to predict object locations and sizes based on the fused data objects_detected = fusion_model.predict(fused_features) return objects_detected ```
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值