无人驾驶技术入门 李静林 2020-02-05 17:56 No Comment 1696次浏览 >这是CSDN上AdamShan在2017年-2019年发表的系列博客《无人驾驶汽车系统入门》,对无人驾驶中的一些基本原理介绍的很全面,非常适合对无人驾驶进行学习,也适合做车联网的时候理解未来的无人驾驶基本原理,特转载在此 ![weymo_HMAP.jpg](http://iov.sicrc.cn/usr/uploads/2020/02/989712375.jpg) weymo # 目录 [TOC] # 基础知识 ## ROS ROS(Robot Operating System)是目前常用的开源机器人软件平台,其基于PUB-SUB模型来实现各个组件之间的交互,虽然存在一些缺点,但非常灵活,极大的提升了机器人开发的效率。 原文:[《ROS系统 1》](https://blog.csdn.net/AdamShan/article/details/79653378), [《ROS系统 2》](https://blog.csdn.net/AdamShan/article/details/79882668) ---------- ## 机器学习与深度学习 机器学习和深度学习能够很好的应用在自动驾驶的环境认知中,特别是在对图像这一信息源的处理上。 原文:[《机器学习》](https://blog.csdn.net/AdamShan/article/details/78930251),[《深度学习》](https://blog.csdn.net/AdamShan/article/details/79004784) ---------- ## 无人驾驶基本框架 无人驾驶系统的核心可以概述为三个部分:**感知(Perception),规划(Planning)和控制(Control)** **1. 感知** - **环境感知** 环境感知主要通过激光雷达(Lidar),相机(Camera),毫米波雷达(Millimeter Wave Radar)的融合。 其中,对于激光雷达的信息认知主要分为:分割(Segmentation)和分类(Classification)。 - 分割是为了将点云图中离散的点聚类成若干个整体,主要方法包括: - 基于边的方法,例如梯度过滤等 - 基于区域的方法,这类方法使用区域特征对邻近点进行聚类,聚类的依据是使用一些指定的标准(如欧几里得距离,表面法线等),这类方法通常是现在点云中选取若干种子点(seed points),然后使用指定的标准从这些种子点出发对邻近点进行聚类 - 参数方法,这类方法使用预先定义的模型去拟合点云,常见的方法包括随机样本一致性方法(Random Sample Consensus,RANSAC )和霍夫变换(Hough Transform,HT) - 基于属性的方法,首先计算每个点的属性,然后对属性相关联的点进行聚类的方法 - 基于图的方法 - 基于机器学习的方法 - 分类是区分出这些整体属于哪一个类别(比如说行人,车辆以及障碍物),主要方法包括: - 使用机器学习中的分类算法,如支持向量机(Support Vector Machine,SVM)对聚类的特征进行分类 - 使用卷积神经网络(Convolutional Neural Network,CNN)对三维的点云聚类进行分类 由于激光雷达点云本身解析度低的原因,对于反射点稀疏的目标(比如说行人),基于点云的分类并不可靠,所以在实践中,我们往往融合激光雷达和相机传感器,利用相机的高分辨率来对目标进行分类,利用Lidar的可靠性对障碍物检测和测距,融合两者的优点完成环境感知。 - **目标识别** 通常使用图像视觉来完成道路的检测和道路上目标的检测,主要包括: - 道路的检测主要包含: - 对道路线的检测(Lane Detection),第一是识别出车道线,对于弯曲的车道线,能够计算出其曲率,第二是确定车辆自身相对于车道线的偏移(即无人车自身在车道线的哪个位置)。主要方法包括,抽取一些车道的特征,包括边缘特征(通常是求梯度,如索贝尔算子),车道线的颜色特征等,使用多项式拟合我们认为可能是车道线的像素,然后基于多项式以及当前相机在车上挂载的位置确定前方车道线的曲率和车辆相对于车道的偏离 - 对可行驶区域的检测(Drivable Area Detection)。可行驶区域的检测目前的一种做法是采用深度神经网络直接对场景进行分割,即通过训练一个逐像素分类的深度神经网络,完成对图像中可行驶区域的切割。 - 道路上路标与交通参与者的检测:主要包括对其他车辆的检测(Vehicle Detection),行人检测(Pedestrian Detection),交通标志和信号的检测(Traffic Sign Detection)等所有交通参与者的检测和分类,主要方法包括: - 以RCNN为代表的基于Region Proposal的深度学习目标检测算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等); - 以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD等) - **定位** 地图辅助类定位算法是目前广泛使用的无人车定位算法,主要包括: - 同步定位与地图构建(Simultaneous Localization And Mapping,SLAM),SLAM的目标即构建地图的同时使用该地图进行定位,SLAM通过利用已经观测到的环境特征确定当前车辆的位置已经当前观测特征的位置,这是一个利用以往的先验和当前的观测来估计当前位置的过程,实践上通常使用贝叶斯滤波器(Bayesian filter)来完成,具体来说包括卡尔曼滤波(Kalman Filter),扩展卡尔曼滤波(Extended Kalman Filter)以及粒子滤波(Particle Filter)。 - 高精度地图(HD Map),在实际定位的时候,使用当前激光雷达的扫描和事先构建的高精度地图进行点云匹配,确定我们的无人车在地图中的具体位置,这类方法被统称为扫描匹配方法(Scan Matching),扫描匹配方法最常见的是迭代最近点法(Iterative Closest Point ,ICP),该方法基于当前扫描和目标扫描的距离度量来完成点云配准,除此以外,正态分布变换(Normal Distributions Transform,NDT)也是进行点云配准的常用方法,它基于点云特征直方图来实现配准。 **2. 规划** 规划分为任务规划,行为规划和动作规划. - **任务规划:**路径规划或者路由规划(Route Planning),负责相对顶层的路径规划,例如起点到终点的路径选择。 可以把道路系统处理成有向网络图(Directed Graph Network)表示道路和道路之间的连接情况,通行规则,道路的路宽等各种信息,这个有向网络图被称为路网图(Route Network Graph),任务规划问题就变成了有向图搜索问题,常用迪杰斯特拉算法(Dijkstra’s Algorithm)和A\*算法(A\* Algorithm) - **行为规划:**决策制定(Decision Maker),主要的任务是按照任务规划的目标和当前的局部情况(其他的车辆和行人的位置和行为,当前的交通规则等),作出下一步无人车应该执行的决策 依据目标和当前的交通情况指挥驾驶员是跟车还是超车,是停车等行人通过还是绕过行人等等。行为规划的一种方法是使用包含大量动作短语的复杂有限状态机(Finite State Machine,FSM),根据不同的驾驶场景跳转到不同的动作状态,将动作短语传递给下层的动作规划层 - **动作规划:**通过规划一系列的动作以达到某种目的(比如说规避障碍物)的处理过程被称为动作规划。 通常来说,考量动作规划算法的性能通常使用两个指标: - **计算效率(Computational Efficiency)**:计算效率,即完成一次动作规划的处理效率,动作规划算法的计算效率在很大程度上取决于配置空间(Configuration Space) - **完整性(Completeness)**:如果一个动作规划算法能够在问题有解的情况下在有限时间内返回一个解,并且能够在无解的情况下返回无解,那么我们称该动作规划算法是完整的 无人车的动作规划就变成了:在给定一个初始配置(Start Configuration),一个目标配置(Goal Configuration)以及若干的约束条件(Constraint)的情况下,在配置空间中找出一系列的动作到达目标配置,这些动作的执行结果就是将无人车从初始配置转移至目标配置,同时满足约束条件。 目前动作规划中解决该问题的核心理念是将连续空间模型转换成离散模型,具体的方法可以归纳为两类: - 组合规划方法(Combinatorial Planning):组合方法通过对规划问题建立离散表示来找到完整的解,或者基于网格分解方法(Grid Decomposition Approaches),将配置空间网格化,使用离散图搜索算法(如A\*)找到一条优化路径。 - 采样的规划方法(Sampling-Based Planning):采样的方法基于概率完整性,最常见的算法如PRM(Probabilistic Roadmaps),RRT(Rapidly-Exploring Random Tree),FMT(Fast-Marching Trees),State-Lattice Planners等。状态采样方法需要考虑两个状态的控制约束,同时还需要一个能够有效地查询采样状态和父状态是否可达的方法。 **3. 控制** 控制层作为无人车系统的最底层,其任务是将我们规划好的动作实现,所以控制模块的评价指标即为控制的精准度。控制系统内部会存在测量,控制器通过比较车辆的测量和我们预期的状态输出控制动作,这一过程被称为反馈控制(Feedback Control)。 - 预测模型:基于当前的状态和控制输入预测未来一段时间的状态的模型,在无人车系统中,通常是指车辆的运动学/动力学模型; - 反馈校正:对模型施加了反馈校正的过程,使预测控制具有很强的抗扰动和克服系统不确定性的能力。 - 滚动优化:滚动地优化控制序列,以得到和参考轨迹最接近的预测序列。 - 参考轨迹:即设定的轨迹。 原文:[《无人驾驶的基本框架》](https://blog.csdn.net/AdamShan/article/details/80493350) ---------- # 感知 ## 环境认知 单目相机分辨率高,可以使用各种深度学习算法完成对目标检测,但是缺乏深度,坐标等信息。激光雷达能够获得目标相当精确的三维坐标信息,但是分辨率低,因此环境认知需要融合多种传感器对目标障碍物完成检测。 第一步:融合相机和激光雷达的组合标定 原文:[《激光雷达与摄像头的组合标定》](https://blog.csdn.net/AdamShan/article/details/81670732) 第二步:将雷达点云地面分割出来,这一步操作主要能够改善地面点对于地面以上的目标的点云聚类的影响(对输入点云进行Voxel Grid Filter) 原文:[《激光雷达的地面-非地面分割和pcl_ros实践》](https://blog.csdn.net/AdamShan/article/details/82901295),[《基于地面平面拟合的激光雷达地面分割方法》](https://blog.csdn.net/AdamShan/article/details/84569000),[《基于地面平面拟合的激光雷达地面分割方法》](https://blog.csdn.net/AdamShan/article/details/84569000) 第三步:对地面以上的障碍物的点云进行聚类,通过聚类,我们可以检测出障碍物的边缘,并且使用3维的Bounding Box将障碍物从三维点云中框出来 原文:[《基于欧几里德聚类的激光雷达点云分割》](https://blog.csdn.net/AdamShan/article/details/83015570) ---------- ## 目标识别 - 传统方法实现认知 驾驶需要基于对车辆周边环境的认知进行反馈完成驾驶决策,因此认知是第一步。最基本的认知方式是传统计算机视觉(Computer Version, CV),如使用计算机视觉技术进行车道线检测,并基于检测出来的车道线计算车道线的曲率和车辆偏离车道线中心线的距离。主要步骤包括:确定ROI(Region of interest,划定兴趣区域)、投影变换(解决镜头畸变)、边缘检测(Edge detection,提取车道线边缘) 。 边缘检测方法主要包括基于搜索和基于零交叉两种方法。 - 基于搜索的边缘检测方法首先计算边缘强度,通常用一阶导数表示,例如梯度模; 然后,用计算估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。 - 基于零交叉的方法找到由图像得到的二阶导数的零交叉点来定位边缘.通常用拉普拉斯算子或非线性微分方程的零交叉点。 另外,还可以基于色彩阈值化,提取白色或黄色车道线。用组合梯度和色彩过滤车道线像素,用滑动窗口与多项式拟合排除不属于车道线的像素。 原文:[《车道线认知 1》](https://blog.csdn.net/AdamShan/article/details/78712120) ,[《车道线认知 2》](https://blog.csdn.net/AdamShan/article/details/78733302) 原文:[《基于深度神经网络LaneNet的车道线检测》](https://blog.csdn.net/AdamShan/article/details/90578382) - 深度学习方法实现认知 深度学习方法的方向有两个: - 以RCNN为代表的基于Region Proposal的深度学习目标检测算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等); - 以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD等)。 YOLO将图像划分为网格,基于NMS(Non-maximum suppression:非最大抑制)对这些网格进行回归预测。它首先基于物体检测分数产生检测框,分数最高的检测框M被选中,其他与被选中检测框有明显重叠的检测框被抑制。 由于车辆检测对实时性要求高,可以使用一种YOLO的简化版本:Fast YOLO,该模型使用简单的9层卷积替代了原来的24层卷积,它牺牲了一定的精度,处理速度更快,从YOLO的45fps提升到155fps。 原文:[《基于深度学习的交通信号识别》](https://blog.csdn.net/AdamShan/article/details/79127573),[《基于深度学习的车辆检测》](https://blog.csdn.net/AdamShan/article/details/79193775) 原文:[《基于深度学习的实时激光雷达点云目标检测》](https://blog.csdn.net/AdamShan/article/details/83544089),[《使用TensorFlow Object Detection API分别在GPU和Google Cloud TPU上训练交通信号灯检测神经网络》](https://blog.csdn.net/AdamShan/article/details/88627733) ---------- ## 车辆定位 GPS的定位是米级的,用在无人车上,可能会导致精度不够。在使用了高精度地图的前提下,可以使用激光雷达来实现厘米级的定位——正态分布变换(Normal Distributions Transform, NDT)。NDT的核心思想是将当前扫描到的激光点云与记录的点云进行对比,但并不是直接对比两个点云之间的差距,而是将参考点云(即高精度地图)转换为多维变量的正态分布,如果变换参数能使得两幅激光数据匹配的很好,那么变换点在参考系中的概率密度将会很大,因此,可以用优化的方法求出使得概率密度之和最大的变换参数,此时两幅激光点云数据将匹配的最好。 原文:[《正态分布变换(NDT)配准与无人车定位》](https://blog.csdn.net/AdamShan/article/details/79230612) ---------- # 规划 ## 任务规划 路线规划中一个很核心的问题是最短路径搜索,最常用的方法是A\*算法,但原始的A\*算法属于离散路径搜索算法,而不是连续的,但是其使用启发式搜索函数的理念却是连续路径搜索算法的基础。 原文:[《最短路径搜索之A\*算法》](https://blog.csdn.net/AdamShan/article/details/79945175) ---------- ## 行为规划 驾驶行为规划也被称为驾驶行为决策,这一层的作用主要是依据来自上层(任务规划层)的全局最优行驶路线信息,根据当前的交通场景和环境感知的信息的理解,来确定自身当前驾驶状态,在交通规则的约束和驾驶经验的指导下规划出合理的驾驶行为。 原文:[《分层有限状态机和无人车行为规划》](https://blog.csdn.net/AdamShan/article/details/80633099) ---------- ## 动作规划 动作规划动作在无人车规划模块的最底层,它负责根据当前配置和目标配置生成一序列的动作。 无人车的动作规划问题实际上就是要根据初始配置和目标配置生成一序列的动作,基本思路是先基于任务规划和行为规划生成的路径(全局路径,Global Waypoint,由一系列路径点构成,只包含空间位置信息或姿态信息,但不与时间相关),生成从当前位置x到目标位置y的轨迹(路径(Path)和轨迹(Trajectory)的区别就在于,轨迹还包含了时间信息,即在路径点的基础上加入了时间约束),也被称为局部路径点(Local Waypoints)。动作规划需要控制车辆运动的是轨迹。 第一步,基于离散的路径点生成连续的路径,如基于三次样条插值的路径生成方法; 第二步,基于路径跟踪生成轨迹,目前的主流方法分为两类:基于几何追踪的方法和基于模型预测的方法;pure pursuit方法是典型的基于几何追踪的方法;基于Frenet优化轨迹的方法算是模型法。 原文:[《基于自由边界三次样条插值的无人车路径生成》](https://blog.csdn.net/AdamShan/article/details/80696881) 原文:[《纯追踪法(Pure Pursuit)实现路径追踪》](https://blog.csdn.net/AdamShan/article/details/80555174), [《基于Frenet优化轨迹的无人车动作规划》](https://blog.csdn.net/AdamShan/article/details/80779615) ---------- # 控制 ## 车辆位置预测 卡尔曼滤波是一种重要的状态估计算法,在轨迹预测方面具有重要作用,也是一种有效的平滑算法。传统卡尔曼滤波存在着一个非常大的局限性:它仅能对线性的处理模型和测量模型进行精确的估计,在非线性的场景中并不能达到最优的估计效果。这对车辆、行人、自动车等会带来一些问题,因此需要用到扩展卡尔曼滤波和无损卡尔曼滤波。扩展卡尔曼滤波支持非线性问题,但计算比较慢;无损卡尔曼滤波计算快一些。 原文:[《卡尔曼滤波与目标追踪》](https://blog.csdn.net/AdamShan/article/details/78248421 "卡尔曼滤波与目标追踪"),[《高级运动模型和扩展卡尔曼滤波》](https://blog.csdn.net/AdamShan/article/details/78265754 "高级运动模型和扩展卡尔曼滤波"),[《无损卡尔曼滤波与目标追踪》](https://blog.csdn.net/AdamShan/article/details/78359048) ---------- ## 车辆反馈校正 传统控制理论的基础是PID控制,其简单易于实现,被广泛应用,但是它并不一定是最优的,而且PID控制在实际车辆控制中存在延迟问题。在无人车中,使用了模型预测性控制 (Model Predictive Control) ,是追求短时间间隔内最优化控制的理论,且MPC可以将延迟考虑到车辆模型中去,从而避免实际使用中存在的控制延迟问题。 原文:[《反馈控制与PID》](https://blog.csdn.net/AdamShan/article/details/78458325) 原文:[《车辆的动力学模型》](https://blog.csdn.net/AdamShan/article/details/78696874) 原文:[《基于模型的自动控制MPC》](https://blog.csdn.net/AdamShan/article/details/79083755) ---------- # 迁移学习和端到端无人驾驶 原文:[《迁移学习和端到端无人驾驶》](https://blog.csdn.net/AdamShan/article/details/82414275)