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

订阅专栏后,可直接查看源代码,粘贴到MATLAB空脚本中即可直接运行、得到结果
本例程面向车联网环境下的多车纵向协同控制问题,构建“领航车加减速工况 + 多辆网联车跟驰 + 通信时延与丢包扰动”的完整仿真场景,对普通ACC和CACC进行同条件对比。程序能够直观展示CACC利用V2X前车加速度信息后,在速度跟踪、车间距控制、加速度平顺性和队列稳定性方面的改善效果,适合用于车联网、智能网联汽车、协同自适应巡航控制、交通流稳定性等方向的课程设计、论文复现和二次开发。
运行结果
- 速度跟踪对比图:对比领航车、普通ACC末车和CACC末车的速度变化过程,展示车队对加减速扰动的跟踪能力。

-
车间距误差图:给出普通ACC和CACC在典型车辆上的车间距误差变化,用于观察跟驰控制精度和安全间距保持效果。

-
加速度控制量图:展示领航车、普通ACC末车和CACC末车的加速度响应,用于分析控制动作是否平顺、是否存在明显振荡。

- 通信时延影响图:扫描不同V2X通信时延下的间距误差和队列稳定性指标,观察时延增大对协同控制性能的影响。

- 队列稳定性指标图:对比普通ACC和CACC的速度扰动放大倍数,指标小于1时表示扰动沿车队传播没有被放大。

MATLAB源代码
完整代码:
%% CACC网联车辆协同跟驰控制例程
% 作者:matlabfilter,接定位与导航、滤波相关的matlab代码定制
% 2026-08-31 / Ver1
clear; clc; close all;
rng(0);
% 设置仿真参数和典型工况,保证每次运行结果可复现。
%% 仿真参数
dt = 0.05; % 采样时间,s
T = 80; % 仿真时长,s
t = (0:dt:T)';
numStep = numel(t);
numFollower = 5; % 跟驰车辆数量
veh.length = 4.8; % 车辆长度,m
veh.tauAcc = 0.55; % 车辆纵向动力学时间常数,s
veh.aMin = -4.0; % 最大制动减速度,m/s^2
veh.aMax = 2.5; % 最大驱动加速度,m/s^2
policy.d0 = 7.0; % 静止安全间距,m
policy.h = 0.75; % 期望时距,s
policy.kpAcc = 0.34; % ACC间距误差增益
policy.kvAcc = 0.72; % ACC相对速度增益
policy.kpCacc = 0.42; % CACC间距误差增益
policy.kvCacc = 0.88; % CACC相对速度增益
policy.kff = 0.68; % 前车加速度前馈增益
policy.delayStep = round(0.25 / dt);
policy.lossRate = 0.10;
%% 领航车工况
[leadX, leadV, leadA] = makeLeadVehicle(t, dt);
%% 普通ACC与CACC仿真
acc = simulatePlatoon('ACC', leadX, leadV, leadA, t, dt, veh, policy, numFollower);
cacc = simulatePlatoon('CACC', leadX, leadV, leadA, t, dt, veh, policy, numFollower);
%% 通信时延敏感性
delayList = [0.00 0.10 0.20 0.30 0.40 0.55 0.70];
delayRms = zeros(size(delayList));
delayAmp = zeros(size(delayList));
for k = 1:numel(delayList)
testPolicy = policy;
testPolicy.delayStep = round(delayList(k) / dt);
testPolicy.lossRate = 0.08;
tmp = simulatePlatoon('CACC', leadX, leadV, leadA, t, dt, veh, testPolicy, numFollower);
delayRms(k) = tmp.metrics.spacingRms;
delayAmp(k) = tmp.metrics.stringAmp;
end
%% 结果指标
% 输出关键评价指标,便于从命令行直接比较不同策略。
fprintf('CACC网联车辆协同跟驰控制仿真结果\n');
fprintf('仿真车辆:1辆领航车 + %d辆跟驰车,仿真时长 %.1f 秒,采样时间 %.2f 秒。\n', ...
numFollower, T, dt);
fprintf('V2X设置:通信时延 %.2f 秒,丢包率 %.1f%%。\n\n', ...
policy.delayStep * dt, policy.lossRate * 100);
fprintf('普通ACC | 间距误差RMSE %.3f 米 | 速度误差RMSE %.3f 米/秒 | 最大加速度 %.3f 米/秒^2 | 队列稳定性指标 %.3f\n', ...
acc.metrics.spacingRms, acc.metrics.speedRms, acc.metrics.maxAbsAcc, acc.metrics.stringAmp);
fprintf('CACC协同控制 | 间距误差RMSE %.3f 米 | 速度误差RMSE %.3f 米/秒 | 最大加速度 %.3f 米/秒^2 | 队列稳定性指标 %.3f\n\n', ...
cacc.metrics.spacingRms, cacc.metrics.speedRms, cacc.metrics.maxAbsAcc, cacc.metrics.stringAmp);
fprintf('CACC相对普通ACC的间距误差降低 %.2f%%。\n', ...
100 * (acc.metrics.spacingRms - cacc.metrics.spacingRms) / max(acc.metrics.spacingRms, eps));
fprintf('CACC相对普通ACC的速度误差降低 %.2f%%。\n', ...
100 * (acc.metrics.speedRms - cacc.metrics.speedRms) / max(acc.metrics.speedRms, eps));
fprintf('队列稳定性指标小于1表示扰动沿车队传播时没有被放大。\n');
%% 结果绘图
% 通过独立绘图函数生成五个结果图窗;图窗保持纯净,不在 MATLAB 窗口内添加水印。
plotSpeedTracking(t, leadV, acc, cacc);
plotSpacingError(t, acc, cacc);
plotAcceleration(t, leadA, acc, cacc);
plotDelayImpact(delayList, delayRms, delayAmp);
plotStringStability(t, acc, cacc);
%% 局部函数
function [x, v, a] = makeLeadVehicle(t, dt)
a = zeros(size(t));
a(t >= 8 & t < 15) = 0.85;
a(t >= 24 & t < 32) = -1.15;
a(t >= 42 & t < 50) = 0.65;
a(t >= 58 & t < 66) = -0.70;
a = smoothdata(a, 'movmean', max(3, round(0.6 / dt)));
v = zeros(size(t));
v(1) = 20.0;
for i = 2:numel(t)
v(i) = max(8.0, min(29.0, v(i - 1) + a(i - 1) * dt))

401

被折叠的 条评论
为什么被折叠?



