写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝


🎭 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 🌟
感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~



文章目录

  • 前言
  • 一、算法输入与输出
  • 1、算法输入
  • 2、算法输出
  • 二、算法流程
  • 1、算法过程概述
  • 2、算法流程图
  • 三、具体算法
  • 1、AB 计算模块
  • 2、LQR模块
  • (1)急加速
  • (2)急速过弯
  • 3、误差与曲率计算模块
  • (1)规划点
  • (2)匹配点
  • (3)方向向量
  • (4)误差的距离的向量
  • (5)横向误差
  • (6)纵向误差
  • (7)投影点切线方向与x轴夹角
  • (8)横向误差导数
  • (9)航向角误差
  • (10)弧速度
  • (11)横摆角速度误差
  • (12)投影点曲率
  • (13)输出
  • 4、前馈控制计算模块
  • 5、最终控制计算模块
  • 四、预测模块
  • 1、预测模块的重要性
  • 2、预测模块算法
  • 五、完整算法流程图
  • 六、总结
  • 参考资料



前言

  本篇博客是 自动驾驶控制算法 系列的第八节第Ⅰ部分。内容整理自 B站知名up主 忠厚老实的老王 的视频,作为博主的学习笔记,分享给大家共同学习。

  本节内容是整个横向控制的核心,要把前七节所有内容都用在第八节上。第八节分四小节,本小节讲解具体算法,下一小节讲解模型搭建和代码编程,再下一小节讲解代码优化、注意事项以及仿真结果。

  算法这一讲可以说是整个第八节的核心所在。写代码、做仿真的来源是算法,有了具体算法后,无论用什么平台仿真,用什么语言编写程序,都是水到渠成的事情。只要照着算法编程逻辑是十分清晰的,因为算法已经把逻辑梳理好了,只要照着算法编就可以了。

  相反如果没有写过算法,然后就直接就去编程也可以,但只针对较简单的项目、简单的算法。对于复杂算法,建议各位先把算法写好,把逻辑理清楚,然后再编程。

  本篇博客讲解横向控制算法,前面讲到的控制律:
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法其中,【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_02【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_03的解。

关于这些量的计算:

  • 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_04
  • 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_05
  • 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_06
  • 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_07

  第四节讲的是连续规划轨迹的误差计算,第七节是讲的是离散规划轨迹的误差计算。

  将前七节所有的知识把综合起来,就变成了第八节,讲解横向控制的完整算法。横向控制很复杂,模块非常多,所以必须要把算法梳理一遍,不然很容易出错。


一、算法输入与输出

1、算法输入

根据前七讲,算法输入分为三类:

  • 整车参数
    轴距L、质心到前后轮的距离 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_08 、侧偏刚度 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_09、质量 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_10、转动惯量 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_11
  • 车辆位置与状态
    包括车辆的 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_12 以及它的速度 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_13 ,横摆角速度 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_14
  • 规划轨迹点
    轨迹点为四维数组,包含坐标 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_15 以及轨迹点的切线方向与 x 轴夹角 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_16 以及轨迹点的曲率 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_17
    【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_18

2、算法输出

  算法输出为
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法


二、算法流程

1、算法过程概述

  第一步:通过整车参数加上 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20,可以算出 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_21,再设置权重矩阵 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_22,通过 LQR 可得到反馈矩阵 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23

  第二步:车辆的位置状态,加上规划轨迹点,可以算出误差 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_24 以及投影曲率 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_25

  第三步:第一步得到反馈矩阵 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23,以及第二步所得到的投影的曲率 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_25,加上整车参数,再加 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20,可得到前馈控制 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_29

  第四步:第一步得到了 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23 加上第二步得到的误差 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_24,再加上第三步得到 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_29,可以得到 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_33

