在繁忙的城市交通中,我们经常看到这样的场景:前车突然刹车,后车司机手忙脚乱地踩刹车;前车加速,后车又急忙跟上。这种"一脚油门一脚刹车"的驾驶方式不仅让司机疲惫,也增加了交通事故的风险。而今天我们要探讨的,是如何让五辆电动汽车像大雁编队一样,自主、协调地行驶。
这个项目采用了基于模型预测控制(MPC)的分布式系统架构,实现了五辆电动汽车的协同自适应巡航控制。系统采用上下分层控制方式:上层控制器负责策略制定,使用MPC算法计算期望加速度;下层控制器负责执行,将加速度指令转化为具体的电机扭矩分配。这种分层结构就像一支训练有素的交响乐团——指挥把控整体节奏,各乐器精准执行。
整个控制系统采用上下两层架构,这种设计借鉴了人类驾驶的决策过程。当人类驾驶时,大脑会先判断"应该加速还是减速"(上层决策),然后手脚执行具体的油门或刹车操作(下层执行)。
上层控制器(决策层):
下层控制器(执行层):
提示:这种分层设计的关键优势在于解耦了决策和执行,使得系统可以分别优化两个层面的算法,同时也便于后期功能扩展。
五辆车之间的通信采用前车跟随(Predecessor-Following)拓扑结构:
这种设计类似于自行车队的骑行方式——每位骑行者只需关注前面一个人的动作,而不需要知道整个队伍的动态。
模型预测控制的核心思想可以类比为下棋:走每一步时,不仅考虑当前局面,还预测未来几步的可能发展,选择最优的走法。在车辆控制中,MPC会在每个控制周期:
这种"滚动优化"的策略使MPC能够有效处理系统约束和时变特性。
MPC控制器需要一个预测模型来描述车辆动力学。本项目采用简化的线性模型:
状态方程:
code复制x(k+1) = A x(k) + B u(k)
其中:
这个模型虽然简化,但足以在低速跟车场景下提供良好的预测精度。
MPC的核心是构建和求解一个优化问题。以下是关键的优化要素:
目标函数:
code复制min Σ(α*(位置误差)² + β*(速度误差)² + γ*(控制量)²)
三项分别惩罚:
约束条件:
加加速度(jerk)限制特别重要,它直接影响了乘坐舒适性。一般限制在1.5-2.5 m/s³之间。
以下是MPC控制器的简化Python实现:
python复制def mpc_controller(ego_state, leader_states):
# 系统矩阵
A = np.array([[1, dt], [0, 1]])
B = np.array([[0.5*dt**2], [dt]])
# 优化变量:控制序列
P = cvxpy.Variable((prediction_horizon, 1))
# 初始化目标函数和约束
cost = 0
constraints = []
x = ego_state # 当前状态
# 滚动时域预测
for k in range(prediction_horizon):
# 状态预测
x = A @ x + B @ P[k]
# 安全距离约束
constraints += [x[0] <= leader_states[k][0] - safe_distance]
# 加速度约束
constraints += [P[k] >= a_min, P[k] <= a_max]
# 加加速度约束
if k > 0:
constraints += [cvxpy.abs(P[k]-P[k-1]) <= max_jerk*dt]
# 目标函数项
cost += alpha*(x[0]-desired_pos)**2 + beta*(x[1]-desired_vel)**2 + gamma*P[k]**2
# 求解
prob = cvxpy.Problem(cvxpy.Minimize(cost), constraints)
prob.solve(solver=cvxpy.OSQP)
return P.value[0] # 仅返回第一个控制量
注意:实际实现中还需要考虑数值稳定性、求解器配置等问题。OSQP求解器因其高效和鲁棒性成为MPC应用的常见选择。
下层控制器的任务是将上层给出的加速度指令转化为四个电机的具体扭矩输出。这需要考虑:
这个问题可以表述为一个带约束的优化问题:找到一组扭矩分配,使得总驱动力等于需求,同时满足各种约束条件。
本项目采用加权伪逆法进行扭矩分配,主要优点是计算效率高,适合实时控制。Matlab实现如下:
matlab复制function torque = torque_distribution(acc_des, soc)
% 电机参数
motor_max = [300 300 300 300]; % Nm
motor_min = [-200 -200 -200 -200]; % 再生制动
% 基于SOC的权重矩阵
W = diag([soc(1), soc(2), soc(3), soc(4)]);
% 分配矩阵:第一行对应纵向力,第二行对应横摆力矩
B_matrix = [1 1 1 1; % 总驱动力
-1 1 -1 1]./wheel_radius; % 横摆力矩
% 加权伪逆分配
torque = W*B_matrix'/(B_matrix*W*B_matrix') * [acc_des*vehicle_mass; 0];
% 施加电机约束
torque = min(max(torque, motor_min'), motor_max');
end
这个实现有几个关键点:
SOC权重:电量高的电机承担更多驱动任务,这可以平衡电池组间的SOC差异,延长整体续航。实测显示这种策略能提升约15%的续航里程。
横摆力矩约束:分配矩阵的第二行确保左右扭矩差不会产生不希望的横摆力矩,防止车辆跑偏。
电机约束:最后一步将计算出的扭矩限制在电机实际能力范围内。
在实车调试中,我们发现几个关键参数需要特别注意:
SOC权重更新频率:不宜过快,否则会导致扭矩分配频繁跳变。建议每10秒更新一次SOC权重。
电机扭矩限制:需要考虑温度影响。持续大扭矩输出时,应根据电机温度动态调整最大扭矩限制。
轮径一致性:四个车轮的半径必须定期校准,微小的差异(>1mm)会导致扭矩分配误差。
为了验证控制器的跟踪性能,我们设计了前车以正弦波形式加减速的测试场景:
code复制前车速度 = 初始速度 + 2*sin(2π*0.1*t) [m/s]
测试结果显示:
五辆车组成的车队表现出良好的"弹簧阻尼"特性:前车加速时,后车能平顺跟随;前车减速时,后车能及时平稳制动,没有明显的"抖动"现象。
模拟前车突然制动(减速度4m/s²)的场景:
为验证系统鲁棒性,我们模拟了不同程度的通信延迟:
| 延迟(ms) | 车距误差增加 | 舒适性下降 |
|---|---|---|
| 50 | <5% | 不明显 |
| 100 | 15% | 轻微 |
| 200 | 40% | 明显 |
结果显示系统能容忍约100ms的通信延迟,超过此值需考虑更复杂的预测补偿算法。
MPC的计算复杂度较高,在嵌入式系统上实现实时控制是一个挑战。我们采取了以下优化措施:
代码优化:
求解器调优:
硬件选择:
这些措施使得单次MPC求解时间控制在30ms以内,满足10Hz的控制频率要求。
实际车辆传感器(雷达、IMU等)都存在噪声,我们采用以下滤波策略:
雷达数据:
IMU数据:
轮速信号:
为确保安全,系统实现了多级保护:
输入校验层:
控制监控层:
执行保障层:
故障处理策略:
当前系统主要针对直线跟车场景,下一步计划加入弯道适应能力:
道路曲率补偿:
轮胎力分配优化:
参考路径生成:
进一步优化能量效率的潜在方向:
预测性节能控制:
再生制动协调:
车队空气动力学:
利用车联网技术提升系统性能:
信息共享:
协同决策:
云端学习:
在实际调试过程中,我们发现MPC的权重参数对性能影响很大,需要根据实际路测数据不断调整。一个实用的技巧是记录驾驶员的操作数据,将其作为MPC调参的参考基准。此外,不同天气和路况下,控制参数也需要适当调整——这是我们下一步要重点解决的问题。