自动驾驶路径决策算法——动态规划

文章内容来自b站up主忠厚老实的老王,视频链接如下:

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili

其中host是自车位置,以host在参考线的投影为坐标原点,建立frenet坐标,此时host的坐标是(0,L0),将障碍物的也投影到该坐标系下。

规划的第一步就是确定规划的起点:

蓝色的线是第一次规划的结果,按照当前的规划来说100ms以后应该是绿点位置,但是由于控制本身不完美,100ms后车辆实际位置是红色点,此时同时开始第二次规划,按照规划100ms后应该是紫点位置,但是由于控制不完美,车辆实际位置是橙点。这样在控制看了规划的轨迹是割裂的。

正确的做法是比较规划100ms之后比较车辆实际位置和规划它应该达到的位置,看两者之间是否相差过大,具体如下:

如果相差太大就以当前车辆的实际位置(在French坐标系上的坐标位置是(0,L0))作为规划的起点规划下一个周期的轨迹。

相差不大除了上面的那种方法,还有另一种方法就是直接使用上一个周期规划100ms车辆应该到达的位置(也就是绿点)投影到referenceline上进行下一个周期的规划。下面使用第一种方法进行规划:

如上,第一次规划的轨迹是蓝色,100ms后规划位置是绿色,车辆实际位置是红色,有一个差距,此时将车辆实际位置(红点)投影到上一次规划的轨迹(蓝线)上,得到紫点,再将紫点投影到referenceline上进行下一阶段的规划也就是紫线。

如上,使用上面的方法从控制的角度来说得到的规划的轨迹是连续的,并每次规划都从定位开始规划要好很多。

静态障碍物避障

具体如下:

在障碍物附近离散化的撒点,再计算cost function,计算出最优路径;

在离散空间上使用动态规划得到粗解,开辟凸空间;在此凸空间上使用二次规划的到最优解。

规划起点的约束和第一层离散点的约束,其中第一层离散点约束中的第一阶和第二节导数都为0,原因是动态规划得到的解是粗解,目的是开辟凸空间,最后的最优路劲是二次规划得到的。同理第一层到第二层的约束也是这样,一阶和二阶导数值都为0:

这样通过五次多项式来计算出一条条路径出来,接下来就是设计cost function来评价路径的优劣:

这个cost function的解释如下:

设计好cost function后就可以使用cost function来计算出每条路径的代价,问题就变成怎么找图的最短路径问题,比较常用的方法有:Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法以及A*算法。这里使用比较简单的方法介绍图的最短路径问题:

以此类推,从起到到第n层的最小cost问题可以简化成从起点到n-1层最小cost问题,再往前推就可以把复杂的问题简单化。这样就可以写出状态转移方程(递推方程):

控制接口与轨迹拼接

现实中由于规划是100ms更新一次,控制是10ms更新一次,在100ms和10ms之间意味控制九个周期跟踪的都是同一个点,控制效果不好。解决办法如下:

规划会规划出来一系列的点,但是原来的做法是找到100ms时对应的点将其发给控制接口,但是这种方法在控制与规划周期同步时没有问题,当控制与规划周期不同步时就会出现问题,所以控制的接口得改变,在前期规划时其实已经规划出10ms、20ms以及30ms等一系列到100ms的点,但是直将100ms时对应的规划点发给控制接口就会使得控制效果变差,改造方法如下:

原理基本如上图,细节很多,如下:

问题1:轨迹的时间是绝对时间

拼接例子如下:

去查上一个周期100ms也就是绝对时间16:00:10对应的规划点(紫色点),和当前车的位置(红点)进行比较,如果相差大就不拼接,误差不大就拼接。

对于控制也用绝对时间比较好,如下:

这里是由于控制也有延迟。

问题2:规划起点

上个规划周期规划出来的轨迹是蓝色线条,本周期规划开始的时间是T,首先比较当前车辆的位置和上一个规划周期在T时刻规划出来的位置是否接近,比较接近,误差不大就是说明控制时按照规划路径走的,就可以进行轨迹拼接,规划的起点是T+100ms(绿点)。

原因如下:

控制频率比较快,在[T,T+100ms]的时间段内,规划未计算完成,控制跟踪的是上一个周期规划的轨迹。

如果本周期规划起点的绝对时间是T,计算完毕的时间是T+100ms,也就是直到T+100ms时,绿色的本周期轨迹才计算完毕,发送给控制接口,从控制看来规划的路径如下,是不连续的:

而如果规划起点的绝对时间是T+100ms,车在跟踪完上一个规划周期规划的轨迹后,在T+100ms时控制接口就可以接受到本规划周期规划到的路径信息,这样在控制看来规划的轨迹是连续的。

动态规划和决策之间的关系

动态规划开辟凸空间,所以动态规划应该是决策算法。

相关推荐
这个男人是小帅8 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
__基本操作__10 分钟前
边缘提取函数 [OPENCV--2]
人工智能·opencv·计算机视觉
xiaoyaolangwj11 分钟前
高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十三)图优化SLAM的本质
学习·机器人·自动驾驶
Doctor老王14 分钟前
TR3:Pytorch复现Transformer
人工智能·pytorch·transformer
热爱生活的五柒14 分钟前
pytorch中数据和模型都要部署在cuda上面
人工智能·pytorch·深度学习
HyperAI超神经2 小时前
【TVM 教程】使用 Tensorize 来利用硬件内联函数
人工智能·深度学习·自然语言处理·tvm·计算机技术·编程开发·编译框架
扫地的小何尚4 小时前
NVIDIA RTX 系统上使用 llama.cpp 加速 LLM
人工智能·aigc·llama·gpu·nvidia·cuda·英伟达
埃菲尔铁塔_CV算法6 小时前
深度学习神经网络创新点方向
人工智能·深度学习·神经网络
艾思科蓝-何老师【H8053】7 小时前
【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
人工智能·信号处理·论文发表·香港中文大学
秀儿还能再秀7 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习