0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种基于Frenet坐标系的优化轨迹动作规划方法

电子工程师 来源:未知 作者:李倩 2018-07-09 09:33 次阅读

动作规划动作在无人车规划模块的最底层,它负责根据当前配置和目标配置生成一序列的动作。本文介绍一种基于Frenet坐标系的优化轨迹动作规划方法,该方法在高速情况下的高级车道保持和无人驾驶都具有很强的实用性,是目前普遍采用的一种动作规划算法

基于 Frenet 坐标系的动作规划方法由于是由 BMW 的 Moritz Werling 提出的,为了简便,我们在后文中也会使用 Werling 方法简称。在讨论基于Frenet 坐标系的动作规划方法之前,我们首先得定义什么是最优的动作序列:对于横向控制而言,假定由于车辆因为之前躲避障碍物或者变道或者其他制动原因而偏离了期望的车道线,那么此时最优的动作序列(或者说轨迹)是在车辆制动能力的限制下,相对最安全,舒适,简单和高效的轨迹。

同样的,纵向的最优轨迹也可以这么定义:如果车辆此时过快,或者太接近前方车辆,那么就必须做减速,具体什么是“舒适而又简单的”减速呢?我们可以使用Jerk这个物理量来描述,Jerk 即加速度的变化率,也即加速度,通常来说,过高的加速度会引起乘坐者的不适,所以,从乘坐舒适性而言,应当优化 Jerk 这个量,同时,引入轨迹的制动周期T, 即一个制动的操作时间:

▌为什么使用 Frenet 坐标系

在 Frenet 坐标系中,我们使用道路的中心线作为参考线,使用参考线的切线向量t和法线向量n建立一个坐标系,如下图的右图所示,这个坐标系即为Frenet 坐标系,它以车辆自身为原点,坐标轴相互垂直,分为s方向(即沿着参考线的方向,通常被称为纵向,Longitudinal)和d方向(即参考线当前的法向,被称为横向,Lateral),相比于笛卡尔坐标系(下图的作图),Frenet 坐标系明显地简化了问题,因为在公路行驶中,我们总是能够简单的找到道路的参考线(即道路的中心线),那么基于参考线的位置的表示就可以简单的使用纵向距离(即沿着道路方向的距离)和横向距离(即偏离参考线的距离)来描述,同样的,两个方向的速度( 和 )的计算也相对简单。

那么现在我们的动作规划问题中的配置空间就一共有三个维度:(s,d,t),t是我们规划出来的每一个动作的时间点,轨迹和路径的本质区别就是轨迹考虑了时间这一维度。

Werling 的动作规划方法一个很关键的理念就是将动作规划这一高维度的优化问题分割成横向和纵向两个方向上的彼此独立的优化问题,具体来看下面的图:

假设我们的上层(行为规划层)要求当前车辆在t8越过虚线完成一次变道,即车辆在横向上需要完成一个Δd以及纵向上完成一个Δs的移动,则可以将s和d分别表示为关于t的函数:s(t)和d(t)(上图右图),那么 d,s关于时间tt的最优轨迹应该选择哪一条呢?通过这种转换原来的动作规划问题被分割成了两个独立的优化问题,对于横向和纵向的轨迹优化,我们选取损失函数C,将使得C最小的轨迹作为最终规划的动作序列。而Werling方法中损失函数的定义,则与我们前面提到的加速度 Jerk 相关。

▌Jerk 最小化和 5 次轨迹多项式求解

由于我们将轨迹优化问题分割成了s和d两个方向,所以 Jerk 最小化可以分别从横向和纵向进行,令p为我们考量的配置(即s或d),加速度Jt关于配置p在时间段t1−t0内累计的 Jerk 的表达式为:

现在我们的任务是找出能够使得Jt(p(t))最小的p(t),Takahashi的文章——Local path planning and motion control for AGV in positioning中已经证明,任何 Jerk 最优化问题中的解都可以使用一个 5 次多项式来表示:

要解这个方程组需要一些初始配置和目标配置,以横向路径规划为例,初始配置为,即 t0 时刻车辆的横向偏移,横向速度和横向加速度为,即可得方程组:

为了区分横向和纵向,我们使用和 来分别表示 d 和 s 方向的多项式系数,同理,根据横向的目标配置可得方程组:

我们通过令t0=0来简化这个六元方程组的求解,可直接求得为:

