【路径规划】 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame (附python代码实例)


参考与前言


  1. 2010年,论文 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame 地址:https://www.researchgate.net/publication/224156269_Optimal_Trajectory_Generation_for_Dynamic_Street_Scenarios_in_a_Frenet_Frame
  2. Python代码示意地址:https://gitee.com/mirrors/PythonRobotics/tree/master/PathPlanning/FrenetOptimalTrajectory
  3. csdn上matlab解释:https://blog.csdn.net/caokaifa/article/details/108015374
  4. 格式更好看的notion外链版:https://www.notion.so/kinzhang/Frenet-Optimal-Trajectory-Generation-96d5bced98c146d2a9036a1d5fc2b21d
    后续更新也主要在notion上

主要是自己一直听过这个frenet的规划... 但是一直没了解到底是个啥,趁着这次杰哥的指点,顺便套娃一下基础知识好了。关于规划的使用中,19年的时候做二维grid map 小小圆盘二轮车用的Dijkstra/A*做的全局,然后局部是DWA(但是当时实验时车子总是蛇皮走位)照现在的感觉应该是膨胀系数给大了,DWA更新快了?然后路径规划完哎往墙走,哎躲个墙,哎再往墙走,就这种蛇皮 emmm 这么说好像还是不是很清楚原因,放着万一啥时候想通了呢 hhhh。这次这个主要是基础系列补... 补... 补

基础知识


因为基础补充,所以就... 慢慢来了,就当把自己的理解总结一下好了..

Frenet坐标系

首先是关于这个坐标系的,一般呢我们用的是笛卡尔坐标系(大白话 xy坐标轴),然后这个的不同之处就是按照你的那个车的路径定的,纵向距离叫s,横向距离叫d。例如此手画图:[这里的横纵是指车子在开的方向,车头前方是纵,方向盘的就是横]

在这里插入图片描述

手画示意

python代码运行示意

  • [x] 所以这个在一开始定全局路径规划线的时候就是定frenet坐标系的时候嘛?中途还会有变化嘛?

    中途会有变换,比如https://github.com/AtsushiSakai/PythonRoboticsGifs/raw/master/PathPlanning/FrenetOptimalTrajectory/animation.gif)]

    https://img-blog.csdnimg.cn/20210706102149936.gif

    其中蓝绿色是center line,黑色x是障碍物位置,红色是预测的行驶轨迹;左边是我单独修改了画图,把所有的路线给用颜色标出来了,cost的颜色从大到小如图例所示

    画图修改后的代码见此次gitee commit 点击即可跳转

    总结

    以上,所以生成轨迹用的是贝塞尔,然后跟随轨迹 横向距离是按五次多项式、纵向速度保持是四次多项式,然后再按论文中的cost 公式代入计算,所以理解cost公式的意义比较重要,并且各个参数的调整意味着什么。另外有一点在论文体现,代码里忽略的是关于跟随前车,超车都是假设前车加速度不变,感觉这样实际高速操作还是有安全隐患的。

    对于jerk的做法,我确实没感觉出什么不妥,可能是计算速度 更新率方面需要进一步评估这个。

    后面想到一个,关于实际车辆运动时的反馈,比如就算你给出了车辆运动的轨迹 甚至是那个速度,跟随问题也是需要考虑的,但是可能这就不在轨迹规划器里考虑了,而是控制跟随,比如LQR、PID、Stanley控制器等(其中LQR可能会“预习”一下,后两者 当时毕设写过了)