【自动驾驶】多传感器感知技术解析

2023-05-16

1.传感器

自动驾驶中的传感器主要用到激光雷达,毫米波雷达,摄像头,超声波,优缺点如下:

1)激光雷达的测距精度、测距范围及对温度和光照的适应性很强,缺点线束低的情况,识别不好,也可能会漏掉目标(尤其是非金属物体)

2)相机对环境细节信息多,但是光照影响太大。

3)毫米波最大优点探测角度比较大,抗干扰性强,性能比较稳定,缺点就是分辨率和精度差

4)超声波雷达精度差,探测距离短,只有3m。

2.标定

传感器标定主要包括内参和外参。内参主要是焦距,光圈,相机中心偏移等参数,可直接获取或者简单算法测定。这里主要说的是外参标定,外参是描述了传感器与其他给定坐标之间的相对位置关系,所以这里的外参描述为,长焦相机与短焦相机之间的外参,相机与雷达之间的外参,又或者是雷达与雷达之间的外参, 都需要分别进行标定。

标定的方式有使用标定间标定,或者使用算法进行标定。使用标定间进行标定,设置一些参照物,多为有角点的物体,方便定位。标定完也可进行误差修正。具体方法:

(1)相机标定: 多点图像数据  VS 多点参照物相应角点数据  方法:PNP算法

(2)点云标定: 多点点云坐标   VS 多点参照物点云数据         方法:ICP算法

不同相机使用PNP得到一个矩阵,将两个矩阵进行传递,一般用一个矩阵得逆乘以另一个矩阵就得到了外参,点云也是这样。

3.检测

2D图像检测常用算法:SSD;yolo系列;centernet

3D点云检测常用算法:

(1)分割:birdview分割;(2)检测:MV3D

流行算法:VoxelNet,SECOND, PointPillars,Centerpoint

PointPillars

Pillars每个点其实是有xyz或者其他特征的,所以点本身也是一个特征向量。然后通过我们的全连接层,Bath Norm,ReLU,还有Max Pooling这些常规的操作之后,来转换成一个Pillar里的global的特征,一个代表Pillar的特征向量。这个过程其实是对于VoxelNet转化成Voxel过程的一个简化,是VoxelNet对Voxel编码的学习的过程。VoxelNet在最后Voxel得到一个global的特征之后,它还要把global特征再Concat的回去,也就是说每人复制一份再领回去原来的点,然后再继续去迭代这样的过程,在最后的内存里边才是用最后的global的特征作为VoxelNet整个的特征向量。所以PFE其实是一个简化,加快了迭代过程。

 

损失函数:

PointPillars原来是用了Focal loss作为它分类的损失函数。Focal loss是在2018年的时候提出的,也是用于二维的目标检测,用来改进一个类别不均衡的问题,正负样本比例不均衡的问题。公式有两个参数α和γ。这两个参数要预先设定一个超参数,这个超参数本身是需要通过先验调整。实际的测试中发现这些参数不是特别好调整,因为需要利用一些先验的信息,所以就换成了加权的softmax loss,它的泛化性更好,因为没有那些超参数,泛化后的检测效果有改善,这个加权的意思就是给了一些类比更大的权重。

Pillar特征编码:

左边的结构是原来的,右边的是改进之后的,在拿到点的特征的时候,原本是包含点的xyz坐标和反射率的intensity,当然还有可能有其他的特征,先做一个radius的替换,就是对里面的特征做一个初步的变换。之后再进行后面的操作,Linear,Batch Norm,Relu,MaxPooling,得到最后的一个global的Pillar的特征。

接下来用Radius替换点特征:在右边的这张BEV这个视角下的点云图里面,坐标系的原点O,其实是车上的lidar的传感器,朝前的是x的正方向,左方是Y轴正方向,先计算一个radius,就是xy的二范数,也就是说在这个BEV视角xy平面上,这个点与原点的距离就是radius,用它替代点的原始特征xy,再加上Y intensity,组成这个点变换之后的特征。激光雷达的点云是一圈一圈的点组成的,是几乎不间断的通过旋转激光反射器来获得的。此外,在这个BEV视角下的目标检测里面,X和Y的地位其实是相等的,所以把xy替换成了radius,把这个radius当成点的基本特征去看待,更符合点云是一圈一圈的这个原始的特点,对于网络的提升有帮助。

RPN网络设计:

RPN是最初针对二维目标检测,在Fast-RCN里面提出的一个编码解码的网络,通过预先在网格点上设定好初始的检测框,然后对应到特征图上面,经过后续的处理,得到的这些候选框包含的概率分数值和目标类别,最后再去做进一步的筛选,得到的最终的检测框。而那些初始的候选框proposals,一开始是需要先在这个原始的图上面去取一些初始的anchor,来提供初始的框。在二维的目标检测里边,也就是针对图像的目标检测里面,由于同一个目标,在不同的拍摄角度,在图像上的尺寸是不同的,有些远近关系,那么因此就要设定multi-anchor图像的目标检测里面,可以通过不同大小,不同的长宽比例尽可能去覆盖匹配图像里的这些目标。

