自动驾驶车辆路径跟踪控制是智能驾驶系统的核心技术之一。当车辆以较高速度行驶时,单纯依靠几何路径跟踪方法(如纯追踪算法)往往会出现明显的横向偏差,这时就需要引入考虑车辆动力学特性的控制算法。LQR(线性二次调节器)正是一种能够兼顾控制精度和能耗优化的经典控制方法。
我在实际开发中发现,很多工程师虽然知道LQR的理论框架,但在具体实现时常常会遇到几个典型问题:
本文将基于一个典型的二自由度车辆模型,详细拆解从建模到仿真的完整实现过程。所有代码示例均采用Python实现,配合注释说明关键实现细节。
对于路径跟踪场景,我们通常采用经典的二自由度"自行车模型"。这个模型做了三个关键假设:
模型的状态方程可以表示为:
code复制ẋ = v * cos(ψ + β)
ẏ = v * sin(ψ + β)
ψ̇ = v / Lf * δ
v̇ = a
其中:
注意:当车速低于5m/s时,这个模型的精度会明显下降,此时更适合使用几何跟踪方法。
为了设计LQR控制器,我们需要建立以路径跟踪误差为状态量的模型。定义以下误差变量:
经过线性化处理后,得到误差状态方程:
code复制ė_y = v * (e_ψ + β)
ė_ψ = v / Lf * δ - κ * v
其中κ为参考路径的曲率。
将模型离散化(采样时间Δt=0.02s)后,可以得到适用于LQR设计的离散状态空间表达式:
code复制x(k+1) = A x(k) + B u(k)
y(k) = C x(k)
状态变量x = [e_y, ė_y, e_ψ, ė_ψ],控制输入u = δ。
LQR的核心是设计使以下代价函数最小的控制律:
code复制J = ∫(x'Qx + u'Ru)dt
Q和R矩阵的选择直接影响控制效果。经过多次实测验证,我总结出以下参数整定经验:
python复制Q = np.diag([1.0, 0.1, 0.5, 0.1]) # 重点优化位置误差
R = np.array([[0.1]]) # 限制转向幅度
实际车辆的前轮转角存在物理限制(通常|δ|≤30°)。在仿真中需要加入饱和处理:
python复制delta = np.clip(delta, -np.deg2rad(30), np.deg2rad(30))
对于更精细的控制,可以采用以下改进方案:
我们使用Python科学计算栈实现完整仿真:
python复制import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import solve_continuous_are
参考路径设计为复合工况:
LQR控制器的关键计算步骤:
python复制def lqr_control(A, B, Q, R):
# 解Riccati方程
P = solve_continuous_are(A, B, Q, R)
# 计算反馈增益
K = np.linalg.inv(R) @ B.T @ P
return K
路径跟踪主循环:
python复制for i in range(sim_steps):
# 计算当前跟踪误差
err = compute_error(vehicle_state, ref_path)
# LQR控制量计算
delta = -K @ err
# 执行控制量
vehicle_state = update_vehicle(delta, vehicle_state)
# 记录数据
log_data(vehicle_state, delta)
在v=15m/s(约54km/h)工况下测试:
误差主要来源分析:
通过蒙特卡洛仿真发现:
在实际ECU部署时需要注意:
测试条件:v=12m/s,正弦路径(振幅4m,波长50m)
python复制def nonlinear_tire_model(alpha, Fz):
# Pacejka魔术公式
D = μ * Fz
B = C * np.arctan(B * alpha)
return D * np.sin(B)
python复制lookahead_dist = max(2.0, 0.3 * velocity)
target_point = ref_path.get_point_at_distance(lookahead_dist)
python复制Q[0,0] = 1.0 + 0.05 * (v - 10) # 高速时加强位置误差权重
实际项目中,我们最终采用的方案是LQR+前馈补偿,在保持计算效率的同时,将最大跟踪误差降低了约35%。特别是在高速公路场景(v>80km/h)下,横向误差能稳定控制在0.2m以内,完全满足量产要求。