2、算法流程图

  流程图可以直观地反映算法的结构,基本上流程画出来,算法逻辑顺序就理清楚了,流程图如下:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_34

  • 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_35
    首先是整车参数和 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_36 作为输入模块,输入进 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_37 计算模块,可算出 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_37
  • LQR模块
    【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_37 算出来后,再输入 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_40【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_41 进入 LQR 模块,就可算出最终的反馈矩阵 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_42
  • 误差曲率计算模块
    接下来是车辆状态及速度,加上规划轨迹点以及 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_36 作为输入,这里把 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_36 单独拿出来,因为 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_36 在其他模块上也有用。作为输入之后输入进误差和 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_42 的计算模块,得到误差以及曲率 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_47
  • 前馈控制计算模块
    整车参数再加上 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_36 再加上 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_42【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_47 输入前馈控制计算模块,可算出前馈控制 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_51
  • 最终控制计算模块
    最后将反馈矩阵 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_42 、前馈 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_51 以及误差代入最终控制计算模块,可得到最后的控制量 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_54

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_21 计算模块、误差 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_24、反馈矩阵 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23 计算模块、前馈控制 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_29 计算模块都用到【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20 ,将 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20

  流程图包含了从第三节到第七节的所有内容,这就是后续编程的理论依据,以后写代码就是按照流程图来写。

  可以看一下整个算法分为五个模块,写算法具体就是写这五个模块,模块写出来了,算法也就编写出来了。


三、具体算法

  下面看一下这五个模块的算法到底该如何编写。

1、AB 计算模块

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_21 的具体表达式的在前面推导过:
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_62【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_63  上式和车辆参数、 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20 有关的矩阵,把车辆参数及 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20

  注意:要考虑当 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_66 时的奇异性,【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_67

2、LQR模块

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_68 有关,而 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_21 只与整车参数和 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20

注意:整车参数只是近似认为不变,并不是一成不变。在某些情况下就是整车参数不能认为近似不变,必须要考虑整车参数变化所带来对 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_05

在什么情况下不可近似处理呢?

(1)急加速

  如果车辆在疯狂加速,即加速度非常大、非常猛时:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_72

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_73

(2)急速过弯

  非常急速的过弯时,整个车都倾斜起来:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_74

  此时车左右轮明显不对称,因为右轮几乎承受了车的全部重量,而左轮几乎没有承受任何力,导致自行车模型不再适用。

  所有的理论都基于自行车模型,即把左右两个轮认为是一个轮,等于是把车压扁了,意味着自行车模型只适用于左右对称或是近似对称的情况。而在极速过弯情况下,不能认为左右轮对称。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_76 倍的重力加速度,即【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_77,就属于急速过弯。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_21 只与 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_02【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_03,这样每个 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20 都有唯一的 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23

  比如有如下形式的对应表:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23

0.01

0.02

0.03

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20



50

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23 的对应关系。这样测出 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20 后,直接查表查出 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23,这就是用离线查表法计算 LQR。

查表法计算 LQR 的优缺点如下:

  • 优点
    大大加快计算速度
  • 缺点
    耗费存储空间

  这是典型为了加快程序运算速度而采用空间换时间的算法,通过查表法算, LQR 可以把速度提升好几个数量级,特别是在控制中,对实时性的要求是最高的,这就意味着必须要尽一切可能加快程序运算速度。

  一般在实际应用中的 LQR 不是通过调包计算的,而是查表查出来的。而且查表法算LQR 对高速运动的控制也有效果,因为高速和低速的区别就在于侧偏刚度变化,其他变化不大。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23 就和 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_20 以及侧偏刚度 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_98 有关,就是从一维表格变成三维表格。可以把速度以及侧偏刚度输进去,查 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_23

3、误差与曲率计算模块

  该模块是整个算法的核心。

(1)规划点

  首先要有规划轨迹,就是一系列的四维数组点:
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_100

(2)匹配点

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_101 找到与 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_102 最近的规划点的序列号,记为 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_103

【序列号】是距离最短的点的下标序列,遍历所有规划点,比如找到第四个规划点距离车辆当前位置 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_104 最近,那么【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_105。最短距离的点叫做匹配点,【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_106

(3)方向向量

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_107 与法线方向量 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_108
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_109

(4)误差的距离的向量

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_110
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_111  实际上就是两个向量的减法,第一个向量是车辆真实位矢向量,第二个向量是匹配点的位矢向量,这两个相减就是误差的距离向量,对应的就是第七节的 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_112

(5)横向误差

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_113

(6)纵向误差

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_114

