一种数据驱动的自动驾驶汽车前馈补偿器优化方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🌈3 Matlab代码实现

🎉4 参考文献


💥1 概述

一个可靠的控制器对于自动驾驶汽车的安全和平稳操纵的执行至关重要。控制器必须对外部干扰(如路面、天气、风况等)具有鲁棒性。它还需要处理车辆子系统的内部变化,包括动力系统效率低下、测量误差等。

📚2 运行结果

 

 

部分代码:

% 测试工作空间
% plot(x_real.data,y_real.data,'r-',x_predict.data,y_predict.data,'k-')

% input1是MPC输出的期望前轮转角,2是实际速度,3是方向盘转矩,4是方向盘角速度,5是期望1-实际4的差值
% output是0.2s后的期望delta-实际delta
% save NNdata290.mat
% load NNdata80.mat

% 由于zero-orderd的原因,delta_real的t时刻记录的数据其实是t-1时刻的,记录错位了0.05s
% 但实际延迟还是0.2s,只是input的记录延迟了,real(t=6)= predict(t=1)

clc; clear;
load double_lane_change_0.2s_0.02_2.mat
% load double_lane_change_0.2s_0.02.mat

% 24s*20=480  延时0.1s,周期0.05s 所以预测未来2步的
% 步数差距越小越好预测,所以可以采用小延时,改动△u来增大误差
input1 = delta_predict.data(1:360,1);
%input2 = v_real.data(1:360,1);
input3 = steer_torque.data(1:360,1);
input4 = omega.data(1:360,1); 
% input4 = delta_real.data(1501:5795,1);
% input5 = delta_predict.data(1:360,1) -  delta_real.data(1:360,1);

% input_train = [input1, input2, input3,input4, input5]';
input_train = [input1, input3, input4]';

input_train = con2seq(input_train);

future_err = (delta_predict.data(5:364,1) - delta_real.data(6:365,1))';
output_train = con2seq(future_err);

n=3;        % 应该是x的输入数据为,x(t-0) ——> x(t-3)
m=0;
net1 = timedelaynet(m:n,[3]);         % 依赖于过去x,y的两个时间单位的值,隐含层10个节点

% narxnet(inputDelays,feedbackDelays,hiddenSizes,trainFcn) takes these arguments,
% inputDelays     Row vector of increasing 0 or positive delays (default = 1:2)
% feedbackDelays  Row vector of increasing 0 or positive delays (default = 1:2)
% hiddenSizes     Row vector of one or more hidden layer sizes (default = 10)
% trainFcn        Training function (default = 'trainlm')

net1.divideFcn = '';
net1.trainParam.min_grad = 1e-15;
net1.trainParam.epochs = 25; 
% net1.trainParam.lr = 0.005;

[Xs,Xi,Ai,Ts] = preparets(net1,input_train,output_train);  % 数据准备
% Prepare input and target time series data for network simulation or training
% [Xs,Xi,Ai,Ts,EWs,shift] = preparets(net,Xnf,Tnf,Tf,EW) takes these arguments,
% p     Xs    Shifted inputs              2x4289 cell  每个cell是3+1
% Pi    Xi    Initial input delay states   2x6   cell 初始化输入
% Ai    Ai    Initial layer delay states      没用上
% t     Ts    Shifted targets         1x4289 目标值

net1 = train(net1,Xs,Ts,Xi);  % 训练,没用上 Ai
% save ('newdata+buchang80_2_TDnet')      % 只用了第二次迭代跑的80s的数据
% view(net1)


% net2 = removedelay(net1,m);       不用removedelay?
% view(net2)
net2 = net1;

% 加入后可以不输入output_test了?
% save ('net_narx290_removedelay')
 gensim(net2, 0.05)

