【论文阅读】Review on 3D Lidar Localization for Autonomous Driving Cars

本文回顾了3D激光雷达(LIDAR)在自动驾驶汽车定位中的重要作用,点云数据因其丰富的空间信息而成为解决定位问题的理想选择。定位方法主要分为基于配准、基于特征和基于神经网络三大类。基于配准的方法如ICP和NDT,通过点云降采样和外点剔除提高效率;基于特征的方法则提取部分关键点进行匹配;基于神经网络的方法利用深度学习进行端到端或部分处理,加速定位过程。

Review on 3D Lidar Localization for Autonomous Driving Cars

“LIDAR data, compared to other perception sensors, is the richest and most detailed in term of spacial information. This results in the LIDAR sensor being practically always more accurate when it comes to solving spatial based challenges such as localizing a vehicle.”
简单来说,就是3维的事情要做用3维的数据做。而且文中提到,激光雷达下降非常快。

由于激光雷达获取的点云数量庞大,所以使用点云做定位的方法主要围绕的是速度的提升。

使用点云的做定位的方法大致分为以下几类

基于配准的

最经典的就是ICP,在ICP的发展过程中,有许多改进版:point-to-line ICP,point-to-plane ICP,and Generalized ICP。考虑激光雷达的扫描特性,形成的是一个一个圆,使用Normal Covariance Filter做点云的降采样,用Geometric Correspondance Rejector做外点的剔除,可以使得ICP更好的在车载激光雷达中使用。

另一种超越ICP的方法则是NDT。

ICP和NDT的使用,在IMLS-SLAM中得到了一种非常经典的三步走范式:
1)将动态的点剔除
2)降采样
3)使用ICP或者NDT

另外一种预处理的方式是不直接使用点,而是提取一些特征,例如使用sufel或者Collar Line Segments。作者将这些还是归入基于配准的方法,是

### Frustum-PointPillars 的具体方法 Frustum-PointPillars 是一种高效的多模态融合算法,它结合了相机和激光雷达的优势,在自动驾驶场景中实现了实例分割任务。该方法的核心在于通过投影的方式将二维图像信息与三维点云数据相结合,从而减少计算复杂度并提升性能。 #### 方法概述 Frustum-PointPillars 将 2D 图像中的感兴趣区域 (ROI) 投影到 3D 点云的空间范围(即 frustum),随后仅对该子集内的点云进行处理[^1]。这种方法显著减少了需要处理的点云数量,同时保留了来自图像的语义信息。以下是其实现的关键部分: 1. **基于图像的目标检测** 使用 CNN 对输入的 RGB 图像进行目标检测,生成一组边界框(bounding boxes)。这些边界框定义了可能包含对象的 ROI 区域[^2]。 2. **Frustum 提取** 利用相机内外参矩阵,将每个 2D 边界框映射至对应的 3D 坐标系下的锥形空间(frustum)。此操作筛选出了与当前目标相关的点云子集。 3. **PointPillars 编码器** PointPillars 是一种高效点云编码方式,采用动态体素化技术将点云划分为固定尺寸的小柱状单元(pillars)。对于提取出的 frustum 数据,应用相同的编码流程以生成 BEV 特征图[^2]。 4. **特征融合与分类** 结合从图像中提取的高级语义特征以及由 PointPillars 得到的几何特征,构建一个多通道特征向量。最终送入全连接层完成类别预测与边界的回归运算[^2]。 --- ### 实现代码示例 以下为 Python 和 PyTorch 下的一个简化版实现框架: ```python import torch from torchvision import models from point_pillars_encoder import PillarEncoder # 自定义或第三方库 class FrustumPointPillars(torch.nn.Module): def __init__(self, num_classes=3): super(FrustumPointPillars, self).__init__() # 加载预训练的图像特征提取模型 self.image_feature_extractor = models.resnet18(pretrained=True) self.image_feature_extractor.fc = torch.nn.Identity() # 移除最后的 FC 层 # 初始化 PointPillars 编码器 self.pillar_encoder = PillarEncoder() # 融合后的分类头 self.classifier_head = torch.nn.Sequential( torch.nn.Linear(512 + 64, 128), # 合并图像特征与点云特征 torch.nn.ReLU(), torch.nn.Dropout(p=0.5), torch.nn.Linear(128, num_classes) ) def forward(self, image, lidar_points, camera_intrinsics, extrinsics): """ :param image: 输入的RGB图像 [batch_size, C, H, W] :param lidar_points: 激光雷达点云 [num_points, 3] :param camera_intrinsics: 相机内参数矩阵 [3, 3] :param extrinsics: 外参数矩阵 [4, 4] """ # Step 1: 图像特征提取 img_features = self.image_feature_extractor(image) # 输出维度取决于 ResNet 配置 # Step 2: 计算 frustums 并过滤点云 frustums = compute_frustums(camera_intrinsics, extrinsics, img_features.shape[-2:]) # 获取 frustum 子集 filtered_lidar_points = filter_points_in_frustums(lidar_points, frustums) # 只保留相关点 # Step 3: PointPillars 编码 pillar_features = self.pillar_encoder(filtered_lidar_points) # Step 4: 特征拼接与分类 combined_features = torch.cat((img_features.flatten(start_dim=1), pillar_features.flatten(start_dim=1)), dim=-1) predictions = self.classifier_head(combined_features) return predictions def compute_frustums(intrinsics, extrinsics, roi_shape): """根据相机内外参及 ROI 形状计算 frustums""" pass # 具体逻辑省略 def filter_points_in_frustums(points, frustums): """筛选位于指定 frustums 中的点云""" pass # 具体逻辑省略 ``` --- ### 性能优化建议 为了进一步提高效率,可以考虑以下几个方面: - **稀疏张量加速**: 在 GPU 上使用稀疏张量表示 pillars,降低内存占用。 - **轻量化网络设计**: 替代标准 ResNet 或 VGG,选用 MobileNet 等更适合嵌入式设备的架构。 - **硬件支持**: 如果部署环境允许,可借助 NVIDIA Jetson AGX Xavier 等专用芯片运行推理过程[^3]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值