令T=t1−t0,剩余的三个系数,可通过解如下矩阵方程得到:

该方程的解可以通过 Python 的 Numpy 中的np.linalg.solve简单求得。至此,我们在给定任意的初始配置,目标配置以及制动时间 T 的情况下,可以求的对应的 d 方向关于时间 t 的五次多项式的系数,同理,可以使用相同的方法来求解纵向(即 s 方向)的五次多项式系数。

那么问题来了,我们如何去确定最优的轨迹呢?Werling 方法的思路是通过一组目标配置来求得轨迹的备选集合,然后在备选集合中基于 Jerk 最小化的原则选择最优轨迹,我们仍然以d方向的优化轨迹为例讲解:

我们可以取如下目标配置集合来计算出一组备选的多项式集合:

对于优化问题而言,我们实际上希望车辆最终沿着参考线(道路中心线)平行的方向行驶,所以我们令,那么目标配置只涉及 didi 和 TjTj 两个变量的组合,而这两个变量在无人驾驶的应用场景中实际上是受限的,我们可以通过定义(dmin,dmax) 和 (Tmin,Tmax) 来约束目标配置的取值范围,通过 Δd 和 ΔT 来限制采样密度,从而在每一个制动周期获得一个有限的备选轨迹集合,如下图所示:

要在备选集合中选择最优轨迹(即上图中的绿色轨迹),我们需要设计损失函数,对于不同的场景,损失函数也不相同,以横向轨迹为例,在较高速度的情况下,损失函数为:

该损失函数包含三个惩罚项:

:惩罚Jerk大的备选轨迹; 

:制动应当迅速,时间短; 

:目标状态不应偏离道路中心线太远

其中kj,kt和kd是这三个惩罚项的系数,它们的比值大小决定了我们的损失函数更加注重哪一个方面的优化,由此我们可以算出所有备选轨迹的损失,取损失最小的备选轨迹作为我们最终的横向轨迹。

值得注意的是,以上的损失函数仅适用于相对高速度的场景,在极端低速的情况下,车辆的制动能力是不完整的,我们不再将d表示为关于时间t的五次多项式,损失函数也会略有不同,但是这种基于有限采样轨迹,通过优化损失函数搜索最优轨迹的方法仍然是一样的,在此不再赘述。

讨论完横向的轨迹优化问题,我们再来看看纵向的轨迹优化,在不同的场景下纵向轨迹的优化的损失函数也各不相同,Werling方法中将纵向轨迹的优化场景大致分成如下三类:

跟车

汇流和停车

车速保持

在本文中我们详细了解车速保持场景下的纵向轨迹优化,在高速公路等应用场景中,目标配置中并不需要考虑目标位置(即s1),所以在该场景下,目标配置仍然是,目标配置变成了,损失函数为:

其中是我们想要保持的纵向速度,第三个惩罚项的引入实际上是为了让目标配置中的纵向速度尽可能接近设定速度,该情景下的目标配置集为:

即优化过程中的可变参数为,同样,也可以通过设置来设置轨迹采样的密度,从而获得一个有限的纵向轨迹集合:

其中,绿线即为纵向最优轨迹。以上我们分别讨论了横向和纵向的最优轨迹搜索方法,在应用中,我们将两个方向的损失函数合并为一个,即:

这样,我们就可以通过最小化得到优化轨迹集合(我们不能得到“最优”的轨迹多项式参数,还可以得到“次优”,“次次优”轨迹等等)。

▌事故避免(Collision Avoiding)

显然,我们上面的轨迹优化损失函数中并没有包含关于障碍物躲避的相关惩罚,并且我们的损失函数中也没有包含最大速度,最大加速度和最大曲率等制动限制,也就是说我们的优化轨迹集合并没有考虑障碍物规避和制动限制因素,不将障碍物避免加入到损失函数中的一个重要的原因在于碰撞惩罚项的引入将代入大量需要人工调整的参数(即权重),是的损失函数的设计变得复杂,Werling 方法将这些因素的考量独立出来,在完成优化轨迹以后进行。

具体来说,我们会在完成所有备选轨迹的损失计算以后进行一次轨迹检查,过滤掉不符合制动限制的,可能碰撞障碍物的轨迹,检查内容包括:

s 方向上的速度是否超过设定的最大限速

s 方向的加速度是否超过设定的最大加速度

