本文目的

由于在carla-autoware的示例中使用了hybrid A* 算法,所以本文基于以下两篇文章对hybrid A* 算法过程进行整理:(文中挑选了一些个人认为便于理解算法的图片,均来自于以下这两篇文章)

  1. 《Practical Search Techniques in Path Planning for Autonomous Driving》
  2. 《Path Planning in Unstructured Environments: A Real-time Hybrid A* Implementation for Fast and Deterministic Path Generation for the KTH Research Concept Vehicle》
  3. 第二篇论文ROS实现的github链接:https://github.com/karlkurzer/path_planner

其实我觉得对这两篇文章还有一些理解不到位的地方,望指正!下周看完autoware对应的源码之后再来更新这篇。

一、算法简介

解决的问题

该算法解决的问题是:假设无人车有充分的感知和定位能力,则其能够在线重新规划,生成障碍物地图,并且能够在未知环境中行驶。

其他算法中常见问题

开发实际无人驾驶的路径规划器存在的问题:

  1. 机器人的控制空间、轨迹空间都是连续的,而现存算法基本都是适用于离散情况的,所以生成的路径是不光滑的。
  2. 不满足机器人的非完整性约束

算法的大致过程

  1. 在连续坐标系下进行启发式搜索(改进了A*算法)
  2. 第二个阶段用数值非线性优化的方法(即共轭梯度下降法)对生成路径的“质量”进行提升,使其至少是局部最优的。(下文对这两个过程进行详细说明)

二、STAGE 1: 启发式搜索+损失函数设计

第一个阶段其实是对传统的A* 算法进行改进,与之不同的是,hybrid A* 是在连续坐标系下进行启发式搜索,并且能够保证生成的轨迹满足车辆非完整性约束(下文对车辆的非完整性约束进行补充),但算法运行过程中该路径并不一定是全局最优的,尽管如此,这条路径是在全局最优解的“附近”(这里的全局最优解指的是由传统A* 算法生成的)。下图(来自文献1)可以很好地解释传统A* 与hybrid A* 的异同。两种算法都是基于网格世界的(grid world),A* 是赋予每个网格的中心点相应的损失并且算法只访问这些中心点,而hybrid A* 是先在这些网格中挑选满足车辆3D连续状态的点,并将损失赋值给这些点。(下图中间的图是用其他A* 变体算法实现的)

1. 搜索中所用的两种启发函数

在传统的A* 算法中,由于启发函数的选取不同,运行算法后节点扩张(expansion)的效率也就不同(目的是希望算法在遍历最少的节点的情况下找到最优路径)。传统的A* 算法的启发函数一般是2D欧几里得距离,而hybrid A* 算法构造了两个启发函数。

  1. 第一个启发函数是Constrained heuristics ,只考虑车辆的非完整性约束而不考虑障碍物(优点是相比直接用欧几里得距离损失要好一个数量级)。该启发函数忽略了环境中的障碍物等信息,只考虑车辆的运动学特性,从终止点

    开始,计算从该点到其他点的最短路径。具体的返回值就是:
2.

第二个启发函数是第一个的对偶,称为Unconstrained heuristics,只考虑障碍物信息而不考虑车辆的非完整性约束条件(优点是引入该启发函数后能够发现2D空间中所有的U形障碍物和死胡同dead end)。随后使用2D动态规划的方法(其实就是传统的2D A* 算法)计算每个节点到终点的最短路径。

算法使用的损失函数就是两种启发函数的最大值。下图很好地解释了两种启发函数:图a,c是第一种启发函数下生成的路径,可以看出是连续的;而图b,d则是在第二种启发函数下生成的离散路径(与传统A* 算法得到的结果是类似的)

补充:车辆的微分/运动学约束——非完整性约束
车辆基本的构型空间是:

,车辆的速度是
。但在实际行驶中,车辆不能直接向左向右平移,也就是说垂直于车辆heading方向的速度为0,将下图中的
分解到
坐标下可以得到:
两者联立可以得到:
可以得到车辆的非完整性约束条件为:

2. 路径节点扩张的过程

论文中称节点扩张的过程为Analytic Expansions(解析扩张?)。首先状态的表示为:

,其中
是节点的位置,而
是节点的朝向(heading),在前文所述的搜索过程中,使用到的是离散的控制动作(control actions, or steering),因此之前每个网格中的连续状态点是不可达的。为了进一步改进搜索速度和提高准确度,这就可以利用Reed-Shepp曲线。A* 的搜索过程都是用直线相连接,而hybrid A* 则是在与网格精度一致的前提下(对应某一小段时间)使用三种控制动作:最大左转,最大右转,不转向来生成路径,因此该路径是一些受车辆转弯半径约束的圆弧和直线。