Multi-head对RPN的改进:Apollo的PointPillars模型支持9个类别,其中有4个是个头比较大的类别(Large head),比如说轿车、卡车、公交车,还有工程车。另外5个Small head、行人、bicycle、motorcycle、雪糕筒等,那他们在BEV图上所占的尺寸是有差距的,在俯视图视角上这些个头是有一些差距的。所以要把这些类别都分开来,分成两个不同的RPN head去做检测。比如说我们这里在拿到最终的特征图之前,各自先用一个卷积层来输出目标的class类别的概率得分,还有body box的回归值,以及它的direction朝向。

4.融合跟踪

对象跟踪器跟踪分段检测到的障碍物。通常,它通过将当前检测与现有跟踪列表相关联,来形成和更新跟踪列表,如不再存在,则删除旧的跟踪列表,并在识别出新的检测时生成新的跟踪列表。 更新后的跟踪列表的运动状态将在关联后进行估计。 在HM对象跟踪器中,匈牙利算法(Hungarian algorithm)用于检测到跟踪关联,并采用鲁棒卡尔曼滤波器(Robust Kalman Filter) 进行运动估计。

跟踪流程可以分为:

  • 预处理;(lidar->local ENU坐标系变换、跟踪对象创建、跟踪目标保存)

  • 卡尔曼滤波器滤波,预测物体当前位置与速度;(卡尔曼滤波阶段1:Predict阶段)

  • 匈牙利算法比配,关联检测物体和跟踪物体;

  • 卡尔曼滤波,更新跟踪物体位置与速度信息。(卡尔曼滤波阶段2:Update阶段)

 

对每个时刻检测到的Object与跟踪列表中的TrackedObject进行匈牙利算法的二分图匹配,匹配结果分三类:

  1. 如果成功匹配,那么使用卡尔曼滤波器更新信息(重心位置、速度、加速度)等信息;

  2. 如果失配,缺少对应的TrackedObject,将Object封装成TrackedObject,加入跟踪列表;

  3. 对于跟踪列表中当前时刻目标缺失的TrackedObject(Object都无法与之匹配),使用上时刻速度,跟新当前时刻的重心位置与加速度等信息(无法使用卡尔曼滤波更新,缺少观测状态)。对于那些时间过长的丢失的跟踪目标,将他们从跟踪队列中删除。

在跟踪对象信息融合的阶段,Apollo的主要工作是,给定一个被跟踪的物体序列:

(Time_1,TrackedObject_1),

(Time_2,TrackedObject_2),

...,

(Time_n,TrackedObject_n)

每次执行LidarSubNode的回调,都会刷新一遍跟踪列表,那么一个被跟踪物体的信息也将会被刷新(重心位置,速度,加速度,CNN物体分割--前景概率,CNN物体分割--各类别概率)。N次调用都会得到N个概率分布(N个CNN物体分割--前景概率score,N个CNN物体分割--各类物体概率Probs),我们需要在每次回调的过程中确定物体的类别属性,当然最简单的方法肯定是argmax(Probs)。但是CNN分割可能会有噪声,所以最好的办法是将N次结果联合起来进行判断。

