如需帮助,或有车联网、网联车辆控制、交通仿真、滤波与导航相关的代码定制需求,可从个人主页左侧联系我

订阅专栏后,可直接查看源代码,粘贴到MATLAB空脚本中即可直接运行、得到结果
文章目录
运行结果
-
速度跟踪对比图:对比前车、普通ACC和MPC节能跟驰车辆的速度变化,观察跟驰响应是否及时。

-
车间距误差图:展示两种方法的车间距误差变化,用于评价安全距离保持能力。

-
加速度控制量图:比较普通ACC和MPC的加速度控制动作,用于观察控制平顺性。

-
累计能耗对比图:给出累计能耗指标随时间变化的结果,展示节能控制效果。

-
MPC代价函数图:展示滚动优化代价随时间变化,便于理解MPC控制过程。

命令行窗口截图:

MATLAB源代码
完整代码位于同目录下:
matlab
%% MPC网联车辆节能跟驰控制例程
% 作者:matlabfilter(V 同)
% 2026-08-31/Ver1
% MPC = Model Predictive Control,即模型预测控制;V2X = Vehicle to Everything。
% 本例程对比普通ACC与MPC节能跟驰控制在速度跟踪、车间距误差和能耗指标上的差异。
clear; clc; close all;
rng(0);
% 设置仿真参数和典型工况,保证每次运行结果可复现。
dt = 0.1;
T = 90;
t = (0:dt:T)';
n = numel(t);
leadV = 20 + 2.8 * sin(2*pi*t/42) - 1.5 * exp(-((t-42)/9).^2) + 1.0 * exp(-((t-66)/7).^2);
leadV = max(12, min(27, leadV));
leadA = [0; diff(leadV) / dt];
leadX = cumsum(leadV) * dt;
para.d0 = 8;
para.h = 0.8;
para.length = 4.8;
para.aMin = -3.5;
para.aMax = 2.2;
acc = simulateACC(t, dt, leadX, leadV, para);
mpc = simulateMPC(t, dt, leadX, leadV, leadA, para);
acc.rmseGap = rmsValue(acc.gapError);
mpc.rmseGap = rmsValue(mpc.gapError);
acc.rmseSpeed = rmsValue(acc.speedError);
mpc.rmseSpeed = rmsValue(mpc.speedError);
acc.energy = cumsum(energyRate(acc.v, acc.a)) * dt;
mpc.energy = cumsum(energyRate(mpc.v, mpc.a)) * dt;
% 输出关键评价指标,便于从命令行直接比较不同策略。
fprintf('MPC网联车辆节能跟驰控制仿真结果\n');
fprintf('普通ACC | 间距误差RMSE %.3f 米 | 速度误差RMSE %.3f 米/秒 | 累计能耗指标 %.3f\n', ...
acc.rmseGap, acc.rmseSpeed, acc.energy(end));
fprintf('MPC节能跟驰 | 间距误差RMSE %.3f 米 | 速度误差RMSE %.3f 米/秒 | 累计能耗指标 %.3f\n', ...
mpc.rmseGap, mpc.rmseSpeed, mpc.energy(end));
fprintf('MPC相对普通ACC能耗指标降低 %.2f%%。\n', ...
100 * (acc.energy(end) - mpc.energy(end)) / max(acc.energy(end), eps));
% 绘制结果图窗;图窗保持纯净,不在 MATLAB 窗口内添加水印。
figure('Color','w','Units','pixels','Position',[80 80 400 400]);
plot(t, leadV, 'k-', 'LineWidth', 1.5); hold on;
plot(t, acc.v, '--', 'LineWidth', 1.3, 'Color', [0.82 0.25 0.18]);
plot(t, mpc.v, '-', 'LineWidth', 1.5, 'Color', [0.08 0.42 0.68]);
grid on; box on; xlabel('时间(秒)'); ylabel('速度(米/秒)');
title('速度跟踪对比'); legend('前车', '普通ACC', 'MPC节能跟驰', 'Location', 'best'); styleAxes();
% 绘制结果图窗;图窗保持纯净,不在 MATLAB 窗口内添加水印。
figure('Color','w','Units','pixels','Position',[90 90 400 400]);
plot(t, acc.gapError, '--', 'LineWidth', 1.3, 'Color', [0.82 0.25 0.18]); hold on;
plot(t, mpc.gapError, '-', 'LineWidth', 1.5, 'Color', [0.08 0.42 0.68]);
yline(0, ':'); grid on; box on; xlabel('时间(秒)'); ylabel('车间距误差(米)');
title('车间距误差'); legend('普通ACC', 'MPC节能跟驰', 'Location', 'best'); styleAxes();
% 绘制结果图窗;图窗保持纯净,不在 MATLAB 窗口内添加水印。
figure('Color','w','Units','pixels','Position',[100 100 400 400]);
plot(t, acc.a, '--', 'LineWidth', 1.2, 'Color', [0.82 0.25 0.18]); hold on;
plot(t, mpc.a, '-', 'LineWidth', 1.4, 'Color', [0.08 0.42 0.68]);
grid on; box on; xlabel('时间(秒)'); ylabel('加速度(米/秒^2)');
title('加速度控制量'); legend('普通ACC', 'MPC节能跟驰', 'Location', 'best'); styleAxes();
% 绘制结果图窗;图窗保持纯净,不在 MATLAB 窗口内添加水印。
figure('Color','w','Units','pixels','Position',[110 110 400 400]);
plot(t, acc.energy, '--', 'LineWidth', 1.4, 'Color', [0.82 0.25 0.18]); hold on;
plot(t, mpc.energy, '-', 'LineWidth', 1.5, 'Color', [0.08 0.42 0.68]);
grid on; box on; xlabel('时间(秒)'); ylabel('累计能耗指标');
title('累计能耗对比'); legend('普通ACC', 'MPC节能跟驰', 'Location', 'northwest'); styleAxes();
% 绘制结果图窗;图窗保持纯净,不在 MATLAB 窗口内添加水印。
figure('Color','w','Units','pixels','Position',[120 120 400 400]);
plot(t, mpc.cost, 'LineWidth', 1.4, 'Color', [0.08 0.42 0.68]);
grid on; box on; xlabel('时间(秒)'); ylabel('MPC滚动代价');
title('MPC代价函数变化'); styleAxes();
% 核心仿真函数:根据控制策略更新车辆状态并计算评价指标。
function res = simulateACC(t, dt, leadX, leadV, para)
n = numel(t); x = zeros(n,1); v = zeros(n,1); a = zeros(n,1);
x(1) = leadX(1) - para.d0 - para.h * leadV(1) - para.length;
v(1) = leadV(1) - 1.2;
reactionStep = round(0.45 / dt);
for k = 2:n
obsIndex = max(1, k - reactionStep);
gap = leadX(obsIndex) - x(k-1) - para.length;
gapError = gap - para.d0 - para.h * v(k-1);
speedError = leadV(obsIndex) - v(k-1);
u = 0.72 * gapError + 1.45 * speedError + 0.10 * sin(0.85 * k * dt);
u = min(para.aMax, max(para.aMin, u));
a(k) = 0.35 * a(k-1) + 0.65 * u;
v(k) = max(0, v(k-1) + a(k) * dt);
x(k) = x(k-1) + v(k-1) * dt + 0.5 * a(k) * dt^2;
end
res = packResult(x, v, a, leadX, leadV, para);
end
% 核心仿真函数:根据控制策略更新车辆状态并计算评价指标。
function res = simulateMPC(t, dt, leadX, leadV, leadA, para)
n = numel(t); x = zeros(n,1); v = zeros(n,1); a = zeros(n,1); cost = zeros(n,1);
x(1) = leadX(1) - para.d0 - para.h * leadV(1) - para.length - 0.5;
v(1) = leadV(1) - 1.0;
for k = 2:n
frontV = leadV(k-1) + 0.6 * leadA(k-1) * dt;
gap = leadX(k-1) - x(k-1) - para.length;
gapError = gap - para.d0 - para.h * v(k-1);
speedError = frontV - v(k-1);
u = 0.36 * gapError + 0.70 * speedError + 0.40 * leadA(k-1);
if abs(gapError) < 1.2 && abs(speedError) < 0.8
u = 0.45 * u;
end
safeGap = para.d0 + 0.35 * para.h * v(k-1);
if gap < safeGap
u = min(u, -0.65 * (safeGap - gap));
end
u = min(1.55, max(-2.40, u));
a(k) = 0.68 * a(k-1) + 0.32 * u;
v(k) = max(0, v(k-1) + a(k) * dt);
x(k) = x(k-1) + v(k-1) * dt + 0.5 * a(k) * dt^2;
cost(k) = gapError^2 + 0.40 * speedError^2 + 1.80 * energyRate(v(k), a(k)) + 1.20 * (a(k) - a(k-1))^2;
end
res = packResult(x, v, a, leadX, leadV, para);
res.cost = cost;
end
function res = packResult(x, v, a, leadX, leadV, para)
gap = leadX - x - para.length;
res.x = x; res.v = v; res.a = a;
res.gapError = gap - para.d0 - para.h * v;
res.speedError = leadV - v;
end
function e = energyRate(v, a)
e = 0.030 * max(a, 0) .* max(v, 0) + 0.75 * max(a, 0).^2 + 0.16 * abs(a);
end
function y = rmsValue(x)
idx = max(1, round(numel(x)*0.08));
z = x(idx:end);
y = sqrt(mean(z.^2));
end
function styleAxes()
set(gca, 'FontName', 'Microsoft YaHei', 'FontSize', 10, 'LineWidth', 0.9);
end
程序详解
核心公式
本程序将跟驰精度、速度平顺性和能耗指标统一到MPC节能跟驰框架中。车辆与前车之间的间距误差定义为:
e d ( k ) = x f ( k ) − x ( k ) − L − d 0 − h v ( k ) e_d(k)=x_f(k)-x(k)-L-d_0-hv(k) ed(k)=xf(k)−x(k)−L−d0−hv(k)
速度误差采用前车预测速度与本车速度之差:
e v ( k ) = v f ( k ) + 0.6 a f ( k ) Δ t − v ( k ) e_v(k)=v_f(k)+0.6a_f(k)\Delta t-v(k) ev(k)=vf(k)+0.6af(k)Δt−v(k)
程序中的MPC控制律采用滚动优化思想的简化显式形式,综合间距、速度和前车加速度信息:
u ( k ) = 0.36 e d ( k ) + 0.70 e v ( k ) + 0.40 a f ( k ) u(k)=0.36e_d(k)+0.70e_v(k)+0.40a_f(k) u(k)=0.36ed(k)+0.70ev(k)+0.40af(k)
为避免过近跟驰,程序设置安全间距约束:
d s a f e ( k ) = d 0 + 0.35 h v ( k ) d_{\mathrm{safe}}(k)=d_0+0.35hv(k) dsafe(k)=d0+0.35hv(k)
d ( k ) < d s a f e ( k ) ⇒ u ( k ) ≤ − 0.65 d s a f e ( k ) − d ( k ) d(k)<d_{\mathrm{safe}}(k)\Rightarrow u(k)\leq -0.65\leftd_{\\mathrm{safe}}(k)-d(k)\\right d(k)<dsafe(k)⇒u(k)≤−0.65dsafe(k)−d(k)
能耗瞬时指标由正加速度功率、加速度平方项和加速度绝对值项组成:
E ˙ ( k ) = 0.030 max ( a ( k ) , 0 ) v ( k ) + 0.75 max ( a ( k ) , 0 ) 2 + 0.16 ∣ a ( k ) ∣ \dot E(k)=0.030\max(a(k),0)v(k)+0.75\max(a(k),0)^2+0.16|a(k)| E˙(k)=0.030max(a(k),0)v(k)+0.75max(a(k),0)2+0.16∣a(k)∣
滚动代价函数用于刻画当前控制动作的综合代价:
J ( k ) = e d ( k ) 2 + 0.40 e v ( k ) 2 + 1.80 E ˙ ( k ) + 1.20 a ( k ) − a ( k − 1 ) 2 J(k)=e_d(k)^2+0.40e_v(k)^2+1.80\dot E(k)+1.20\lefta(k)-a(k-1)\\right^2 J(k)=ed(k)2+0.40ev(k)2+1.80E˙(k)+1.20a(k)−a(k−1)2
累计能耗指标为:
E ( k ) = ∑ j = 1 k E ˙ ( j ) Δ t E(k)=\sum_{j=1}^{k}\dot E(j)\Delta t E(k)=j=1∑kE˙(j)Δt
场景建模
程序围绕网联车辆控制与车路协同通行优化建立简化但完整的仿真场景,包含车辆运动状态、控制策略、扰动因素和评价指标。
对比方法
例程设置基准策略和协同/优化策略,便于观察V2X、CAV、CACC或MPC等方法对速度、间距、延误、能耗或稳定性的改善效果。
结果输出
脚本运行后会显示结果图窗并输出命令行指标