(7)投影点切线方向与x轴夹角

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_115,即投影点切线方向与 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_116 轴夹角,因为匹配点不等于投影点,所以还要进行相应的运算:
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_117

(8)横向误差导数

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_118

(9)航向角误差

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_119

(10)弧速度

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_120

(11)横摆角速度误差

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_121

(12)投影点曲率

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_122

(13)输出

  第三个模块的算法是整个控制算法中最复杂的,这一块涉及到的公式很多,而且很容易出问题。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_123【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_124,做了一系列假设,其中假设 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_125 比较小,所以【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_126,以及【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_127近似认为是1,然后才能得到 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_123【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_124

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_130 有问题,角度具有多值性,即 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_131,还是原来角度,但从 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_125 的角度上来说,【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_131 就不是小角度了,包括 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_115 也一样,【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_135【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_136 实际上是同一个角度,但如果用【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_130,可能导致 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_138

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_33 ,误差 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_140 ,最终控制中的 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_141【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_138 有关系,这样可能导致【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_138 在短时间内突变成多 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_144,导致控制量 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_141

  所以第九步最容易出错,在具体写代码时注意避免。

4、前馈控制计算模块

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_146【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_147

5、最终控制计算模块

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_148

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_141


四、预测模块

  但这样还不够,因为这五个模块只是前七节讲到的内容,为了更好地体现算法性能,还要再加预测模块。

1、预测模块的重要性

为什么要加预测模块?

  首先因为车本身具有惯性,导致控制天生有滞后性。为了解决这个问题,要进行提前控制,加入预测模块。

  这里具体解释一下。比如有一段规划轨迹:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_150

  如果是人开车,看到这样一条路径规划,会不会去打方向盘?应该不会,因为人具有预见性,能看到未来路径到底长什么样。虽然现在的状态和规划路径有误差,但是如果保持当前状态行驶,在未来一段时间内,车和规划路径就没有误差了。所以人不会打方向盘,因为人能知道未来的路径规划是什么。

  但算法不行,算法开车只会机械地寻找与真实位置最接近的规划轨迹点。如果算出误差不等于0,那么算法就会打方向盘。

  下面的例子也说明了同样的道理:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_151

  人开车的话,知道未来的路径规划不是直线,所以即使现在的运动状态和规划的轨迹完全贴合,没有误差,人也会提前动方向盘。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_152,算法不会动方向盘,只在匀速直线运行到下一时刻时,发现此时误差不等于 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_152,才会动方向盘。所以算法控制具有一定的滞后性,看不到未来的路径规划,只关心哪个轨迹点与真实位置最近。

  所以要加上预测模块,为了更好地控制,算法需要具有一定的预见性。

  预测就是在车辆当前状态下,假设车辆在一段时间内做匀速直线运动,运动后的点就是预测点。比如说下面这样:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_154

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_155,所以 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_155 不等于 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_152【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_141 就不等于 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_152,算法就会打方向盘。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_160 和轨迹重合,【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_161,所以就不打方向盘,这时算法就具有预见性。

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_152,现在用预测点和规划点计算误差,此时误差不等于 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_152,所以打方向盘。

2、预测模块算法

  下面编写具体的预测算法,比如下图的直角坐标系:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_164

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_165,与 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_116 轴夹角为 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_167,预测时间记为 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_168,假设在预测时间内,车辆做匀速直线运动,那么前视距离为 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_169。若有加速度信号,则前视距离为 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_算法_170

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_流程图_171

  根据几何关系有:
【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_172


五、完整算法流程图

  加入预测模块后的算法流程图:

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_173


六、总结

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_自动驾驶_174 和规划轨迹 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_笔记_175 做误差计算,现在加入预测模块,就用预测点的 【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程_运动控制_176

  这才是想要的完整算法,后续编程就按照算法流程图来编写,一共六大模块,已经全部讲完。

  本篇博客就写到这里,但第八节还没有完,下一小节讲解具体的代码编写以及模型搭建。欢迎关注!


参考资料

  【基础】自动驾驶控制算法第八节(一)横向控制算法与流程图


后记:

🌟 感谢您耐心阅读这篇关于 横向控制Ⅰ | 算法与流程 的技术博客。 📚

🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢

🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀

🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡

🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