从自行车模型到赛道仿真:基于LQR的轨迹跟踪控制实践 (MATLAB)
2026/4/15 10:18:02 网站建设 项目流程

1. 从自行车模型到赛道仿真:LQR轨迹跟踪全流程解析

第一次接触车辆轨迹跟踪控制时,我被各种专业术语搞得晕头转向。直到把整个流程拆解成"建模-控制-求解-可视化"四个可操作的步骤,才真正理解LQR控制的精髓。让我们以纽伯格林赛道为例,用MATLAB实现一个会"自动驾驶"的自行车模型。

自行车模型之所以被广泛使用,是因为它用最简化的结构(前轮转向+后轮驱动)就能反映车辆的核心运动特性。在实际项目中,我常用这个模型快速验证算法效果,再迁移到复杂模型上。模型代码虽然只有十几行,但隐藏着三个关键参数:轴距L、采样时间ts和控制量[v, δ],这些都会直接影响后续LQR控制效果。

2. 车辆运动学模型构建与线性化

2.1 自行车模型代码实现

先看这个既简单又强大的自行车模型核心代码:

function [vehicle_new] = VehicleModel(vehicle_old, vehilce_con) x_old = vehicle_old(1); y_old = vehicle_old(2); theta_old = vehicle_old(3); % 航向角 v = vehilce_con(1); % 速度控制量 delta = vehilce_con(2); % 前轮转角 ts = 0.1; L = 1.4; % 采样时间与轴距 x_new = x_old + v * cos(theta_old) * ts; y_new = y_old + v * sin(theta_old) * ts; theta_new = theta_old + tan(delta) * v/L * ts; vehicle_new = [x_new; y_new; theta_new]; end

这个模型我修改过三次才稳定:第一次忘记角度单位统一(MATLAB默认弧度制),第二次发现tan(delta)在大角度时线性度变差,第三次调整ts采样时间避免数值发散。建议初学者先把ts设为0.01-0.1秒,L取值1.4-2.7米(家用车轴距范围)。

2.2 模型线性化技巧

LQR需要线性状态方程,但自行车模型本质是非线性的。我的处理方法是:

  1. 在参考轨迹点附近进行一阶泰勒展开
  2. 将状态误差作为新状态量
  3. 推导得到雅可比矩阵A和B

具体推导过程会涉及偏微分,建议在纸上先完成符号运算。最终得到的线性离散方程形式为:

x(k+1) = A*x(k) + B*u(k)

其中x包含位置和航向误差,u包含速度和转角控制量。

3. LQR控制器设计与实现

3.1 权重矩阵调参经验

LQR性能核心取决于Q、R、S三个权重矩阵:

  • Q矩阵:惩罚状态误差(位置/角度)
  • R矩阵:惩罚控制量变化
  • S矩阵:终端代价权重

经过多次测试,我发现这样的配置效果较好:

Q = diag([10, 10, 5]); % [x误差, y误差, 航向误差] R = diag([0.1, 1]); % [速度变化, 转角变化] S = Q; % 终端权重与Q一致

当车辆出现"画龙"现象时,增大Q(3)改善航向跟踪;若控制量抖动剧烈,则适当增大R值。

3.2 实时求解器优化

直接调用MATLAB的dlqr函数虽然方便,但自定义求解器更灵活。这是我改进后的迭代求解代码:

function [F] = LQR_gain(A,B,S,Q,R) tol = 1e-3; max_iter = 200; P = S; for i = 1:max_iter F = (B'*P*B + R) \ (B'*P*A); P_new = Q + F'*R*F + (A-B*F)'*P*(A-B*F); if norm(P_new - P, 'fro') < tol break; end P = P_new; end end

实测发现,对于轨迹跟踪问题,迭代20次左右就能收敛。在纽伯格林赛道S弯处,控制周期最好能控制在50ms以内。

4. 赛道仿真与调试技巧

4.1 纽伯格林赛道数据处理

从公开数据获取的赛道坐标需要预处理:

  1. 等间距重采样(我常用1-2米间隔)
  2. 计算每个点的参考航向角
  3. 生成参考速度曲线(直道加速/弯道减速)
% 示例:计算参考航向角 for i = 2:length(ref_Posx)-1 dx = ref_Posx(i+1) - ref_Posx(i-1); dy = ref_Posy(i+1) - ref_Posy(i-1); reftheta(i) = atan2(dy, dx); end

4.2 可视化调试方法

除了常规的轨迹对比图,我还会绘制三个诊断曲线:

  1. 横向误差随时间变化
  2. 前轮转角控制量
  3. LQR反馈增益矩阵范数

这些曲线能快速定位问题:

  • 如果误差在弯道突然增大,可能需要调整Q矩阵
  • 若转角出现高频振荡,应该增加R(2)值
  • 增益范数突变说明线性化点选择不当

5. 工程实践中的常见问题

5.1 离散化导致的数值问题

采样时间ts选择不当会引起两种极端:

  • ts过大:导致离散误差显著,车辆轨迹出现"锯齿"
  • ts过小:计算负荷增加,实时性下降

建议根据车速动态调整ts:

ts = max(0.05, min(0.2, 0.5/(v+0.1))); % v为当前车速

5.2 大曲率弯道处理

在纽伯格林赛道的急弯处,我遇到过车辆"cut corner"的问题。解决方法包括:

  1. 在参考轨迹上增加预瞄点(look-ahead point)
  2. 根据曲率动态调整Q矩阵权重
  3. 加入前馈控制补偿项
% 曲率自适应权重 curvature = abs(计算曲率(ref_Posx, ref_Posy)); Q(3,3) = 5 + 20 * curvature; % 航向误差权重随曲率增加

最终实现的仿真效果应该达到:在80km/h速度下,横向误差能控制在0.3米以内,且控制量变化平滑无突变。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询