✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
一、预测轮胎 - 道路最大摩擦系数的重要性
- 行车安全 :轮胎 - 道路最大摩擦系数(TRFC)直接影响车辆的制动、加速和操控性能。在湿滑路面或结冰道路上,TRFC 显著降低,车辆容易失控,引发交通事故。准确预测 TRFC 能帮助驾驶员提前调整驾驶策略,如降低车速、保持更大的安全距离,从而提高行车安全性。
- 车辆控制系统优化 :现代车辆配备了各种先进的控制系统,如防抱死制动系统(ABS)、电子稳定程序(ESP)等。这些系统依赖于对轮胎与道路间摩擦力的准确估计来实现最佳控制效果。预测 TRFC 可为这些系统提供更精确的参数,优化其控制策略,提升车辆整体性能。
二、多层感知器(MLP)神经网络基础
- 结构组成 :MLP 是一种前馈神经网络,由输入层、多个隐藏层和输出层组成。输入层接收外部数据,输出层产生最终预测结果,隐藏层则对输入数据进行非线性变换和特征提取。层与层之间通过权重连接,权重决定了神经元之间信号传递的强度。
- 工作原理 :当数据输入到 MLP 时,首先进入输入层,然后通过权重传递到隐藏层。隐藏层中的神经元对输入信号进行加权求和,并通过激活函数(如 Sigmoid、ReLU 等)进行非线性变换,将处理后的信号传递到下一层。这个过程在隐藏层中反复进行,使得网络能够学习到数据中的复杂模式。最终,信号传递到输出层,输出层神经元再次对输入进行加权求和,产生预测结果。
- 学习过程 :MLP 通过训练来调整权重,以最小化预测值与实际值之间的误差。常用的训练算法是反向传播算法,该算法首先计算输出层的误差,然后将误差反向传播到隐藏层和输入层,根据误差对权重进行调整。这个过程不断重复,直到网络收敛,即误差达到可接受的水平。
三、选择车辆垂向加速度数据的原因
- 与 TRFC 的相关性 :车辆垂向加速度与轮胎 - 道路之间的相互作用密切相关。当车辆行驶在不同路面上时,路面的不平整会引起车辆垂向加速度的变化。同时,轮胎与道路间的摩擦力也会影响车辆的垂向运动。例如,在摩擦力较大的路面上,车辆对路面颠簸的响应相对较小,垂向加速度变化较为平稳;而在摩擦力较小的路面上,车辆更容易受到路面不平的影响,垂向加速度波动较大。因此,垂向加速度数据中蕴含了关于轮胎 - 道路摩擦力的信息。
- 数据获取便利性 :车辆垂向加速度可以通过车载传感器轻松获取。现代车辆通常配备有加速度传感器,这些传感器能够实时准确地测量车辆在垂直方向上的加速度。相比其他可能与 TRFC 相关的参数(如轮胎温度、路面湿度等),垂向加速度数据获取成本低、实时性强,为基于数据驱动的 TRFC 预测提供了良好的数据基础。
四、基于 MLP 神经网络的预测原理
- 数据预处理 :首先对采集到的车辆垂向加速度数据进行预处理。这包括数据清洗,去除异常值和噪声;数据归一化,将数据映射到一个特定的范围(如 [0, 1]),以加快网络收敛速度并提高训练效果。同时,将数据划分为训练集、验证集和测试集,训练集用于训练 MLP 网络,验证集用于调整网络参数和防止过拟合,测试集用于评估网络的最终性能。
- 模型训练 :将预处理后的训练集数据输入到 MLP 神经网络中,通过反向传播算法不断调整网络的权重,使网络学习到垂向加速度数据与 TRFC 之间的映射关系。在训练过程中,使用验证集数据评估网络的性能,根据验证集误差调整网络的超参数(如隐藏层神经元数量、学习率等),以避免过拟合,确保网络具有良好的泛化能力。
- 预测与评估 :训练完成后,将测试集数据输入到训练好的 MLP 网络中,得到 TRFC 的预测值。通过计算预测值与实际值之间的误差指标(如均方误差、平均绝对误差等)来评估模型的预测性能。如果模型性能不满足要求,可以进一步调整网络结构或超参数,重新进行训练和评估,直到获得满意的预测结果。
编辑
⛳️ 运行结
编辑
编辑
编辑
📣 部分代码
close all
clearvars
clc
% NAME='1_Braking_shahrvand_Abs_on_output_2020-11-27_09-23-20';
NAME='coarse-output_2020-12-18_15-21-19';
D=xlsread([NAME '.xls']);
%% Calibration
% % IMU1
D(:,2) = D(:,2) - 0.086 ; % Ax
D(:,3) = D(:,3) + 0.021 ; % Ay
D(:,4) = D(:,4) - 0.025 ; % Az
% D(:,2) = D(:,2) - 0.06 ; % Ax
% D(:,3) = D(:,3) + 0.06 ; % Ay
% D(:,4) = D(:,4) - 0.01 ; % Az
% % IMU2
D(:,8) = D(:,8) - 0.052; % Ax
D(:,9) = D(:,9) + 0.01; % Ay
D(:,10)= D(:,10)+0.01;% Az
% D(:,8) = D(:,8) - 0.046; % Ax
% D(:,9) = D(:,9) + 0.045; % Ay
% D(:,10)= D(:,10);% Az
% %
% % IMU3
D(:,14) = D(:,14) - 0.078; % Ax
D(:,15) = D(:,15) + 0.042 ; % Ay
D(:,16) = D(:,16) - 0.017; % Az
%
% D(:,14) = D(:,14) - 0.055; % Ax
% D(:,15) = D(:,15) + 0.058 ; % Ay
% D(:,16) = D(:,16) - 0.02; % Az
%%
Acc(:,:)=D(:,14:16);
Acc_x=Acc(:,1);
Acc_y=Acc(:,2);
Acc_z=Acc(:,3);
lon=D(:,28)*pi/180;
lat=D(:,27)*pi/180;
for J=1:length(lon)-2
if abs(10000*lat(J+1))<abs(lat(J)) || abs(lat(J+1)/10000)>abs(lat(J))
J;
[Acc_x(J) Acc_x(J+1)];
D(J+1,:)=[];
Acc_x(J+1)=[];
Acc_y(J+1)=[];
Acc_z(J+1)=[];
lon(J+1)=[];
lat(J+1)=[];
end
end
V_GPS=D(:,29)/3.6;
R_earth=6371000; % Radius of curvature on the Earth
x = R_earth.* cos(lat).* cos(lon);
y = R_earth.* cos(lat).* sin(lon);
z = R_earth.*sin(lat);
% t=0.005*(0:length(x)-1);
t=0.01*(0:length(x)-1);
x=x-x(1);
y=y-y(1);
%%%%
% K = find(abs(Acc_x-(min(Acc_x)))<0.0001); % Find the index where abs(Acc_x) is maximum
% Mu = MuEstimation(min(Acc_x)*9.81 , V_GPS(K))
% Acc_x=lowpass(Acc_x,50,100);
% Acc_y=lowpass(Acc_y,40,100);
% Acc_z=lowpass(Acc_z,40,100);
% min(Acc_x)*9.81
Acc_xm = movmean(Acc_x,70);
figure;
plot(t,Acc_x,'g-','linewidth',2)
hold on;
plot(t,Acc_xm,'b-','linewidth',1.5)
legend('Standard','Filtered')
min(Acc_xm)
K = find(abs(Acc_xm-(min(Acc_xm)))<0.00001)
% Min_Acc = mean(Acc_x(K-35:K+35));
Mu = MuEstimation(Acc_xm(K)*9.81,V_GPS(K))
figure;
% subplot(3,1,[1 2])
% plot(x,y,'b-')
% xlabel('x (m)')
% ylabel('y (m)')
% title([num2str(NAME(end-18:end-9)), ' ', num2str(NAME(end-7:end))])
% grid minor
% axis equal
hold on
% pause;
% for i=1:100:length(x)
% subplot(3,1,[1 2])
% plot(x(i),y(i),'r*')
% hold on
% subplot(3,1,3)
plot(t,Acc_x,'r-')
hold on
plot(t,Acc_y,'g-')
hold on
plot(t,Acc_z,'b-')
hold off
% legend('Longitudinal','Lateral','Vertical')
grid minor
xlabel('Time (sec)')
ylabel('Acceleration (g)')
% line([t(i) t(i)],[-1 2],'Color','k','LineStyle','-')
% pause(1);
hold off
% end
legend('Longitudinal','Lateral','Vertical')
grid on
xlabel('Time (sec)')
ylabel('Acceleration (g)')
x=[t',x];
y=[t',y];
V_GPS=[t',V_GPS];
Acc_x=[t',Acc_x];
Acc_y=[t',Acc_y];
Acc_z=[t',Acc_z];
lat_GPS=[t',lat*180/pi];
lon_GPS=[t',lon*180/pi];
global lat_GPS0 lon_GPS0
lat_GPS0=lat(1)*180/pi;
lon_GPS0=lon(1)*180/pi;
% global R
% R=0;
% global X_lim_min X_lim_max Y_lim_min Y_lim_max
% X_lim_min=-500;
% X_lim_max=+500;
% Y_lim_min=-500;
% Y_lim_max=+500;
global X Y
X=0;
Y=0;
T = D(:,1)-D(1,1);
% figure
% subplot(3,1,3)
% plot(Acc_x(:,1),Acc_x(:,2),'r')
% hold on
% plot(Acc_y(:,1),Acc_y(:,2),'g')
% hold on
% plot(Acc_z(:,1),Acc_z(:,2),'b')
% legend('Longitudinal','Lateral','Vertical')
% grid on
% xlabel('Time (sec)')
% ylabel('Acceleration (g)')
🔗 参考文献