发明内容
本发明提供一种基于边界查找的双向跳点搜索无人车路径规划方法,从正向和反向进行跳点交替迭代搜索,通过边界查找提高水平和垂直方向上跳点的搜索速度,减少搜索跳点所涉及的大量迭代,设计改进的启发式估价函数提高路径寻优速度,保证路径最优性,采用微分平坦方法对生成的路径节点作曲线拟合,保证路径的连续性、平滑性和安全性。
为达到上述目的,本发明提供一种基于边界查找的双向跳点搜索无人车路径规划方法,包括以下步骤:
S1、使用膨胀法对障碍物进行处理,采用栅格法划分搜索区域;
S2、将正向搜索和反向搜索的起始节点分别放入OpenList1和OpenList2中;
S3、正向搜索;
S4、反向搜索;
S5、从正向和反向进行跳点交替迭代搜索;
S6、搜索成功并保存正反方向搜索的路径节点即跳点坐标数据;
S7、采用微分平坦方法对生成的路径节点作曲线拟合;
所述的S1中,使用膨胀法对障碍物进行处理:
本专利中无人车和障碍物都可视为凸多边形,故采用Minkowski和的方法求解临界多边形,以无人车宽度一半为半径的圆B0,作B0与障碍物M的Minkowski和,以和的边界为障碍物拓展的边界。计算公式如下:
所述的S3中,正向搜索具体包括以下子步骤:
S31、正向扩展子节点,判断当前节点是否为反向搜索的当前节点,若是则跳转到S6,否则继续执行以下步骤;
S32、依据剪枝规则去掉冗余的对称节点,确定强制邻节点和跳点:
无人车在栅格地图上扩展子节点分为直线方向和对角线方向,对于直线方向,裁剪掉所有符合以下条件的节点n:
len(<p(a),…,n>\a)≤len(<p(a),a,n>)
其中:len(<p(a),…,n>\a)表示从p(a)节点不经过a节点到达n节点的最短路径,len(<p(a),a,n>)表示从p(a)节点经过a节点到达n节点的最短路径,a表示a节点,n表示n节点,p(a)表示节点a的父节点;
对于对角线方向,裁剪掉所有符合以下条件的节点n:
len(<p(a),…,n>\a)<len(<p(a),a,n>)
对于强制邻节点,根据以下规则进行筛选:
len(<p(a),a,n>)<len(<p(a),…,n>\a)
S33、利用边界查找优化水平和垂直方向节点搜索和跳点识别,且将跳点添加到OpenList1中:
边界查找:
从正向搜索和反向搜索两个方面记录障碍边界的位置,障碍物由其边界的位置来定义,通过对网格进行预处理并记录这些边界的位置,边界查找不会在垂直或水平方向上迭代每个相邻单元格,相反,它会查找这些方向上是否存在边界或障碍物,并立即评估当前节点是否为跳点,并通过直接查找来减少在算法中搜索跳点所涉及的大量迭代,当在水平方向上的边界比其上方和下方所在行的重新打开值更远时,会识别左、右两边的跳点,垂直方向的工作原理相同,只是检查相邻列而不是行,东西方向使用水平边界查找表,南北方向使用垂直边界查找表;
跳点识别规则可表示为:b=a+kd,从a节点出发,通过在d方向移动k步到达b,其中拥有最小k的节点b称为a的跳点,且满足如下条件之一:
(1)节点b为目标节点;
(2)节点b含有至少一个强制邻节点;
(3)若d为对角线移动,存在c=b+kidi,其中ki∈N,c是b的跳点,则b也是a的跳点;
S34、采用改进的正向启发式估价函数计算OpenList1中代价最小的跳点;
正向启发式估价函数为:
f(n)=gi(n)+hi(n)+cross×0.001
其中:f(n)表示正向搜索从起始节点到当前节点到目标节点的代价函数,g
i(n)表示起始节点到当前节点的累计实际代价,h
i(n)表示当前节点到目标节点的估计代价,
cross表示原起始节点指向原目标节点的向量与当前节点指向原目标节点向量的内积,向量下标s表示起始节点,c表示当前节点,e表示目标节点,且采用欧式距离作距离表达;
S35、将代价最小的跳点添加到CloseList1中。
所述的S4中,反向搜索具体包括以下子步骤:
S41、反向扩展子节点,判断当前节点是否为正向搜索的当前节点,若是则跳转到S6,否则继续执行以下步骤;
S42、依据剪枝规则去掉冗余的对称节点,规则与正向搜索相同,确定强制邻节点和跳点:
S43、利用边界查找优化节点搜索和跳点识别,边界查找优化原理和跳点识别规则与正向搜索相同,且将跳点添加到OpenList2中:
S44、采用改进的反向启发式估价函数计算OpenList2中代价最小的跳点;
反向启发式估价函数为:
f′(n)=gj(n)+hj(n)+cross×0.001
其中:f′(n)表示反向搜索从起始节点到当前节点到目标节点的代价函数,gj(n)表示起始节点到当前节点的累计实际代价,hj(n)表示当前节点到目标节点的估计代价,且采用欧式距离作距离表达;
S45、将代价最小的跳点添加到CloseList2中。
所述的S5中,从正向和反向进行跳点交替迭代搜索的过程如下:
Bs表示正向搜索的起始节点,Bg表示反向搜索的起始节点,首先进行正向搜索,以Bs为正向搜索的起始节点,Bg为正向搜索的目标节点进行子节点扩展搜索,直到搜索到代价最小的跳点B1;切换为反向搜索,以Bg为反向搜索的起始节点,B1为反向搜索的目标节点进行搜索,搜索到代价最小跳点Bn;切换为正向搜索,以Bs为正向搜索的起始节点,Bn为正向搜索的目标节点进行搜索,以此进行交替迭代搜索,直到正向和反向搜索的当前节点重合,则说明已经发现了一条完整路径。
算法交替迭代方法如下所示:
其中:Bs(xs,ys)表示原起始节点Bs的横纵坐标,Bg(xg,yg)表示原目标节点Bg的横纵坐标,B1(x1,y1)表示正向搜索代价最小的跳点B1的横纵坐标,Bn(xn,yn)表示反向搜索代价最小的跳点Bn的横纵坐标。
本发明具有如下有益效果:
1.通过边界查找水平和垂直方向上是否存在边界或障碍物,并立即评估当前节点是否为跳点,以提高水平和垂直方向上跳点的搜索速度,减少搜索跳点所涉及的大量迭代;
2.设计双向改进的启发式估价函数,从正向和反向进行交替迭代路径搜索,使得路径搜索时间和扩展节点大大减少,提高路径寻优速度,保证路径最优性;
3.采用微分平坦方法对生成的路径节点作曲线拟合,避免与障碍物碰撞,保证路径的连续性、平滑性和安全性。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明进行进一步详细说明。
如图1所示,本发明提供了一种基于边界查找的双向跳点搜索无人车路径规划方法,具体包括以下步骤:
S1、使用膨胀法对障碍物进行处理,采用栅格法划分搜索区域,具体包括以下子步骤;
S11、本专利中无人车和障碍物都可视为凸多边形,故采用Minkowski和的方法求解临界多边形,以无人车宽度一半为半径的圆B0,作B0与障碍物M的Minkowski和,以和的边界为障碍物拓展的边界。计算公式如下:
S12、以一定的长度C将无人车移动平面离散化,划分为若干等分的栅格,对每个栅格进行编号,并将存在障碍物的栅格标记为黑色,表示不可通行,不存在障碍物的栅格标记为白色,表示可通行。
S2、将正向搜索和反向搜索的起始节点分别放入OpenList1和OpenList2中;
S3、正向搜索,具体包括以下子步骤:
S31、正向扩展子节点,判断当前节点是否为反向搜索的当前节点,若是则跳转到S6,否则继续执行以下步骤;
S32、依据剪枝规则去掉冗余的对称节点,确定强制邻节点和跳点:
无人车在栅格地图上扩展子节点分为直线方向和对角线方向,对于直线方向,裁剪掉所有符合以下条件的节点n:
len(<p(a),…,n>\a)≤len(<p(a),a,n>)
其中:len(<p(a),…,n>\a)表示从p(a)节点不经过a节点到达n节点的最短路径,len(<p(a),a,n>)表示从p(a)节点经过a节点到达n节点的最短路径,a表示a节点,n表示n节点,p(a)表示节点a的父节点;
对于对角线方向,裁剪掉所有符合以下条件的节点n:
len(<p(a),…,n>\a)<len(<p(a),a,n>)
对于强制邻节点,根据以下规则进行筛选:
len(<p(a),a,n>)<len(<p(a),…,n>\a)
S33、利用边界查找优化水平和垂直方向节点搜索和跳点识别,且将跳点添加到OpenList1中:
边界查找:
从正向搜索和反向搜索两个方面记录障碍边界的位置,障碍物由其边界的位置来定义,通过对网格进行预处理并记录这些边界的位置,边界查找不会在垂直或水平方向上迭代每个相邻单元格,相反,它会查找这些方向上是否存在边界或障碍物,并立即评估当前节点是否为跳点,并通过直接查找来减少在算法中搜索跳点所涉及的大量迭代,当在水平方向上的边界比其上方和下方所在行的重新打开值更远时,会识别左、右两边的跳点,垂直方向的工作原理相同,只是检查相邻列而不是行,东西方向使用水平边界查找表,南北方向使用垂直边界查找表;
跳点识别规则可表示为:b=a+kd,从a节点出发,通过在d方向移动k步到达b节点,其中拥有最小k的节点b称为a的跳点,且满足如下条件之一:
(1)节点b为目标点;
(2)节点b含有至少一个强制邻节点;
(3)若d为对角线移动,存在c=b+kidi,其中ki∈N,c是b的跳点,则b也是a的跳点;
S34、采用改进的正向启发式估价函数计算OpenList1中代价最小的跳点;
正向启发式估价函数为:
f(n)=gi(n)+hi(n)+cross×0.001
其中:f(n)表示正向搜索从起始节点到当前节点到目标节点的代价函数,g
i(n)表示起始节点到当前节点的累计实际代价,h
i(n)表示当前节点到目标节点的估计代价,
cross表示原起始节点指向原目标节点的向量与当前节点指向原目标节点向量的内积,向量下标s表示起始节点,c表示当前节点,e表示目标节点,且采用欧式距离作距离表达;
S35、将代价最小的跳点添加到CloseList1中。
S4、反向搜索,具体包括以下子步骤:
S41、反向扩展子节点,判断当前节点是否为正向搜索的当前节点,若是则跳转到S6,否则继续执行以下步骤;
S42、依据剪枝规则去掉冗余的对称节点,规则与正向搜索相同,确定强制邻节点和跳点:
S43、利用边界查找优化节点搜索和跳点识别,边界查找优化原理和跳点识别规则与正向搜索相同,且将跳点添加到OpenList2中:
S44、采用改进的反向启发式估价函数计算OpenList2中代价最小的跳点;
反向启发式估价函数为:
f′(n)=gj(n)+hj(n)+cross×0.001
其中:f′(n)表示反向搜索从起始节点到当前节点到目标节点的代价函数,gj(n)表示起始节点到当前节点的累计实际代价,hj(n)表示当前节点到目标节点的估计代价,且采用欧式距离作距离表达。
S45、将代价最小的跳点添加到CloseList2中。
S5、从正向和反向进行跳点交替迭代搜索,如图2所示:
Bs表示正向搜索的起始节点,Bg表示反向搜索的起始节点,首先进行正向搜索,以Bs为正向搜索的起始节点,Bg为正向搜索的目标节点进行子节点扩展搜索,直到搜索到代价最小的跳点B1;切换为反向搜索,以Bg为反向搜索的起始节点,B1为反向搜索的目标节点进行搜索,搜索到代价最小跳点Bn;切换为正向搜索,以Bs为正向搜索的起始节点,Bn为正向搜索的目标节点进行搜索,以此进行交替迭代搜索,直到正向和反向搜索的当前节点重合,则说明已经发现了一条完整路径。
算法交替迭代方法如下所示:
其中:Bs(xs,ys)表示原起始节点Bs的横纵坐标,Bg(xg,yg)表示原目标节点Bg的横纵坐标,B1(x1,y1)表示正向搜索代价最小的跳点B1的横纵坐标,Bn(xn,yn)表示反向搜索代价最小的跳点Bn的横纵坐标。
S6、搜索成功并保存正反方向搜索的路径节点即跳点坐标数据,即从起始节点到目标节点所经过的路径节点B1~Bn;
S7、采用微分平坦方法对生成的路径节点作曲线拟合;
首先将路径建模为多项式方程模型,具体为:
其中:p为多项式轨迹参数,可以将之设置为参数向量:
p=[p0,p1,…,pn]Τ
进一步将上述轨迹表述成向量形式:
p(t)=[1,t,t2,…,tn]·p
对于任意时刻t,可以根据参数计算出轨迹的位置、速度、加速度,jerk、snap等。
v(t)=p′(t)=[0,1,2t,3t2,4t3,...,ntn-1p
a(t)=p″(t)=[0,0,2,6t,12t2,...,n(n-1)tn-2]·p
若将相邻跳点连线为一段,采用JPS跳点搜索求得的路径可以看成由多条线段连接构成,对每一段线段采用多项式作曲线拟合,形如:
其中:k为轨迹段数,pi=[pi0,pi1,...,pin]Τ表示第i段轨迹的参数向量。
路径优化的目的是:求出多项式轨迹参数p1,p2,...,pk,采用minimum snap:mimf(p)=mim(p(4)(t))2,最小化目标函数snap,构建优化函数如下:
其中:r和c为矩阵从0开始的行索引和列索引。对
进行化简,
则,
转化为二次规划问题。为保证两段轨迹之间连续,轨迹经过路径节点所在栅格,避免与障碍物碰撞,需满足以下约束条件:
其中:S表示约束放宽的长度。
给定包含起始节点和目标节点在内的n+2个二维路径点Bs,B1,...,Bn,Bg,Bs(xs,ys),Bi(xi,yi),Bg(xi,yi),求解拟合后的路径。
结合具体实施例,对基于边界查找的双向加权JPS跳点搜索方法作进一步说明,图3为基于边界查找的双向JPS跳点搜索方法示意图,尺寸为18×14的栅格地图,在图中,采用字母A~T、A1~T1和数字1~16分别对栅格地图边界的横向和纵向单元格作标记,黑色单元格表示使用膨胀法处理后的障碍物栅格,s和g分别表示起始节点和目标节点,p1~p9表示跳点,每条横向和垂直方向的黑色带箭头虚线代表一次边界查找的跳点搜索,黑色带箭头实线为最终搜索到的路径。
表1和表2为与图3相对应的正向和反向搜索边界查找表。
表1正向搜索边界查找表
表2反向搜索边界查找表
表1和表2中的值记录了横向和垂直边界查找的单元格在阻塞和开放状态之间切换的边界,正向搜索边界查找的横向边界查找的正方向为自左向右,垂直边界查找的正方向为自上而下;反向搜索边界查找的横向边界查找的正方向为自右向左,垂直边界查找的正方向为自上而下。
如表1中横向边界查找,第1行,在单元格A所在列为地图边界呈现阻塞状态,记录为Cells 1:(A);第2~7行,在单元格A所在列为地图边界呈现阻塞状态,在单元格B所在列重新打开呈现开放状态,在单元格L所在列为障碍物边界呈现阻塞状态,在单元格M所在列重新打开呈现开放状态,再到地图边界T所在列,记录为Cells 2to 7:(A,B,L,M,T);第8行,在单元格A所在列为地图边界呈现阻塞状态,在单元格B所在列重新打开呈现开放状态,在单元格G所在列为障碍物边界呈现阻塞状态,在单元格I所在列重新打开呈现开放状态,在单元格L所在列为障碍物边界呈现阻塞状态,在单元格M所在列重新打开呈现开放状态,再到地图边界T所在列,记录为Cells 8:(A,B,G,I,L,M,T);第9~10行,在单元格A所在列为地图边界呈现阻塞状态,在单元格B所在列重新打开呈现开放状态,在单元格G所在列为障碍物边界呈现阻塞状态,在单元格I所在列重新打开呈现开放状态,在单元格L所在列为障碍物边界呈现阻塞状态,在单元格M所在列重新打开呈现开放状态,在单元格P所在列为障碍物边界呈现阻塞状态,在单元格Q所在列重新打开呈现开放状态,再到地图边界T所在列,记录为Cells 9to 10:(A,B,G,I,L,M,P,Q,T);第11~15行,在单元格A所在列为地图边界呈现阻塞状态,在单元格B所在列重新打开呈现开放状态,在单元格G所在列为障碍物边界呈现阻塞状态,在单元格I所在列重新打开呈现开放状态,在单元格P所在列为障碍物边界呈现阻塞状态,在单元格Q所在列重新打开呈现开放状态,再到地图边界T所在列,记录为Cells11to 15:(A,B,G,I,P,Q,T)。
垂直边界查找原理与横向边界查找相同,此处不在作过多赘述。表中的每个奇数位都是障碍物或地图边界的位置,而每个偶数位都是边界重新打开可通行网格空间的位置,例如Cells 9to 10:(A,B,G,I,L,M,P,Q,T)中,奇数位有A、G、L、P和T均表示障碍物或地图边界的位置,偶数位有B、I、M、Q均表示边界重新打开可通行的网格空间的位置。
传统双向JPS跳点搜索中跳点识别方法是从直线和对角线方向上迭代每个相邻单元格,例如,在图3中从s起始节点搜索到p1跳点,需要水平检查1+1+2+2+3次和垂直检查1+10+11+11+12次,对角线检查6次,共60次迭代检查。而使用本专利的基于边界查找的双向加权跳点搜索方法,对每个轴仅执行一次检查以确定节点是否为跳点,对于水平检查,每次检查涉及查询节点的上面一行、同一行和下面一行的边界距离,共检查19次,显然采用本专利的方法识别跳点速度更快且能保证路径最优。
最后对本实施例搜索到的路径,采用微分平坦方法对生成的路径节点作曲线拟合,路径节点包括s(2,2)、p1(5,5)、p2(16,6)、p3(5,8)、p4(16,7)、p5(6,9)、p6(15,8)、p7(7,9)、p8(12,5)、p9(16,5)、g(18,4),搜索到的路径总长度为25.8m,拟合后的路径如图4所示。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,任何熟悉本专业的技术人员在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容做出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所做的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。