% 换了输入输出又来一遍,测试集?
% input_test1 = delta_predict.data(1:1495,1);
% input_test2 = v_real.data(1:1495,1);
% input_test3 = steer_torque.data(1:1495,1);
input_test1 = delta_predict.data(1:475,1);
% input_test2 = v_real.data(1:477,1);
input_test3 = steer_torque.data(1:475,1);
input_test4 = omega.data(1:475,1);


% input_test4 = delta_real.data(1:1495,1);
% input_test5 = delta_predict.data(1:475,1) -  delta_real.data(1:475,1);

% input_test = [input_test1, input_test2, input_test3, input_test4, input_test5]';
% input_test = [input_test1, input_test2, input_test3]';
input_test = [input_test1, input_test3, input_test4]';

input_test = con2seq(input_test);

% future_err_test = (delta_predict.data(5:1499,1) - delta_real.data(6:1500,1))';
future_err_test = (delta_predict.data(5:479,1) - delta_real.data(6:480,1))';

output_test = con2seq(future_err_test);

[Xs1,Xi1,Ai1,Ts1] = preparets(net2,input_test,{});    % 数据准备

predict_err = sim(net2,Xs1,Xi1);          % 仿真,yp是预测的误差

[Xs1,Xi1,Ai1,Ts1] = preparets(net2,input_test,output_test);    % 数据准备
e = cell2mat(predict_err)-cell2mat(Ts1);      % 为什么要用cell2mat??输出(估计)误差 - 期望(实际)误差
% x = (5+n:1499)/20;
x = (5+n:479)/20;

figure(1)
plot(x,e,'b')
xlabel('t/s')
ylabel('delta error/rad')
legend('err_err')

🌈3 Matlab代码实现

🎉4 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]侯忠生,许建新.数据驱动控制理论及方法的回顾和展望[J].自动化学报,2009,35(06):650-667.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前馈广义预测控制是一种利用数学建模和控制算法实现系统控制的方法。它可以对系统进行建模并通过预测控制算法实现对系统的精确控制。 前馈广义预测控制的MATLAB代码如下: ```MATLAB function [u_opt, Cost] = GPC(plant_model, Np, Nu, lambda, r, u_ini, y_ini, y, u_max, u_min) % plant_model: 系统的动态模型 % Np: 预测时域 % Nu: 控制时域 % lambda: 控制器参数 % r: 参考信号 % u_ini: 初始输入 % y_ini: 初始输出 % y: 系统输出 % u_max: 输入上限 % u_min: 输入下限 % 设置控制器参数 Q = eye(Np); R = eye(Nu) * lambda; % 初始化参数 x = [u_ini; y_ini] - [u_ini(1); y_ini(1)]; delta_u = zeros(Nu, 1); u_opt = u_ini; Cost = 0; % 构建预测模型 H = []; for i = 1:Np row = zeros(Nu, Nu * Np); for j = 1:Nu row(:,j:Nu:end) = diagsignal(j + i - 1, Nu, Np); end H = [H; row]; end % 计算控制移动平均参数 y_avg = mean(y); du_avg = mean(diff(u_ini)); % 迭代计算控制输入信号 for k = 1:Np b = r(k) - y_avg; A = H * plant_model; f = Q * b - A' * delta_u; lb = u_min - u_opt(k); ub = u_max - u_opt(k); delta_u_opt = quadprog(A' * R * A + Q, f, [], [], [], [], lb, ub); delta_u = delta_u + delta_u_opt; u_opt = u_opt + delta_u; Cost = Cost + (r(k) - y(k))^2 + lambda * delta_u_opt' * R * delta_u_opt; end end function D = diagsignal(d, m, n) D = zeros(m, n); for i = 1:m for j = 1:n if i + d == j D(i, j) = 1; end end end end ``` 以上代码实现前馈广义预测控制算法,其中主要包括控制器参数设置、预测模型的构建、控制移动平均参数的计算和控制输入信号的迭代计算等步骤。通过该算法,可以实现对系统的精确控制,并根据参考信号和系统输出来计算控制输入信号,使得系统的输出尽可能地接近参考信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值