轨迹的曲率是否超过最大曲率

轨迹是否会引起碰撞(事故)

通常来说,障碍物规避又和目标行为预测等有关联,本身即使一个复杂的课题,高级自动驾驶系统通常具备对目标行为的预测能力,从而确定轨迹是否会发生事故。在本节中,我们关注的重点是无人车的动作规划,故后面的实例仅涉及静态障碍物的规避和动作规划。

▌基于 Frenet 优化轨迹的无人车动作规划实例

由于 planner 的代码篇幅过长,本实例完整代码请见文末链接,在此仅讲解算法核心代码内容。和之前一样,我们仍然使用 Python 来实现该动作规划算法。

首先,我们生成要追踪的参考线以及静态障碍物,参考线的生成只要使用了我们上一节提到的立方样条插值,代码如下:

#路线wx=[0.0,10.0,20.5,30.0,40.5,50.0,60.0]wy=[0.0,-4.0,1.0,6.5,8.0,10.0,6.0]#障碍物列表ob=np.array([[20.0,10.0],[30.0,6.0],[30.0,5.0],[35.0,7.0],[50.0,12.0]])tx,ty,tyaw,tc,csp=generate_target_course(wx,wy)

生成如下参考路径以及障碍物:

其中红线就是我们的全局路径,蓝点为障碍物。定义一些参数:

#参数MAX_SPEED=50.0/3.6#最大速度[m/s]MAX_ACCEL=2.0#最大加速度[m/ss]MAX_CURVATURE=1.0#最大曲率[1/m]MAX_ROAD_WIDTH=7.0#最大道路宽度[m]D_ROAD_W=1.0#道路宽度采样间隔[m]DT=0.2#DeltaT[s]MAXT=5.0#最大预测时间[s]MINT=4.0#最小预测时间[s]TARGET_SPEED=30.0/3.6#目标速度(即纵向的速度保持)[m/s]D_T_S=5.0/3.6#目标速度采样间隔[m/s]N_S_SAMPLE=1#目标速度的采样数量ROBOT_RADIUS=2.0#robotradius[m]#损失函数权重KJ=0.1KT=0.1KD=1.0KLAT=1.0KLON=1.0

使用基于 Frenet 的优化轨迹方法生成一系列横向和纵向的轨迹,并且计算每条轨迹对应的损失:

defcalc_frenet_paths(c_speed,c_d,c_d_d,c_d_dd,s0):frenet_paths=[]#采样,并对每一个目标配置生成轨迹fordiinnp.arange(-MAX_ROAD_WIDTH,MAX_ROAD_WIDTH,D_ROAD_W):#横向动作规划forTiinnp.arange(MINT,MAXT,DT):fp=Frenet_path()#计算出关于目标配置di,Ti的横向多项式lat_qp=quintic_polynomial(c_d,c_d_d,c_d_dd,di,0.0,0.0,Ti)fp.t=[tfortinnp.arange(0.0,Ti,DT)]fp.d=[lat_qp.calc_point(t)fortinfp.t]fp.d_d=[lat_qp.calc_first_derivative(t)fortinfp.t]fp.d_dd=[lat_qp.calc_second_derivative(t)fortinfp.t]fp.d_ddd=[lat_qp.calc_third_derivative(t)fortinfp.t]#纵向速度规划(速度保持)fortvinnp.arange(TARGET_SPEED-D_T_S*N_S_SAMPLE,TARGET_SPEED+D_T_S*N_S_SAMPLE,D_T_S):tfp=copy.deepcopy(fp)lon_qp=quartic_polynomial(s0,c_speed,0.0,tv,0.0,Ti)tfp.s=[lon_qp.calc_point(t)fortinfp.t]tfp.s_d=[lon_qp.calc_first_derivative(t)fortinfp.t]tfp.s_dd=[lon_qp.calc_second_derivative(t)fortinfp.t]tfp.s_ddd=[lon_qp.calc_third_derivative(t)fortinfp.t]Jp=sum(np.power(tfp.d_ddd,2))#squareofjerkJs=sum(np.power(tfp.s_ddd,2))#squareofjerk#squareofdifffromtargetspeedds=(TARGET_SPEED-tfp.s_d[-1])**2#横向的损失函数tfp.cd=KJ*Jp+KT*Ti+KD*tfp.d[-1]**2#纵向的损失函数tfp.cv=KJ*Js+KT*Ti+KD*ds#总的损失函数为d和s方向的损失函数乘对应的系数相加tfp.cf=KLAT*tfp.cd+KLON*tfp.cvfrenet_paths.append(tfp)returnfrenet_paths

