1. 项目概述与核心价值
最近在做一个自动驾驶相关的仿真项目,其中轨迹跟踪控制器是核心模块之一。在众多控制算法中,LQR(线性二次型调节器)因其在平衡控制性能和计算效率方面的优势,成为了一个经典且实用的选择。这个项目标题“车辆运动学建模 | LQR轨迹跟踪 | C++实现”,精准地概括了从理论到实践的完整链路。它不是一个简单的算法调用,而是要求你深入理解车辆如何运动(运动学建模),如何将跟踪问题转化为一个优化问题(LQR控制器设计),并最终用C++将其实现为一个稳定、高效的模块。
对于刚接触这个领域的朋友来说,可能会觉得“运动学建模”和“LQR”听起来很学术。简单来说,你可以把车辆想象成一个在平面上移动的“盒子”。运动学建模就是描述这个“盒子”的位置、朝向和方向盘转角、速度之间的关系,它不考虑轮胎打滑、车身侧倾这些复杂的物理力,只关心几何关系,所以模型相对简单。而LQR,则可以理解为一个“聪明的调节器”。给定一条你想让车辆跟随的理想轨迹(目标轨迹),以及车辆当前偏离轨迹的状态(比如横向位置误差、航向角误差),LQR会帮你计算出一个最优的方向盘转角,使得车辆既能快速回到轨迹上,又不会动作过猛、摇摇晃晃,同时方向盘转动本身也不会太费力。这个“最优”的权衡,就体现在LQR设计的两个核心矩阵Q和R中。
用C++实现,则是将这套数学理论工程化的关键一步。它意味着你需要处理离散时间系统、实时状态更新、矩阵运算(比如求解Riccati方程),并最终将控制器集成到一个仿真循环或实际系统中。这个过程会迫使你厘清很多在理论推导中可能被忽略的细节,比如采样时间的选择、误差状态的定义、以及如何处理目标轨迹的曲率变化等。接下来,我将拆解这个项目的每一个环节,分享从建模、推导到编码实现的全过程,以及我踩过的一些坑和总结的实用技巧。
2. 车辆运动学模型详解与线性化
车辆运动学模型是整个控制器的基石。一个准确且易于处理的模型,直接决定了后续控制器设计的可行性和性能。
2.1 自行车模型推导
我们通常采用经典的“自行车模型”或“阿克曼转向模型”来简化车辆。它假设车辆左右侧车轮的运动可以合并,用位于车辆中心的一个前轮和一个后轮来代表。同时,它只考虑低速场景,忽略轮胎的侧向滑移。这个假设在低速(例如泊车、园区物流)或对精度要求不极端高的轨迹跟踪中,是合理且有效的。
模型的推导基于几何关系。我们定义几个关键状态量:
-
(x, y): 车辆后轴中心(或质心)在世界坐标系下的坐标。 -
ψ(psi) : 车辆的航向角(车头朝向与X轴的夹角)。 -
v: 车辆的后轴中心速度(沿车身纵向的速度)。 -
L: 车辆的轴距(前轴到后轴的距离)。 -
δ(delta) : 前轮转向角(我们的控制输入)。
根据几何关系,车辆后轴中心的运动速度在X和Y方向的分量,以及航向角的变化率,可以表示为:
ẋ = v * cos(ψ)
ẏ = v * sin(ψ)
ψ̇ = v / L * tan(δ)
这就是车辆运动学模型的连续时间非线性表达式。 ẋ, ẏ, ψ̇ 分别是x, y, ψ对时间的导数。你可以这样理解:车辆沿着车头方向(ψ)以速度v前进,所以它在X和Y方向的速度是v在这个方向上的投影。而航向角的变化率,则与速度v和转向角δ的正切成正比,轴距L越大,转向带来的航向变化就越慢。
注意 :这里通常选择后轴中心作为参考点,是因为其运动方程不直接依赖于转向角δ(前轮中心点的运动方程会包含δ,更复杂)。这简化了模型。
2.2 误差状态模型与线性化
LQR是一个线性控制器,但我们的车辆模型关于状态 [x, y, ψ] 和控制输入 δ 是非线性的。因此,我们不能直接将LQR应用于这个模型。标准的做法是构建一个关于 跟踪误差 的线性模型。
我们首先定义目标轨迹。它由一系列离散的路径点 (x_ref(t), y_ref(t)) 组成,每个点都有对应的目标航向角 ψ_ref(t) 和目标速度 v_ref(t) 。我们的控制目标是让车辆的实际状态 [x, y, ψ, v] 尽可能接近这些参考值。
定义误差状态向量 η :
η = [e1, e2, e3]^T
其中:
e1: 横向误差(Frenet坐标系下的法向距离)。车辆当前位置到参考轨迹最近点的垂直距离。
e2: 航向角误差。e2 = ψ - ψ_ref。
e3: 纵向速度误差?等等,这里有个关键点。
在经典的LQR轨迹跟踪中,我们通常假设纵向速度 v 由上层规划器或驾驶员给定,控制器不直接控制速度(即油门/刹车),而只控制转向角 δ 来调整横向和航向。因此, 状态变量通常只包含横向误差和航向角误差 。更精确的误差状态定义需要在Frenet坐标系(以轨迹为参考的坐标系)下进行。
假设在某个时刻t,我们找到了车辆在参考轨迹上的投影点(最近点),该点处的参考状态为 [x_ref, y_ref, ψ_ref, v_ref] 。在该投影点处建立Frenet坐标系:s轴沿轨迹切线方向,d轴沿法线方向。那么,车辆在该坐标系下的横向位置偏差 e_d (即d坐标)就是我们的横向误差 e1 。航向角误差 e_ψ = ψ - ψ_ref 。
通过对非线性运动学模型在参考状态点 (ψ_ref, v_ref, δ_ref=0) 处进行一阶泰勒展开(线性化),并转换到Frenet坐标系,我们可以得到一个关于误差状态 [e_d, e_ψ] 的线性时变系统。经过推导(过程略,涉及雅可比矩阵计算),其标准形式为:
η̇ = A * η + B * u
其中:
-
η = [e_d, e_ψ]^T是误差状态向量。 -
u = δ是控制输入(转向角,注意这里u是控制增量,但在这个简单模型中常直接作为控制量)。 -
A和B是系统矩阵和控制矩阵,它们依赖于参考速度v_ref和参考轨迹的曲率κ_ref。 一个常见的简化形式(假设参考曲率较小,且v_ref变化缓慢)是:
A = [0, v_ref;
0, 0]
B = [0;
v_ref / L]
这个模型表明:横向误差 e_d 的变化率与航向角误差 e_ψ 和车速 v_ref 有关(如果车头方向不对,横向误差就会累积),而航向角误差 e_ψ 的变化率则直接由转向角 δ 控制。
实操心得 :线性化点的选择至关重要。我们是在每个控制周期,以车辆当前在轨迹上的投影点(即当前时刻的参考状态)作为线性化点。这意味着矩阵A和B在每个控制周期都需要重新计算,因为
v_ref和κ_ref可能随时间变化。这种控制器称为“线性时变LQR”或“滚动时域LQR”。在实际实现中,如果轨迹曲率不大且速度稳定,有时会忽略曲率项,使用上面给出的简化A、B矩阵,可以大大减少计算量且仍能取得不错的效果。
3. LQR控制器设计与离散化
有了线性误差模型,我们就可以应用LQR来设计控制器了。LQR的目标是找到一个状态反馈控制律 u = -K * η ,使得以下二次型性能指标最小化:
J = ∫ (η^T * Q * η + u^T * R * u) dt
其中, Q 是半正定的状态权重矩阵, R 是正定的控制权重矩阵。这个代价函数的物理意义很直观:第一项 η^T * Q * η 惩罚状态误差(比如车偏离


440

被折叠的 条评论
为什么被折叠?



