在无人驾驶技术领域,车辆控制系统的设计直接决定了行驶的安全性和舒适性。纵横向联合控制需要同时处理车辆前进方向(纵向)和转向(横向)两个维度的运动控制,这对控制算法的鲁棒性和协调性提出了极高要求。目前主流的解决方案是采用双PID(比例-积分-微分)控制器处理横向控制,配合LQR(线性二次型调节器)实现纵向控制,这种组合在实践中表现出良好的稳定性和跟踪性能。
关键提示:纵横向控制的核心挑战在于两个维度的耦合效应。例如急加速时转向不足会加剧,而高速过弯时制动效率会降低。优秀的联合控制算法必须考虑这些动态耦合关系。
本系统采用分层式控制架构:
python复制# 伪代码示例:控制流程主循环
while vehicle_running:
trajectory = quintic_polynomial_planner() # 五次多项式轨迹生成
lateral_error = calculate_lateral_error()
longitudinal_error = calculate_longitudinal_error()
steering_angle = dual_pid_controller(lateral_error)
acceleration = lqr_controller(longitudinal_error)
throttle_brake = calibration_table_lookup(acceleration)
send_commands(steering_angle, throttle_brake)
使用CarSim 19作为车辆动力学仿真平台,其优势包括:
LQR控制器的设计关键在于状态空间模型建立和代价函数定义:
状态方程:
code复制ẋ = Ax + Bu
y = Cx + Du
其中状态变量x通常包含位置误差、速度误差等
代价函数:
code复制J = ∫(xᵀQx + uᵀRu)dt
Q矩阵惩罚状态偏差,R矩阵惩罚控制量变化
黎卡提方程求解:
python复制# Python实现黎卡提方程迭代求解
P = np.zeros((n,n)) # 初始化
for _ in range(max_iter):
P_new = Q + A.T @ P @ A - A.T @ P @ B @ np.linalg.inv(R + B.T @ P @ B) @ B.T @ P @ A
if np.max(np.abs(P_new - P)) < tol:
break
P = P_new
K = np.linalg.inv(R + B.T @ P @ B) @ B.T @ P @ A # 最优反馈矩阵
预制的标定表包含不同工况下的控制参数映射:
python复制# 标定表示例数据结构
calibration_table = {
'low_speed': {
'max_accel': 2.5, # m/s²
'optimal_brake_curve': [...],
'efficiency_zone': (0.3, 0.7) # 油门开度范围
},
# 其他速度区间...
}
实践经验:标定表应包含温度补偿参数,特别是电动车在不同电池温度下的扭矩输出特性会显著变化。
双PID设计采用串级控制架构:
外环PID:处理航向角误差
内环PID:处理转角跟踪误差
python复制class DualPIDController:
def __init__(self, outer_pid, inner_pid):
self.outer = outer_pid # 外环PID实例
self.inner = inner_pid # 内环PID实例
def update(self, heading_error, steering_angle):
# 外环计算期望转角
desired_angle = self.outer.update(heading_error)
# 内环计算控制量
control = self.inner.update(desired_angle - steering_angle)
return control
推荐采用"先内后外"的调参顺序:
首先固定内环PID:
然后调节外环PID:
调试技巧:在CarSim中设置3m/s的恒定速度,观察不同曲率弯道的跟踪效果。好的参数应该使横向误差保持在车道宽度10%以内。
五次多项式的一般形式:
code复制s(t) = a₀ + a₁t + a₂t² + a₃t³ + a₄t⁴ + a₅t⁵
需要满足的边界条件:
构建矩阵方程求解多项式系数:
python复制def solve_quintic_coeffs(start_cond, end_cond, T):
"""求解五次多项式系数
start_cond: [s0, v0, a0]
end_cond: [sT, vT, aT]
T: 运动时间
"""
A = np.array([
[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0],
[1, T, T**2, T**3, T**4, T**5],
[0, 1, 2*T, 3*T**2, 4*T**3, 5*T**4],
[0, 0, 2, 6*T, 12*T**2, 20*T**3]
])
b = np.array([*start_cond, *end_cond])
return np.linalg.solve(A, b)
相比三次多项式,五次多项式可以保证:
仿真步长设置:
信号映射配置:
ini复制[VehicleInput]
SteeringWheelAngle = SIMULINK, 0 # 转向指令
Throttle = SIMULINK, 1 # 油门指令
Brake = SIMULINK, 2 # 制动指令
[VehicleOutput]
Velocity = SIMULINK, 3 # 车速反馈
YawRate = SIMULINK, 4 # 横摆角速度
建议按以下顺序验证算法:
现象:车辆行驶轨迹出现持续摆动
排查步骤:
现象:车辆总是"跟不上"参考路径
解决方案:
python复制feedforward = curvature * wheelbase * (1 + K*v²) # K为不足转向梯度
现象:控制指令达到物理限幅
应对措施:
python复制if not actuator_saturated:
integral += error * dt
对于追求更高性能的开发人员,可以考虑:
参数自适应:根据车速自动调整PID参数
python复制def update_gains(self, velocity):
self.kp = self.base_kp * (1 + velocity/self.v_ref)
# 其他参数类似...
模型预测控制(MPC):替代LQR处理约束优化问题
轮胎模型补偿:基于Pacejka模型修正控制指令
执行器动态补偿:考虑电机/液压系统的响应延迟
在实际项目中,我们通过CarSim验证发现,这套控制方案在80km/h以下速度区间能保持0.1m以内的横向跟踪误差,纵向速度控制误差小于0.5m/s。特别是在城市道路场景中,对曲率连续弯道的跟踪表现优异。