其中,一个重要的类是五次多项式类,其定义如下:

classquintic_polynomial:def__init__(self,xs,vxs,axs,xe,vxe,axe,T):#计算五次多项式系数self.xs=xsself.vxs=vxsself.axs=axsself.xe=xeself.vxe=vxeself.axe=axeself.a0=xsself.a1=vxsself.a2=axs/2.0A=np.array([[T**3,T**4,T**5],[3*T**2,4*T**3,5*T**4],[6*T,12*T**2,20*T**3]])b=np.array([xe-self.a0-self.a1*T-self.a2*T**2,vxe-self.a1-2*self.a2*T,axe-2*self.a2])x=np.linalg.solve(A,b)self.a3=x[0]self.a4=x[1]self.a5=x[2]defcalc_point(self,t):xt=self.a0+self.a1*t+self.a2*t**2+\self.a3*t**3+self.a4*t**4+self.a5*t**5returnxtdefcalc_first_derivative(self,t):xt=self.a1+2*self.a2*t+\3*self.a3*t**2+4*self.a4*t**3+5*self.a5*t**4returnxtdefcalc_second_derivative(self,t):xt=2*self.a2+6*self.a3*t+12*self.a4*t**2+20*self.a5*t**3returnxtdefcalc_third_derivative(self,t):xt=6*self.a3+24*self.a4*t+60*self.a5*t**2returnxt

这里的五次多项式的系数的求解过程和我们前面的理论讲解是一样的,只不过我们使用Numpy中的np.linalg.solve(A, b)方法将矩阵解了出来。最后,我们来看一下障碍物规避是如何实现的:

defcheck_collision(fp,ob):foriinrange(len(ob[:,0])):d=[((ix-ob[i,0])**2+(iy-ob[i,1])**2)for(ix,iy)inzip(fp.x,fp.y)]collision=any([di<= ROBOT_RADIUS ** 2 for di in d])        if collision:            return False    return True

由于我们将障碍物规避问题都简化为静态了,所以在这里我们只简单地计算了所有规划点到障碍物的距离,一句距离预计是否会发生碰撞,来看看完整的优化轨迹检查函数:

defcheck_paths(fplist,ob):okind=[]foriinrange(len(fplist)):ifany([v>MAX_SPEEDforvinfplist[i].s_d]):#最大速度检查continueelifany([abs(a)>MAX_ACCELforainfplist[i].s_dd]):#最大加速度检查continueelifany([abs(c)>MAX_CURVATUREforcinfplist[i].c]):#最大曲率检查continueelifnotcheck_collision(fplist[i],ob):continueokind.append(i)return[fplist[i]foriinokind]

由此可以看出,最终的优化轨迹的选择并不单纯基于最小损失函数,轨迹检查还会过滤掉一些轨迹,所以使用基于 Frenet 的优化轨迹来做无人车的动作规划,通常能够找到有限集的最优解,当最优解无法通过检查是,自会采用“次优解”甚至更加“次优的”解。

最后我们来看一下完整的动作规划效果:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62594
  • 无人驾驶
    +关注

    关注

    98

    文章

    4058

    浏览量

    120495
  • 无人车
    +关注

    关注

    1

    文章

    302

    浏览量

    36474