以上过程会生成一些子节点,在此基础上,假设不考虑环境(对应第一个启发函数),算法会通过计算从起点到终点的最优Reed-Shepp曲线的方式,再生成一个额外的子节点;之后算法基于现有的障碍物地图对该路径进行碰撞检测,无碰撞路径对应的点会加到扩张树中。可以看出与直线相比,Reed-Shepp曲线的计算量是很大的。所以论文中作者使用简单的selection rule,在每N个节点中选取一个计算Reed-Shepp曲线(这里的N随启发函数递减而减少,即越发靠近终点时,N越小)。下面这两张图也很好的解释了扩张过程。

3. 路径损失函数的设计

损失函数的设计困难在于所生成路径的要求太多:首先路径长度或损失应该是接近最优的;路径必须是光滑的;生成的路径必须与障碍物保持一定的距离(传统的人工势场法的缺点是在狭窄路段构造了高势场,使得机器人或车辆无法通过)

The key advantage of the Voronoi field over a conventional potential fields is the fact that the field value is scaled in proportion to the total available clearance for navigation. As a result, even narrow openings remain navigable, which is not always the case for standard potential fields.

解决方法:构造Voronoi势场函数(具体公式是下列三项连乘,voronoi场的物理意义我还没有搞清楚,之后查下相关资料),voronoi场的值随着导航中所有可行空间的大小成比例缩放。公式中

分别代表路径节点到最近的障碍物和最近的GVD(广义voronoi图)的长度,
控制场的衰减率(Falloff Rate)

下图很好地阐释了voronoi场的效果,使用voronoi场之后车辆也能很好地通过狭窄路段。

voronoi场有如下的一些特点:

  1. 时,场的值为0
  2. 该场函数
    的区间时[0, 1],且连续,
    不能同时为0。
  3. 在障碍物附近Voronoi场的值达到最大值
  4. Voronoi场的值在GVD的边上达到最小值

三、STAGE2: 对路径进行后处理

1. 进行后处理的目的

在上一步子节点扩张的过程中,路径会有一些额外的不必要控制动作(即steering),所以算法的第二个部分就是对生成点曲线进行平滑处理。

2. 后处理所用目标函数的组成

目标函数由以下四部分组成。

  1. 障碍物项

    :惩罚与障碍物的碰撞。公式中
    是路径节点的坐标,
    是最近障碍物的坐标,
    是最大障碍物的距离(类似阈值)。选择二次函数作为惩罚项的目的是放大障碍物与节点越来越靠近的效果。从公式可以看出,节点靠近障碍物的时候,第一项
    的值会减小,因此该差值的二次方变大。

2. 曲率项

该项相当于对路径的每个节点的瞬时曲率设置一个上限,这里
,并且
,惩罚函数是二次函数,即

3. 光滑度项smoothness——

光滑度项计算每个节点之间位移向量的差值的平方。这一项将损失值赋给非均匀分布和方向变化的节点,以保证路径的平滑性。

4. Voronoi Term——

这一项基于之前定义的voronoi场函数,使路径远离障碍物, (向量x就是路径点的坐标x, y)

优化阶段分为两个阶段: a. 对路径的顶点坐标进行非线性优化规划问题的建模(也就是上文的损失函数定义) b. 采用共轭梯度方法进行非参数化插值(non-parametrc interpolation) (这里具体的共轭梯度方法,学习了之后再更新)

四、hybrid A* 算法伪代码及实现流程

1. hybrid A* 算法伪代码: (这一部分之后看完autoware源码之后再详细地对比、解释)

与A*算法类似,算法也是维护两个列表,一个open list, 一个是closed list。算法的结束条件是:open list为空或者已经搜索到终点。Line 21: 算法不一定会准确搜索到终点,因此引入RoundState函数,在判断当前节点是否到达终点之前对此进行估算。如果没有达到终点,算法会通过执行动作空间中的所有动作对路径节点进行扩张。如果生成的节点不在C中(也就是没有被算法遍历过),则计算cost-so-far;如果生成的节点不在O中(已被遍历过)或者所得到的cost-so-far小于当前节点已有的cost,这时用当前得到的较小的cost更新cost-so-far

2. 算法实现的流程: 这里是第二篇文献中的实现流程,算法的输入为事先定义好的障碍物地图,经过以上的两步:hybrid A* 搜索和路径平滑之后在rviz中显示路径。

