clc;
clear all;
close all;
% Initial state x(0)
X0=[0;0;(0*pi)/180];
vk=0;
Ts=0.01;
thetak=(0*pi)/180;
%thetak=-1.2586;
wk=0;
D=[-0.01;-0.01;-0.01];
N=5;
% Xr=[50 -50 0]';
% Xr(3)=(atan((-50-X0(2))/(50-X0(1))));
% Xr(3)=(atan((Xr(2)-X0(2))/(Xr(1)-X0(1))));
s=10;
Simlength=(s/Ts);
% Define cost functionx| and expected disturbances
Q=[1 0 0;0 1 0;0 0 1000000];
Q1=[10000 0 0;0 10000 0;0 0 1];
R=[0.1 0;0 0.001];
W=ones(1,N)'; % expected demand (this is just an example)
[A B C]=model_system(vk,thetak,Ts);
Q1=[Q1 zeros(size(Q1,2),size(B,2));zeros(size(B,2),size(Q1,2)) eye(size(B,2))];;
[A,B,D,Q]=increase_matrixDUQ(A,B,D,Q);
Q(4,4)=100;
Q(5,5)=100;
[Gx,Gu,Gw]=constants_mpc(A,B,D,N);
% Build R_hat
R_hat = kron(eye(N),R);
% Build Q_hat
Q_hat=kron(eye(N),Q);
Q_hat1=kron(eye(N),Q1);
% Constraints
Ax=[1 0 0;0 1 0;-1 0 0 ;0 -1 0];
bx=100*[150; 150;150; 150];
Au=[1 0;0 1 ;-1 0;0 -1];
bu=[5; 4; 5; 4];
Axaum=[Ax zeros(size(Ax,1),size(Au,2));zeros(size(Au,1),size(Ax,2)) Au];
bxaum=[bx;bu];
Ax=Axaum;
bx=bxaum;
bu=[20; 4; 20; 4];
% Transform into U constraints
Au_hat=kron(eye(N),Au);
bu_hat=kron(ones(N,1),bu);
Ax_hat=kron(eye(N),Ax);
bx_hat=kron(ones(N,1),bx);
%Delta U
% Aggregated U constraints
AU=[Ax_hat*Gu; Au_hat];
%bU=[bx_hat-Ax_hat*Gx*X0-Ax_hat*Gw*W;bu_hat];
% MPC into action
Xhist=X0;
Uhist=[];
VK=vk;
THK=thetak;
Disturb= normrnd(0.5,1,Simlength+N,1); %Longer than simulation for prediction horizon
% Simulation loop
XR=[];
u=[0;0];
D=zeros(3,1);
path=createPath();
i=1;
delta=0.5;
figure();
plot(Xhist(1,:),Xhist(2,:),'b',path(1,:),path(2,:),'mo')
ylabel('y');
xlabel('X');
title('Trayectory');
grid on;
hold on;
for k=1:Simlength
% expected disturbances (force that they are different)
% W=-10*ones(N,1);%0*Disturb(k:k+N-1)+0*normrnd(0,0.2,N,1);
W=-10*Disturb(k:k+N-1)+0*normrnd(0,0.2,N,1);
Wp=0*Disturb(k:k+N-1);
% Update controller matrices for current state and disturbances (H and Au are constant)
[A B C]=model_system(vk,thetak,Ts);
% Xr(3)=((atan((Xr(2)-X0(2))/(Xr(1)-X0(1)))));
%Xr(3)=(atan((-50-X0(2))/(50-X0(1))));
[Xr,i]=createReferenceDU(path,i,X0,B,vk,Ts,N,delta);
% if abs(Xr(3)-X0(3))<0.05
% UMPC=MPC_DU(A,B,D,N,W,X0,Xr,Q_hat1,R_hat,Au_hat,bu_hat,Ax_hat,bx_hat,u);
% else
UMPC=MPC_DU(A,B,D,N,Wp,X0,Xr,Q_hat,R_hat,Au_hat,bu_hat,Ax_hat,bx_hat,u);
% end
XR=[XR Xr(1:3)];
% Apply only first component
u=UMPC(1:size(B,2))+u;
X1=linearModel(A,B,D,u,Disturb(k),X0);
% X1=nonlinearModel(D,u,W(1),X0,thetak,wk,vk,Ts);
% vk=saturated(-8,8,vk+u(1));
% wk=saturated(-2,2,wk+u(2));
vk=(vk+u(1));
wk=(wk+u(2));
thetak=X1(3);
X0=X1;
VK=[VK vk];
THK=[THK thetak];
Xhist=[Xhist X0];
Uhist=[Uhist u];
plot(Xhist(1,:),Xhist(2,:),'b')
ylabel('y');
xlabel('X');
title('Trayectory');
grid on;
hold on;
pause(0.1);
[Gx,Gu,Gw]=constants_mpc(A,B,D,N);
Xpredict=Gx*X0+Gu*UMPC+Gw*W;
Xp=Xpredict(1:3:end);
Yp=Xpredict(2:3:end);
THp=Xpredict(3:3:end);
plot(Xp,Yp,'r')
end
%Simlength=size(Xhist,2);
t=0:Ts:Ts*(Simlength-1);
% figure();
% plot(Xhist);
% hold on;
% plot(Uhist);
% legend('X','U');
% xlim([0 Simlength]);
%u
figure();
subplot(4,1,1);
plot(t,Uhist(1,:));
ylabel('Velocity');
xlabel('Time(s)');
title('Delta Velocity');
grid on;
subplot(4,1,2);
plot(t,Uhist(2,:));
ylabel('Angular Velocity');
xlabel('Time(s)');
title('Delta Angular Velocity');
grid on;
% vk thetak
t2=0:Ts:Ts*(Simlength);
% figure();
subplot(4,1,3);
plot(t2,VK);
ylabel('Velocity');
xlabel('Time(s)');
title('Velocity');
grid on;
subplot(4,1,4);
plot(t2,THK,t2,Xhist(3,:));
%plot(THK);
ylabel('Theta');
xlabel('Time(s)');
title('Theta');
grid on;
% state x and y
figure();
plot(Xhist(1,:),Xhist(2,:),path(1,:),path(2,:),'o')
ylabel('y');
xlabel('X');
title('Trayectory');
grid on;
t=0:Ts:Ts*(Simlength-1);
t2=0:Ts:Ts*(Simlength);
figure();
subplot(3,1,1);
plot(t,XR(1,:),t2,Xhist(1,:));
ylabel('Velocity');
xlabel('Time(s)');
title('Velocity on X axis');
grid on;
% vk thetak
t2=0:Ts:Ts*(Simlength);
% figure();
subplot(3,1,2);
plot(t,XR(2,:),t2,Xhist(2,:));
ylabel('Velocity');
xlabel('Time(s)');
title('Velocity on Y axis');
grid on;
subplot(3,1,3);
plot(t,XR(3,:),t2,THK);
%plot(THK);
ylabel('Theta');
xlabel('Time(s)');
title('Theta');
grid on;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
该资源详细解读可关注博主免费专栏《论文与完整程序》196号博文 移动机器人路径跟踪的设计与仿真模型预测控制是一个重要的研究领域,旨在提升移动机器人在复杂环境中自主导航的能力。路径跟踪涉及使机器人沿预定轨迹行驶,这对于自动驾驶、无人机和服务机器人等应用至关重要。设计有效的控制策略可以确保机器人在动态环境中保持高精度的路径跟随,同时应对外部扰动和环境变化。 模型预测控制(MPC)是一种基于系统动态模型的控制方法,通过预测未来状态来优化当前控制输入。在路径跟踪中,MPC能够实时调整控制策略,以最小化跟踪误差和能耗。它的优点在于能够处理多种约束条件,确保机器人在满足安全性和稳定性的前提下,灵活地调整行驶路径。 仿真是验证路径跟踪算法有效性的关键步骤。通过在虚拟环境中模拟机器人运动,可以快速评估不同控制策略的性能,优化参数设置,并发现潜在问题。这一过程通常包括构建动态模型、设置路径参考点以及运行仿真试验,分析结果以进一步改进控制设计。
资源推荐
资源详情
资源评论
收起资源包目录
移动机器人路径跟踪的设计与仿真模型预测控制Design and simulation model predictive control for path following with mobile robot..zip (25个子文件)
MPC-mobile-robot-Path-following
Linear model
mpc_model_working.m 3KB
Nonlinear model
mpc_no_linear_model3.m 4KB
model_system.m 220B
mpc_no_linear_model_working.m 4KB
MPC_U2.m 341B
linearModel.m 63B
MPC_DU.m 274B
statesV1.fig 51KB
mpc_no_linear_model4.m 4KB
saturated.m 69B
createReference.m 661B
MPC_U.m 378B
mpc_no_linear_model2.m 4KB
constants_mpc2.m 510B
createPath.m 378B
createReferenceDU.m 772B
referencePathGeneratorN.m 74B
nonlinearModel.m 134B
increase_matrixDU.m 183B
mpc_no_linear_model6.m 4KB
mpc_no_linear_model5.m 4KB
constants_mpc.m 509B
trayectoryV1.fig 20KB
increase_matrixDUQ.m 274B
MPCii_sepicmm_vs_sepicsm_noise.slx 30KB
共 25 条
- 1
资源评论
电网论文源程序
- 粉丝: 1w+
- 资源: 350
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言-leetcode题解之34-search-for-a-range.c
- C语言-leetcode题解之33-search-in-rotated-sorted-array.c
- C语言-leetcode题解之32-longest-valid-parentheses.c
- 798225560046179月圆之夜v1.5.9修改版.apk
- 40个Python可视化图表案例(含源码)
- 343366978633126base.apk
- map_mode_escape_1.28.13.12700.pak
- androidx.multidex.MultiDexApplication.apk.1
- 丑子金装美化32(1).zip
- 基于Visual Basic .Net及Python技术的学校需求解决方案设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功