原文标题:无人驾驶汽车系统入门——基于Frenet优化轨迹的无人车动作规划方法

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何使labview中xy图的坐标系与栅格坐标系

    如何使labview中xy图的坐标系与栅格坐标系
    发表于 01-25 21:44

    CAD制图软件新手攻略:坐标系及标注坐标

    坐标系。下面就来给大家详细介绍下浩辰CAD制图软件中坐标系及标注坐标方法吧!首先起来复习
    发表于 09-23 10:28

    坐标系与鱼雷运动参数

    坐标系与鱼雷运动参数 、常采用的几种坐标系 在鱼雷航行动力学的研究过程中,根据不同的研究目的,须要采用不同的坐标系。常采用
    发表于 01-06 16:47 5005次阅读
    <b class='flag-5'>坐标系</b>与鱼雷运动参数

    机器人基坐标系标定方法研究

    针对借助激光跟踪仪标定机器人所涉及的坐标系统一问题,对基于空间几何法拟合建立的基坐标系与机器人理论基坐标系的转换关系进行了研究,提出了一种基于对偶四元数法的机器人基
    发表于 03-07 10:43 2次下载

    OPENGL坐标系介绍 世界坐标系和当前绘图坐标系区别

    世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角
    发表于 05-04 09:00 1.3w次阅读
    OPENGL<b class='flag-5'>坐标系</b>介绍 世界<b class='flag-5'>坐标系</b>和当前绘图<b class='flag-5'>坐标系</b>区别

    带你来剖析机器人的坐标系吧!

    大地坐标系:大地坐标系是以大地作为参考的直角坐标系。在多个机器人联动的和带有外轴的机器人会用到,90%的大地坐标系与基坐标系是重合的。但是在
    的头像 发表于 05-09 15:49 4790次阅读

    Frenet坐标系,自动驾驶“混乱”的源头

    Frenet坐标系的建立基于个参考线,这个参考线可以是任意曲线,但在自动驾驶运动规划般定义为道路的中心线,这条中心线是地图模块输入过来
    的头像 发表于 04-03 10:16 2581次阅读

    自动驾驶各个坐标系

    Transverse Mercator,UTM)坐标系一种应用较为 广泛的一种。 UTM坐标系使用基于网格的方法表示
    发表于 06-01 15:59 0次下载
    自动驾驶各个<b class='flag-5'>坐标系</b>

    自动驾驶里面的三个坐标系

    自动驾驶里面会有三个坐标系.其中自然坐标系是指以我们规划轨迹,建立的自然坐标系。使用自然坐标系
    发表于 06-06 09:56 0次下载
    自动驾驶里面的三个<b class='flag-5'>坐标系</b>

    自动驾驶规划算法基础之frenet与笛卡尔cartesian坐标系的转换

    该笔记来自b站up主(偶像):憨厚老实的老王 B站视频链接跟着老王的视频手写推了遍公式,这酸爽! csdn中推导公式比较好的博主: Frenet坐标系与Cartesian坐标系互转
    发表于 06-06 10:01 2次下载
    自动驾驶<b class='flag-5'>规划</b>算法基础之<b class='flag-5'>frenet</b>与笛卡尔cartesian<b class='flag-5'>坐标系</b>的转换

    坐标如何建立坐标系

    我们在检测工件时,需要正确的装夹检测工件,使工件有足够的检验空间和恒温时间,坐标系的建立就是为后续的测量奠定基础,建立错误的坐标系直接导致测量尺寸的误差建立正确的参考方向即坐标系是十分重要的。
    的头像 发表于 02-17 10:24 9283次阅读
    三<b class='flag-5'>坐标</b>如何建立<b class='flag-5'>坐标系</b>?

    世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的关系

    相机的成像过程涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。这篇博客介绍相机的成像过程,以及四个
    的头像 发表于 07-03 10:30 1.1w次阅读
    世界<b class='flag-5'>坐标系</b>、相机<b class='flag-5'>坐标系</b>、图像<b class='flag-5'>坐标系</b>、像素<b class='flag-5'>坐标系</b>之间的关系

    深度剖析机器人的四大坐标系

    大地坐标系:大地坐标系是以大地作为参考的直角坐标系。在多个机器人联动的和带有外轴的机器人会用到,90%的大地坐标系与基坐标系是重合的。但是在
    发表于 11-13 11:24 1718次阅读
    深度剖析机器人的四大<b class='flag-5'>坐标系</b>

    应用卫星通信领域的坐标转换过程—机体坐标系与ENU坐标系的转换

    今天我们要讲的是应用于卫星通信领域的坐标转换过程——机体坐标系与ENU坐标系的转换。
    的头像 发表于 12-27 09:30 4432次阅读
    应用卫星通信领域的<b class='flag-5'>一</b>个<b class='flag-5'>坐标</b>转换过程—机体<b class='flag-5'>坐标系</b>与ENU<b class='flag-5'>坐标系</b>的转换

    arcmap如何设置地理坐标系

    ArcMap是个功能强大的地图制作和分析软件,可以用来设置地理坐标系。地理坐标系一种将地球表面上的位置表示出来的方法,它使用经度和纬度来
    的头像 发表于 02-25 13:41 3907次阅读