<转载> 从算法上解读自动驾驶是如何实现的?
[摘要]车辆路径规划问题中路网模型、路径规划算法和交通信息的智能预测为关键点。
由于驾驶员的驾驶工作繁重,同时随着汽车拥有量的增加,非职业驾驶员的数量增多,导致交通事故频繁发生。如何提高汽车的主动安全性和交通安全性已成为急需解决的社会性问题。
图1 智能汽车示意图
随 着计算机技术、电子技术、图像处理等信息处理技术研究的发展,研究人员开始将各种先进的技术应用于汽车控制上,辅助驾驶员进行汽车的操纵控制。在这些汽车 电子控制系统研究的基础上,结合蓬勃发展的智能化信息处理技术,逐步产生了一个新兴的交叉学科——车辆的自动驾驶(又称为智能汽车)。未来实用化的智能汽 车将最大限度地减少交通事故、提高运输效率、减轻驾驶员操纵负担,从而提高整个道路交通的安全性、机动性与汽车行驶的主动安全性。科技部于2001年已正 式启动实施了十五计划中的国家科技攻关计划重大项目“智能交通系统关键技术开发和示范工程” 来提高我国整个运输系统的管理水平和服务水平,提高效率和安全性,车辆的自主驾驶是实现ITS(Intelligent Transport System,智能交通系统)的关键。
图2 智能交通系统示意图
车辆自主驾驶系统从本质上讲是一个智能控制机器,其研究内容大致可分为信息感知、行为决策及操纵控制三个子系统。路径规划是智能车辆导航和控制的基础,是从轨迹决策的角度考虑的,可分为局部路径规划和全局路径规划。
全局路径规划的 任务是根据全局地图数据库信息规划出自起始点至目标点的一条无碰撞、可通过的路径。目前正在研究的有准结构化道路环境多种约束条件下的路径规划技术,自然 地形环境下的路径规划技术,以及重规划技术等。由于全局路径规划所生成的路径只能是从起始点到目标点的粗略路径,并没有考虑路径的方向、宽度、曲率、道路 交叉以及路障等细节信息,加之智能车辆在行驶过程中受局部环境和自身状态的不确定性的影响,会遇到各种不可测的情况。因此,在智能车辆的行驶过程中,必须 以局部环境信息和自身状态信息为基础,规划出一段无碰撞的理想局部路径,这就是局部路径规划。通常路径规划的方法有:空间搜索法、层次法、动作行为法、势场域法、栅格法、模糊逻辑法和神经网络法等。
汽车自动驾驶任务可以分为三层,如图3所示,每层执行不同任务,包括上层路径规划、中层行驶行为规划和下层轨迹规划。
图3 汽车自动驾驶任务
上层路径规划在已知电子地图、路网以及宏观交通信息等先验信息下,根据某优化目标得到两点之间的最优路径,完成路径规划的传感信息主要来自于GPS定位信息以及电子地图。中层行驶行为规划是指根据主车感兴趣区域内道路、交通车等环境信息,决策出当前时刻满足交通法规、结构化道路约束的最优行驶行为,动态规划的行驶行为序列组成宏观路径。行为规划的传感信息主要来自车载传感器如雷达、照相机等,用以识别道路障碍、车道线、道路标识信息和交通信号灯信息等。下层轨迹规划是指在当前时刻,以完成当前行车行为为目标,考虑周围交通环境并满足不同约束条件,根据最优目标动态规划决策出的最优轨迹。同时,车辆的动力学约束也会在下层得到体现,下层轨迹规划除了必要的外部环境信息外,还需要对主车状态信息进行测量或估计。
车辆路径规划问题中的几个关键点:路网模型、路径规划算法和交通信息的智能预测,涉及的方面较多,本文主要针对路径规划过程做简单的探讨。
一.问题引入
我 们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地,如图2所示。路径搜索(Pathfinding)的目标是找到一条好的路径——避免障碍物、敌人,并把代价(燃料, 时间,距离,装备,金钱等)最小化。运动(Movement)的目标是找到一条路径并且沿着它行进,当游戏对象开始移动时,一个老练的路径搜索器 (pathfinder)外加一个琐细的运动算法(movement algorithm)可以找到一条路径,游戏对象将会沿着该路径移动而忽略其它的一切。一个单纯的运动系统(movement-only system)将不会搜索一条路径(最初的“路径”将被一条直线取代),取而代之的是在每一个结点处仅采取一个步骤,即朝着某个方向行进一段距离,同时需 要考虑周围的障碍物环境避免碰撞的产生。显然,同时使用路径搜索(Pathfinding)和运动算法(movement algorithm)将会得到最好的效果。
移动一个简单的物体(object)看起来是容易的,而路径搜索是复杂的,为什么涉及到路径搜索就产生麻烦了?考虑以下情况:
图4 避碰路径规划
物 体(unit)最初位于地图的底端并且尝试向顶部移动,物体扫描的区域中(粉红色部分)没有任何东西显示它不能向上移动,因此它持续向上移动。在靠近顶部 时,它探测到一个障碍物然后改变移动方向,然后它沿着U形障碍物找到它的红色的路径。相反的,一个路径搜索器(pathfinder)将会扫描一个更大的 区域(淡蓝色部分),但是它能做到不让物体(unit)走向凹形障碍物而找到一条更短的路径(蓝色路径)。
针对以上情形,如图5所示,可以扩展一个运动算法,用于对付上图所示的障碍物,或者避免制造凹形障碍,或者把凹形出口标识为危险的(只有当目的地在里面时才进去)。比起一直等到最后一刻才发现问题,路径搜索器能提前作出规划,选择一条更优的运动路径。
图5 避障优化路径规划方法
二、问题描述
汽车轨迹规划及智能决策是实现汽车智能化的关键技术之一,其主要任务是依据环境感知系统处理后的环境信号以及先验地图信息,在满足汽车行驶诸多约束的前提下,以某性能指标最优为目的,规划出车辆的运动轨迹。
智能车的自动驾驶行为即是将车从起始位姿“搬运”到目标位姿,车辆的运动限制在路面上、同时其运动学及动力学模型使得其不能像空中的无人机一样随意调整航向角,因此,规划的路径除了考虑路程最短、无碰撞外还需要考虑车辆运动轨迹的可执行性。
三.车辆路径规划算法
根 据车辆导航系统的研究历程, 车辆路径规划算法可分为静态路径规划算法和动态路径算法。静态路径规划是以物理地理信息和交通规则等条件为约束来寻求最短路径,静态路径规划算法已日趋成 熟, 相对比较简单, 但对于实际的交通状况来说,其应用意义不大。动态路径规划是在静态路径规划的基础上, 结合实时的交通信息对预先规划好的最优行车路线进行适时的调整直至到达目的地最终得到最优路径。下面介绍几种常见的车辆路径规划算法。
1. Dijkstra算法
图6 Dijkstra算法示意图
Dijkstra(迪 杰斯特拉)算法是最短路算法的经典算法之一,由E.W.Dijkstra在1959年提出的。该算法适于计算道路权值均为非负的最短路径问题,可以给出图 中某一节点到其他所有节点的最短路径,以思路清晰,搜索准确见长。相对的,由于输入为大型稀疏矩阵,又具有耗时长,占用空间大的缺点。其算法复杂度为 O(n2),n为节点个数。
2.Lee算法
Lee 算法最早用于印刷电路和集成电路的路径追踪, 与Dijkstra算法相比更适合用于数据随时变化的道路路径规划, 而且其运行代价要小于Dijkstra 算法。只要最佳路径存在, 该算法就能够找到最佳优化路径。Lee算法的复杂度很难表示, 而且对于多图层的路径规划则需要很大的空间。
3. Floyd算法
Floyd 算法是由Floyd于1962年提出的, 是一种计算图中任意两点间的最短距离的算法。可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包,Floyd-Warshall 算法的时间复杂度为O(n3),空间复杂度为O(n2),n 为节点个数。与对每一节点作一次Dijkstra算法的时间复杂度相同,但是实际的运算效果比Dijkstra算法要好。
4.启发式搜索算法——A* 算法
图7 A* 算法动态示意图
启 发式搜索有很多的算法,如: 局部择优搜索法、最好优先搜索法、A* 算法等。其中A* 算法是由Hart、Nilsson、Raphael等人首先提出的,算法通过引入估价函数,加快了搜索速度,提高了局部择优算法搜索的精度,从而得到广泛 的应用,是当前较为流行的最短路算法。A* 算法所占用的存储空间少于Dijkstra算法。其时间复杂度为O(bd),b为节点的平均出度数,d为从起点到终点的最短路的搜索深度。
5. 双向搜索算法
双 向搜索算法由Dantzig提出的基本思想,Nicholson正式提出算法。该算法在从起点开始寻找最短路径的同时也从终点开始向前进行路径搜索,最佳 效果是二者在中间点汇合,这样可缩短搜索时间。但是如果终止规则不合适,该算法极有可能使搜索时间增加1倍,即两个方向都搜索到最后才终止。
6. 蚁群算法
图8 蚁群算法示意图
蚁群算法是由意大利学者M.Dorigo等于1991年提出的,它是一种随机搜索算法, 是在对大自然中蚁群集体行为的研究基础上总结归纳出的一种优化算法,具有较强的鲁棒性,而且易于与其他方法相结合,蚁群算法的算法复杂度要优于Dijkstra算法。
此 外, 还有实时启发式搜索算法、基于分层路网的搜索算法、神经网络、遗传算法及模糊理论等,由于实际需求不同对算法的要求和侧重点也会有所不用,所以也出现了许 多以上算法的各种改进算法。大多数算法应用于求解车辆路径规划问题时都会存在一定的缺陷,所以目前的研究侧重于利用多种算法融合来构造混合算法。
四.总结
目 前, 投入市场应用的成熟车辆导航系统大多基于静态的路径规划, 然而面对存在众多不稳定因素的交通现实, 用户并不满足于现有的系统。尤其是发生交通事故和交通堵塞时, 静态路径规划不能及时改变路线。因此, 车辆导航动态路径规划就成为新一代智能车辆导航系统的研究热点问题。车辆动态路径规划基于历史的、当前的交通信息数据对未来交通流量进行预测, 并用于及时调整和更新最佳行车路线, 从而有效减少道路阻塞和交通事故。
图9 多导航器协调规划示意图
随 着计算机科学技术、无线通信技术以及交通运输业的高速发展,车辆导航系统的动态路径规划研究趋势还将向多导航器相互协调规划的方向发展。现在的车辆导航都 是单个车辆为对象进行路径引导,而没有考虑到总体的大局协调,这样容易引起新的交通拥塞等问题,所以多导航器协调规划将是一种更加符合实际需求的规划方 法。
参考文献:
1、 考虑全局最优性的汽车微观动态轨迹规划
2、 车辆导航动态路径规划的研究进展
3、 Adaptive Routing for road traffic
<转载> 从算法上解读自动驾驶是如何实现的?的更多相关文章
- [原]JSBSim 自动驾驶(浅出)
jsbsim的脚本文件分为几大类: 1.系统脚本: systems 包含通用飞机各部分功能模块组件以及自动飞行控件:Autopilot.xml 和 自动飞行的算法控件:GNCUtilities.x ...
- 线控性能比拼,MKZ与CRV作为自动驾驶开发平台的全面测评
全球自动驾驶创业公司最主流的测试开发用车是林肯MKZ,这是因为其高性能高精度的线控能力表现,易于使用逆向工程实现改装,以及存在成熟的线控改造服务提供商AS和Dataspeed,共同为自动驾驶初创及辅助 ...
- 自动驾驶定位算法-直方图滤波(Histogram Filter)定位
1.直方图滤波(Histogram Filter)的算法思想 直方图滤波的算法思想在于:它把整个状态空间dom(x(t))切分为互不相交的部分\(b_1.b_2....,b_{n-1}\),使得: 然 ...
- 2020云栖大会智慧出行专场:聚焦高精地图/算法、智能模型、自动驾驶、AR导航
2020云栖大会将于9月17日-18日在线举行,届时将通过官网为全球科技人带来前沿科技.技术产品.产业应用等领域的系列重要分享. 阿里巴巴高德地图携手合作伙伴精心筹备了“智慧出行”专场.我们将为大 ...
- 在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练
在OpenShift平台上验证NVIDIA DGX系统的分布式多节点自动驾驶AI训练 自动驾驶汽车的深度神经网络(DNN)开发是一项艰巨的工作.本文验证了DGX多节点,多GPU,分布式训练在DXC机器 ...
- 自动驾驶汽车数据不再封闭,Uber 开源新的数据可视化系统
日前,Uber 开源了基于 web 的自动驾驶可视化系统(AVS),称该系统为自动驾驶行业带来理解和共享数据的新方式.AVS 由Uber旗下负责自动驾驶汽车研发的技术事业群(ATG)开发,目前该系统已 ...
- 深度学习与自动驾驶领域的数据集(KITTI,Oxford,Cityscape,Comma.ai,BDDV,TORCS,Udacity,GTA,CARLA,Carcraft)
http://blog.csdn.net/solomon1558/article/details/70173223 Torontocity HCI middlebury caltech 行人检测数据集 ...
- 斯坦福大学公开课机器学习: neural networks learning - autonomous driving example(通过神经网络实现自动驾驶实例)
使用神经网络来实现自动驾驶,也就是说使汽车通过学习来自己驾驶. 下图是通过神经网络学习实现自动驾驶的图例讲解: 左下角是汽车所看到的前方的路况图像.左上图,可以看到一条水平的菜单栏(数字4所指示方向) ...
- julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域
编程界的新宠 Julia 发布 1.0 正式版本,多种优势集于一身2018-08-14 14:14 公司Julia 的累积下载次数超过 200 万,已被应用于自动驾驶汽车.机器人.3D 打印.精准医疗 ...
随机推荐
- JavaBean-EL-JSTL-MVC
JavaBean规范 类必须使用public修饰 必须保证有公共无参数构造器. (一般就是可以通过反射轻松的创建对象) 包含了属性的操作(给属性赋值,获取属性值). JavaBean中的成 ...
- linux下sublime输入中文
title: linux下sublime输入中文 date: 2017-11-09 20:54:43 tags: sublime categories: 开发工具 archlinux系统 下载文件 g ...
- C++内存分区:堆、栈、自由存储区、全局/静态存储区和常量存储区
日志 ...
- latex 参考文献
https://blog.csdn.net/garfielder007/article/details/51628565 https://www.cnblogs.com/BUAAdaozhong/p/ ...
- [Luogu]A%BProblem——线性筛素数与前缀和
题目描述 题目背景 题目名称是吸引你点进来的[你怎么知道的] 实际上该题还是很水的[有种不祥的预感..] 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m接下来n行, ...
- is 和 == 以及 编码和解码
1.is 比较的是内存地址 a="name" b="snow" print(a is b) # False id() 获取内存地址 a=" == ...
- Python 进程间数据交互
进程间通信:进程之间必须需要中间件. 不同进程间内存是不共享的,要想实现两个进程间的数据交换 Queues:实现传输两个进程的数据 线程queue,访问数据只能在一个进程内进行线程与线程之间的 ...
- Shell 脚本格式注意事项
if 条件判断格式 if [ ! -f file.txt ];then cmd else cmd fi 注1:! 代表非.不存在文件就成功. 注2:再有参数 变量 需要 [] 阔起 1 运算书写写格式 ...
- maven maven-war-plugin 解决java war项目间的依赖(两个war都可独立部署运行,maven 3.2.x亲测)
最近整理基础框架,有些项目不想分布式,所以基础框架必须同时可独立部署,也可直接被作为依赖和业务工程打到一起,记录下解决war项目依赖的要点,一开始用warpath,结果报找不到,有些帖子还是17年的, ...
- for循环介绍
流程控制之for循环names=['yb','zs','yxd','lb'] i=0 while i < len(names): #4 < 4 print(names[i]) i+=1 # ...