为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...相关推荐

  1. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_KDD2019: 使用神经网络为A*搜索算法赋能 --以个性化路径推荐为例...

    本文系 KDD2019 论文的解读: Wang, Jingyuan, Ning Wu, Wayne Xin Zhao, Fanzhang Peng, and Xin Lin. "Empowe ...

  2. KDD 2019 | 使用神经网络为A*搜索算法赋能:以个性化路径推荐为例

    「论文访谈间」是由 PaperWeekly 和中国中文信息学会社会媒体处理专委会(SMP)联合发起的论文报道栏目,旨在让国内优质论文得到更多关注和认可. 研究动机 A* 算法因为它的高效和准确而被广泛 ...

  3. 从哈密尔顿路径谈NP问题

    1859年,爱尔兰数学家哈密尔顿(Hamilton)提出下列周游世界的游戏:在正十二面体的二十个顶点上依次标记伦敦.巴黎.莫斯科等世界著名大城市,正十二面体的棱表示连接这些城市的路线.试问能否在图中做 ...

  4. 哈密尔顿算法matlab,复杂制造过程最优哈密尔顿圈算法的MATLAB仿真与分析.doc

    摘要:当今的工业制造过程越来越复杂,产品生产批量化,单个产品组成零部件数量庞大,加工需要多道工序,且工序间连续性强,整个制造过程属于离散制造,这样必然会使生产制造过程复杂化.在这种情况下,加工方案的制 ...

  5. 最短哈密尔顿圈matlab解法_复杂制造过程最优哈密尔顿圈算法的MATLAB仿真与分析.doc...

    摘要:当今的工业制造过程越来越复杂,产品生产批量化,单个产品组成零部件数量庞大,加工需要多道工序,且工序间连续性强,整个制造过程属于离散制造,这样必然会使生产制造过程复杂化.在这种情况下,加工方案的制 ...

  6. 最短汉密尔顿回路算法c语言,【算法】浅谈最短哈密尔顿回路类问题的两种近似算法...

    // 标题是糊弄人的 1. 问题引入 给出一张图,求其最短哈密尔顿回路,也就是 "旅行商问题"(Traveling Saleman Problem,TSP) 假设有一个旅行商人要拜 ...

  7. C语言实现哈密尔顿hamiltonian算法(附完整源码)

    C语言实现哈密尔顿hamiltonian算法 完整Graph.h 头文件 完整Graph.c 源文件文件 完整hamiltonian.c 源文件(main测试函数) 完整Graph.h 头文件 #in ...

  8. java哈密尔顿回路算法,用回溯方法求哈密尔顿回路——java求解

    // 哈密尔顿回路问题 public class Hamilton { // 图中顶点个数为n,图的邻接矩阵为c[][],存放回路的顶点序号x[],在这里,n个顶点的标号是:0,1,2,...,n-1 ...

  9. 图论及其应用-哈密尔顿图(alpha)

    http://www.cnblogs.com/titer1/archive/2011/04/12/2014226.html 图论及其应用-哈密尔顿图(alpha)   小结:2010-04..todo ...

最新文章

  1. IE8经常停止工作和显示异常
  2. 放心,GPT-3不会“杀死”编程
  3. Ghost XP基本介绍
  4. 数据建模学习笔记-2-《高质量数据库建模 2-建模流程》
  5. 移动端网页特效:左右滑动开关
  6. mysql中局部变量说法正确的是_mysql全局变量和局部变量
  7. 如何优雅地向导师/老板表示:“上周工作没什么进展”?
  8. python提供什么机制处理程序运行错误_浅谈Python异常处理机制
  9. 深度揭秘“蚂蚁双链通”
  10. opencv 扩大区域_python-----opencv图像边界扩充
  11. python tkinter画笑脸_python – 如何在tkinter窗口中绘制图像
  12. WINDOWS10更改主题
  13. c语言 宏定义 去除宏定义_如何在C中重新定义宏?
  14. linux进阶-PHP加速器
  15. spring @lazy注解的使用
  16. 【PPT】连续使用箭头等工具,避免多次重复选择,提升效率
  17. n9009+android+4.4.2,三星N9009 (Galaxy Note 3 电信版 Android 4.4)ROOT教程,一键获取ROOT权限...
  18. v-for错误:应为数组元素析构模式
  19. Kotlin-Android世界的一股清流-Class类
  20. 读jQuery 权威指南[5]-插件

热门文章

  1. “您的Microsoft Internet Explorer浏览器包含最新版本的内置Adobe Flash Player“解决
  2. Android开发之添加QQ群的方法(官方代码)
  3. 6月19日 NSFileHandle文件类的常用方法
  4. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...
  5. (效果一)js实现上拉加载
  6. 来自东软的 OpenStack 负载均衡即服务开源项目
  7. 关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码
  8. Android之系统架构
  9. 微软MCP之SharePoint2007考试试题(Microsoft 70-542)
  10. 20071103网工考试