最近在研究自动驾驶控制领域的一个经典问题——路径跟踪控制。通过Matlab和Simulink联合仿真,我实现了一个基于车辆运动学模型的LQR控制器,能够精确跟踪双移线、五次多项式等多种参考路径。实测效果相当不错,双移线跟踪误差可以控制在0.05米以内。
这个项目最吸引我的地方在于,它完美展现了控制理论在自动驾驶领域的实际应用。LQR(线性二次调节器)作为一种经典的最优控制方法,在车辆横向控制中表现出了惊人的稳定性和精确性。下面我将详细分享整个实现过程,包括模型建立、控制器设计、仿真实现等关键环节。
要实现精确的路径跟踪,首先需要建立合适的车辆模型。这里我们采用简化的自行车模型(Bicycle Model)作为基础:
code复制% 车辆运动学模型参数
L = 2; % 轴距(m)
dt = 0.1; % 时间步长(s)
这个模型假设车辆只有前后两个轮子,前轮负责转向,后轮负责驱动。虽然简化了实际车辆的动力学特性,但对于低速场景下的路径跟踪已经足够精确。
模型的状态空间表示为:
code复制x = [y; theta; v]; % 状态向量
u = [delta]; % 控制输入
其中:
基于运动学关系,我们可以推导出状态转移矩阵A和输入矩阵B:
code复制A = [0, v, 0;
0, 0, v/L;
0, 0, 0];
B = [0;
v/L;
0];
这里需要注意,由于模型是非线性的(包含状态变量v和控制量delta的乘积项),我们需要在工作点附近进行线性化处理。这也是为什么LQR控制器虽然基于线性系统理论,却能在这个非线性系统中表现良好的原因。
由于我们采用数字控制,需要将连续系统离散化:
code复制Ad = expm(A*dt); % 状态转移矩阵离散化
Bd = Ad*B; % 输入矩阵离散化
离散化后的系统方程为:
code复制x(k+1) = Ad * x(k) + Bd * u(k)
LQR控制器的核心在于Q和R矩阵的选择,它们分别代表对状态误差和控制输入的惩罚权重:
code复制Q = [10, 0, 0;
0, 10, 0;
0, 0, 1];
R = [1];
这里的设计原则是:
使用Matlab的lqr函数求解最优控制增益:
code复制[K, S, E] = lqr(Ad, Bd, Q, R);
得到的K矩阵就是我们的LQR控制器增益,控制律为:
code复制u = -K * x
Simulink模型主要包含三个部分:
参考路径生成:
车辆模型实现:
code复制function x_next = vehicle_model(x, u, L, dt)
% 状态更新
y_dot = x(3) * sin(x(2));
theta_dot = x(3) * tan(u(1)) / L;
v_dot = 0; % 假设速度恒定
% 欧拉积分
x_next = x + [y_dot; theta_dot; v_dot] * dt;
end
LQR控制器:
code复制function u = lqr_controller(x_ref, x, K)
% 计算状态误差
error = x - x_ref;
% 应用控制律
u = -K * error;
end
测试条件:
结果分析:
测试条件:
结果分析:
推荐值:0.05-0.2 s
可能原因:
解决方案:
可能原因:
解决方案:
可能原因:
解决方案:
模型改进:
控制器增强:
抗干扰能力:
实际应用:
这个项目让我深刻体会到,经典控制理论在现代自动驾驶系统中仍然具有重要价值。LQR控制器以其简洁的形式和良好的性能,在路径跟踪任务中展现出了强大的实用性。通过合理的参数调整和模型改进,完全可以满足实际应用的需求。