参考:开发者说|Apollo感知分析之跟踪对象信息融合

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【自动驾驶】多传感器感知技术解析 的相关文章

  • -1的原码、反码、补码(0xff)

    1的表示 1 0xff的无符号数为255 xff0c 当作为有符号数显示则为 1 2 1的原码表示为1001 xff1b 除符号位取反得反码 xff1a 1110 xff1b 加1得补码 xff1a 1111即0xff 3 负数在计算机中用
  • C++头文件包含(2):cpp多次包含同一头文件,会有什么问题?头文件保护

    1 目录结构 xff1a span class token operator span base span class token operator span main main span class token punctuation s
  • Go语言学习之读文件

    三种方式读取文件 span class token keyword package span main span class token keyword import span span class token punctuation sp
  • include_directories和target_include_directories

    1 作用 xff1a 给源文件添加头文件搜索路径 xff1a 将指定目录添加到编译器的头文件搜索路径之下 xff0c 指定的目录被解释成当前源码路径的相对路径 2 差别 xff1a 2 1 include directories xff1a
  • CMAKE常用内置变量解释:CMAKE_SOURCE_DIR/EXECUTABLE_OUTPUT_PATH/CMAKE_EXPORT_COMPILE_COMMANDS

    前言 xff1a cmake的内置命令是不区分大小写的 因此add subdirectory与ADD SUBDIRECTORY作用一致 cmake的所有变量都是区分大小写的 1 PROJECT SOURCE DIR 与 PROJECT BI
  • C++文件读写类介绍

    一 现有的文件读写方案 方案一 xff1a 采用C 43 43 标准库读写 该库拥有输入输出模板类及两个标准实例化集 xff1a 一个是用于操作char类型元素的实例化集 即常用的cin xff0c cout等 xff0c 另一个用于操作w
  • 自定义target命令:add_custom_target

    一 前置知识 1 CMake中一切都是基于target的 xff0c 如add library会产生一个library的target xff0c add executable会产生一个exe的target 2 以上命令生成的target放在
  • 软件设计原则:迪米特法则

    一 定义 迪米特法则 xff1a 要求一个对象应该对其他对象有最少的了解 xff0c 所以又叫做最少知识原则 二 法则内容 xff1a 1 不该有直接依赖关系的类之间 xff0c 不要有依赖 xff1a 即 xff0c 不和陌生人说话 xf
  • ElasticSearch最佳入门实践(六十二)type底层数据结构

    type xff0c 是一个index中用来区分类似的数据的 xff0c 类似的数据 xff0c 但是可能有不同的fields xff0c 而且有不同的属性来控制索引建立 分词器 field的value xff0c 在底层的lucene中建
  • 四轴的组成及参数评定

    电气工程及其自动化专业 xff0c 坐标广东湛江 xff0c 大一时期对专业上很感兴趣 xff0c 自学了许多东西 xff0c 但是只是停留在理论基础上而缺乏实践 xff0c 和学校在这方面的普及有点关系吧 xff0c 趁着国家有这方面的支
  • sudo rosdep init报错的解决方式

    Ubuntu16 04下安装ROS时 xff0c 执行到sudo rosdep init这一步时会遇到问题 xff0c 如下图所示 xff1a 尝试了很多办法 xff0c 都没有成功的 后来参考了https www ioiox com ar
  • VS版本和VC版本的对应【完整版】

    看到网上杂七杂八 xff0c 很乱 xff0c 索性自己发帖多版本开发福音 xff08 该帖不更新了 xff0c 请看参考里连接中的官方文档 xff0c 非常清楚 xff0c 还保持最新 xff09 MSC 1 0 MSC VER 61 6
  • 搭建运行激光slam环境中遇到的问题

    1 先是踩了一些坑 xff0c 重复安装了一些库 xff0c 因为ros noetic里面就自带了一些库 xff0c 所以安装的时候重复安装了 解决方法 xff1a 删掉重装 另外缺少一些库 xff0c 乱装一顿 xff0c 居然凑齐 Ub
  • mac上用VSCode搭建 c++ 工程,用于学习Opengl

    先下载VSCode安装c c 43 43 插件 xff0c 安装微软这个 创建一个文件夹作为项目 xff0c 然后用VSCode打开这个目录在这个文件夹中创建好四个目录 xff0c 分别是src xff0c lib include bin
  • 刷赞与评论

    网站自动刷帖 xff0c 刷赞 xff0c 刷评论等网络推广方式的基本实现 里面的思路有东西
  • 系统复制-快速重装系统

    ubuntu 直接把安装好常用软件和环境的系统打包成镜像 xff0c 用systemback安装 xff0c 便捷很多 之前那种 xff0c ubuntu安装都要好久 xff0c 少说也得20分钟吧 xff0c 之前就是等 xff0c 等它
  • 机器人 控制领域

    机器人 控制领域好像没太有很新很有用的工作 xff0c 还是依据Dynamic Model的Motion Planning更接近于任务层 其实 xff0c 感觉自己喜欢的不是控制 而是motion xff0c motion control
  • 树莓派电压过低 串口数据错误增多

    调试过程中 xff0c 树莓派串口读单片机上传的数据 的程序突然一堆checksum error 换一块满电的LiPo电池就大幅减少了报错 一开始猜测原因 可能是电压过低导致CPU运行慢了 xff08 可能叫做 降频 xff09 xff0c
  • 机器人知识体系

    纲 机电力算控感 知识体系体系各元素特点体系的建立和完善 机电力算控感 知识体系 机械 电子电气 力学 xff08 静力学与动力学分析 流体力学 材料力学等 xff09 计算 xff08 通用计算机和嵌入式计算机 xff09 控制理论 感知
  • OpenCV之imwrite()等基本操作

    参考 xff1a Opencv之imwrite 函数的用处 imwrite 函数用来保存图片 opencv3中的imwrite函数是用来输出图像到文件 xff0c 其声明如下 xff1a CV EXPORTS W bool imwrite

随机推荐