忧郁的大能猫
好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
if u.d + w < v.d 则更新)。众所周知,无人驾驶大致可以分为三个方面的工作:感知,决策及控制。
路径规划是感知和控制之间的决策阶段,主要目的是考虑到车辆动力学、机动能力以及相应规则和道路边界条件下,为车辆提供通往目的地的安全和无碰撞的路径。
路径规划问题可以分为两个方面:
(一)全局路径规划:全局路径规划算法属于静态规划算法,根据已有的地图信息(SLAM)为基础进行路径规划,寻找一条从起点到目标点的最优路径。
通常全局路径规划的实现包括Dijikstra算法,A*算法,RRT算法等经典算法,也包括蚁群算法、遗传算法等智能算法;
(二)局部路径规划:局部路径规划属于动态规划算法,是无人驾驶汽车根据自身传感器感知周围环境,规划处一条车辆安全行驶所需的路线,常应用于超车,避障等情景。通常局部路径规划的实现包括动态窗口算法(DWA),人工势场算法,贝塞尔曲线算法等,也有学者提出神经网络等智能算法。
RRT算法,即快速随机树算法(Rapid Random Tree),是LaValle在1998年首次提出的一种高效的路径规划算法。RRT算法以初始的一个根节点,通过随机采样的方法在空间搜索,然后添加一个又一个的叶节点来不断扩展随机树。
当目标点进入随机树里面后,随机树扩展立即停止,此时能找到一条从起始点到目标点的路径。算法的计算过程如下:
step1:初始化随机树。将环境中起点作为随机树搜索的起点,此时树中只包含一个节点即根节点;
stpe2:在环境中随机采样。在环境中随机产生一个点,若该点不在障碍物范围内则计算随机树中所有节点到的欧式距离,并找到距离最近的节点,若在障碍物范围内则重新生成并重复该过程直至找到;
stpe3:生成新节点。在和连线方向,由指向固定生长距离生成一个新的节点,并判断该节点是否在障碍物范围内,若不在障碍物范围内则将添加到随机树 中,否则的话返回step2重新对环境进行随机采样;
step4:停止搜索。当和目标点之间的距离小于设定的阈值时,则代表随机树已经到达了目标点,将作为最后一个路径节点加入到随机树中,算法结束并得到所规划的路径。
RRT算法由于其随机采样及概率完备性的特点,使得其具有如下优势:
(1)不需要对环境具体建模,有很强空间搜索能力;
(2)路径规划速度快;
(3)可以很好解决复杂环境下的路径规划问题。
但同样是因为随机性,RRT算法也存在很多不足的方面:
(1)随机性强,搜索没有目标性,冗余点多,且每次规划产生的路径都不一样,均不一是最优路径;
(2)可能出现计算复杂、所需的时间过长、易于陷入死区的问题;
(3)由于树的扩展是节点之间相连,使得最终生成的路径不平滑;
(4)不适合动态环境,当环境中出现动态障碍物时,RRT算法无法进行有效的检测;
(5)对于狭长地形,可能无法规划出路径。
主流程:
1. 根据海图元素(点、线)生成障碍物点集,并构建一个二维网格地图(grid map)。
2. 在每个网格上标记是否可通行(isWalkable)。
3. 提供从起点到终点的路径规划接口(A* 或 DFS)。
4. 对规划出的路径做二次优化(去除冗余拐点)。
栅格化
栅格的区域的确定
选择起点到终点区域
获取所有线和点的信息
遍历所有点确定minx、miny、maxx、maxy形成的矩形框
起点和终点必在矩形框中
确定格子的长度
按照格子的长度在线段之间补充点,以保证格子可以覆盖到
进行障碍物膨胀(将障碍物所在格子及其周围 extend_num 范围内的格子都设为不可通行)
格子的数据结构的定义
map
vector<vector<grid>> map
grid
index
x*grid_num + y
区域类型
是否可行走
经纬度坐标,格子的中心点
相对坐标和绝对经纬度的转换
格子的绘制和显示
先画格子的线
不可行走区的绘制
灰色
路径规划
规划算法
起始点所在的格子
getGridIndex(double x, double y) 通过经纬度坐标,获取格子的索引,进行得到起始点的格子
深度优先遍历
输出为格子的路径
path
vector<grid>
异常情况处理
起点和终点在不可行走区域
增加一个检查的函数,航路规划前进行判断,若在不可行走区域则进行提示
起点终点在封闭区域内
进行规划,如果探索过的区域只占很小一部分,则可以判断起点在封闭区域内
如果规划的路径为空,则说明终点在封闭区域内
绘制规划的路径所在的格子
绘制初始路径
绘制探索过的格子
路径二次优化
根据是否和其他多边形相交来逐步优化路径
绘制优化后的路径
绘制优化后的路径
路径平滑化:通过在已有路径上进行局部调整,使得路径更加平滑和自然,从而降低路径的曲率和不连续性。
路径连接优化:优化路径的连接方式,以减少转折和不必要的拐弯,从而提高路径的连续性。
剪枝算法:通过移除不必要或冗余的路径部分,减少路径的长度和复杂性。
曲线拟合:将原始路径的曲线部分拟合为更平滑的曲线,以减少路径的曲率,例如使用贝塞尔曲线拟合。
下图的5个凸多边形是已经生成的导航网格,多边形外部的区域为不可行走区域,current为起点,goal为终点,从图中就可以看出最短路径为图中红线,蓝色圈出的点为我们需要找出的点。所有多边形顶点均按逆时针方向存储

(1)下图显示出各区域之间的入口,即多边形的临边。由图中可以看出每个临边均为起点穿出该多边形区域的边,故以下称该边为穿出边。

(2)首先找到起始点所在的多边形和穿出边的两个端点,由起点连接两个端点,形成两个线段lineLeft 和lineRight。如下图。绿色圈表示左点,红色表示右点(左点、右点是根据多边形顶点保存顺序而来)。

(3)继续找到下一个穿出边的两个端点,判断新的左点是否在lineLeft 和lineRigh之间,如果在,则更新lineLeft为起点到新左点的线段。

同样处理新穿出边的右点,如下图

该步最后得到两个新的线段,如下图。

(4) 继续判断下一个穿出边的两个端点,如下图,新的左点在lineLeft和lineRight的外面,则不更新线段。

下图说明新的右点在两条直线之间,更新lineRight。

该步最后得到两个新的线段,如下图。

(5) 继续循环判断下一个穿出边的两个端点,该穿出边的两个端点都在lineRight的右侧,表示lineRight的终点即为路径的一个拐角点。

(6) 循环以上步骤都可以找到从起点到终点的一条完整路径。