本文目的
由于在carla-autoware的示例中使用了hybrid A* 算法,所以本文基于以下两篇文章对hybrid A* 算法过程进行整理:(文中挑选了一些个人认为便于理解算法的图片,均来自于以下这两篇文章)
- 《Practical Search Techniques in Path Planning for Autonomous Driving》
- 《Path Planning in Unstructured Environments: A Real-time Hybrid A* Implementation for Fast and Deterministic Path Generation for the KTH Research Concept Vehicle》
- 第二篇论文ROS实现的github链接:https://github.com/karlkurzer/path_planner
其实我觉得对这两篇文章还有一些理解不到位的地方,望指正!下周看完autoware对应的源码之后再来更新这篇。
一、算法简介
解决的问题
该算法解决的问题是:假设无人车有充分的感知和定位能力,则其能够在线重新规划,生成障碍物地图,并且能够在未知环境中行驶。
其他算法中常见问题
开发实际无人驾驶的路径规划器存在的问题:
- 机器人的控制空间、轨迹空间都是连续的,而现存算法基本都是适用于离散情况的,所以生成的路径是不光滑的。
- 不满足机器人的非完整性约束
算法的大致过程
- 在连续坐标系下进行启发式搜索(改进了A*算法)
- 第二个阶段用数值非线性优化的方法(即共轭梯度下降法)对生成路径的“质量”进行提升,使其至少是局部最优的。(下文对这两个过程进行详细说明)
二、STAGE 1: 启发式搜索+损失函数设计
第一个阶段其实是对传统的A* 算法进行改进,与之不同的是,hybrid A* 是在连续坐标系下进行启发式搜索,并且能够保证生成的轨迹满足车辆非完整性约束(下文对车辆的非完整性约束进行补充),但算法运行过程中该路径并不一定是全局最优的,尽管如此,这条路径是在全局最优解的“附近”(这里的全局最优解指的是由传统A* 算法生成的)。下图(来自文献1)可以很好地解释传统A* 与hybrid A* 的异同。两种算法都是基于网格世界的(grid world),A* 是赋予每个网格的中心点相应的损失并且算法只访问这些中心点,而hybrid A* 是先在这些网格中挑选满足车辆3D连续状态的点,并将损失赋值给这些点。(下图中间的图是用其他A* 变体算法实现的)
1. 搜索中所用的两种启发函数
在传统的A* 算法中,由于启发函数的选取不同,运行算法后节点扩张(expansion)的效率也就不同(目的是希望算法在遍历最少的节点的情况下找到最优路径)。传统的A* 算法的启发函数一般是2D欧几里得距离,而hybrid A* 算法构造了两个启发函数。