利用MPC算法进行轨迹追踪——螺旋曲线(Matlab代码实现)

👨‍🎓个人主页:研学社的博客    

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

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

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

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

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

MPC优点:

MPC善于处理多输入多输出系统(MIMO);

MPC可以处理约束,如安全性约束,上下阈值;

MPC是一种向前考虑未来时间步的有限时域优化方法(一定的预测能力)

最优控制要求在整个时间优化

实际上MPC采用了一个折中的策略,既不是像最优控制那样考虑整个时域,也不是仅仅考虑当前,而是考虑未来的有限时间域。

在自动驾驶和无人车领域的路径规划常常被分为运动轨迹生成与车辆路径跟踪控制两个部分。传统的基于几何条件的跟踪算法如pure-pursuit由于没有考虑车辆运动学导致控制精度和稳定性等方面存在不足,因此目前大部分采用线性MPC控制算法,从而平衡控制精度与计算量。

本文首先介绍通用的MPC控制流程,对这一基于优化的控制理论有一定的认知。然后利用MPC算法进行轨迹追踪,最后针对轨迹跟踪问题介绍如何将通用MPC算法应用至轨迹跟踪问题。​

📚2 运行结果

主函数部分代码:

clc;
clear all;
close all;
%% 绘制目标圆锥螺旋线轨迹
pi=3.14;
t=0:0.2:500;%总的轨迹时间
t_size=size(t);
w=0.08;%圆锥螺旋线的角速度
v_r=-0.05;%z轴轨迹的速度
v_zr=-0.5*ones(1,t_size(2));
v_xr=0.025*cos(w*t);%x轴轨迹的速度
v_yr=0.025*sin(w*t);%y轴轨迹的速度
x_r=t.*v_xr;%x轴轨迹的位置
y_r=t.*v_yr;%y轴轨迹的位置
z_r=t.*v_r;%z轴轨迹的位置
%% MPC轨迹跟踪
K=20;
dt=0.2;
w_p=100;
w_v=1;
w_a=1;
w_j=1;
p_0=[0,8,0];%x,y,z
v_0=[0,0,0];
a_0=[0,0,0];
log=[0 p_0 v_0 a_0 0 0 0];
i=1;
for t=0:0.2:400
    [Tp, Tv, Ta, Bp, Bv, Ba] =getPredictionMatrix(K, dt, p_0, v_0, a_0);
    Pr=[x_r(i:i+K-1)';y_r(i:i+K-1)';z_r(i:i+K-1)'];
    Vr=[v_xr(i:i+K-1)'
;v_yr(i:i+K-
1
)
';v_zr(i:i+K-1)'
];    H=w_j*eye(3*K)+w_p*(Tp'*Tp)+w_v*(Tv'*Tv)+w_a*(Ta'*Ta);
    F=w_p*(Bp'
-Pr
')*Tp+w_v*(Bv'
-Vr
')*Tv+w_a*Ba'
*Ta;    A=[Tv;-Tv;Ta;-Ta;eye(3*K);-eye(3*K)];
    
    b=[ones(3*K,1)*6-Bv;ones(2*K,1)*6+Bv(1:2*K);ones(K,1)+Bv(2*K+1:3*K);...
        ones(3*K,1)*3-Ba;ones(2*K,1)*3+Ba(1:2*K);ones(K,1)+Ba(2*K+1:3*K);...
        ones(2*K,1)*3;ones(K,1)*2;ones(2*K,1)*3;ones(K,1)*2];
    
    J=quadprog(H,F,A,b);
%     J=quadprog(H,F,[],[]);
    
    jx=J(1);
    jy=J(1+K);
    jz=J(1+2*K);
    
    p_0(1)=p_0(1)+v_0(1)*dt+0.5*a_0(1)*dt^2+1/6*jx*dt^3;
    v_0(1)=v_0(1)+a_0(1)*dt+0.5*jx*dt^2;
    a_0(1)=a_0(1)+jx*dt;
    
    p_0(2)=p_0(2)+v_0(2)*dt+0.5*a_0(2)*dt^2+1/6*jy*dt^3;
    v_0(2)=v_0(2)+a_0(2)*dt+0.5*jy*dt^2;
    a_0(2)=a_0(2)+jy*dt;
​
    p_0(3)=p_0(3)+v_0(3)*dt+0.5*a_0(3)*dt^2+1/6*jz*dt^3;
    v_0(3)=v_0(3)+a_0(3)*dt+0.5*jz*dt^2;
    a_0(3)=a_0(3)+jz*dt;
    
    log=[log;t p_0 v_0 a_0 jx jy jz];
    i=i+1;
end
figure(1)
subplot(2,2,1)
p_size=size(log);
plot3(x_r(1:p_size(1)),y_r(1:p_size(1)),z_r(1:p_size(1)),'r','linewidth',2)
hold on
plot3(log(:,2),log(:,3),log(:,4),'b','linewidth',2);
legend('ref','traj');
title('position');
​
subplot(2,2,2)
plot(log(:,1),log(:,5),log(:,1),log(:,6),log(:,1),log(:,7));
legend('x','y','z');
% hold on
% plot(log(1:p_size(1),1),v_xr(1:p_size(1)),log(1:p_size(1),1),v_yr(1:p_size(1)),log(1:p_size(1),1),v_zr(1:p_size(1)));
% legend('x','y','z','x_r','y_r','z_r');
title('v');
subplot(2,2,3)
plot(log(:,1),log(:,8),log(:,1),log(:,9),log(:,1),log(:,10));
legend('x','y','z');
title('a');
subplot(2,2,4)
plot(log(:,1),log(:,11),log(:,1),log(:,12),log(:,1),log(:,13));
legend('x','y','z');
title('jerk');
​
​

🎉3 参考文献

[1]刘蕊. 基于模型预测算法的全方位移动机器人轨迹追踪控制研究[D].天津大学,2019.DOI:10.27356/d.cnki.gtjdu.2019.003003.

部分理论引用网络文献,若有侵权联系博主删除。

🌈4 Matlab代码实现

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于MPC控制算法MATLAB代码示例,用于实现圆形轨迹跟踪: ```matlab % MPC基本参数设置 N = 10; % 预测时域长度 Q = 1; % 状态权重 R = 1; % 控制权重 % 圆形轨迹参数 radius = 5; % 圆形半径 dt = 0.1; % 时间步长 t = 0:dt:10; % 时间向量 x_ref = radius * cos(t); % 参考轨迹 x 坐标 y_ref = radius * sin(t); % 参考轨迹 y 坐标 % 系统模型定义 A = [1 dt; 0 1]; % 状态转移矩阵 B = [0; dt]; % 输入矩阵 C = [1 0]; % 输出矩阵 % 控制器设计 sys = ss(A, B, C, 0, dt); % 系统模型 Q_mpc = kron(eye(N), Q); % 状态权重矩阵 R_mpc = kron(eye(N), R); % 控制权重矩阵 [K, ~, ~] = dlqr(A, B, Q, R); % 离散时间线性二次调节器 % 初始化状态和输入 x0 = [0; 0]; % 初始状态 u0 = zeros(N-1, 1); % 初始输入 % MPC控制循环 x_history = zeros(2, length(t)); % 保存状态历史 u_history = zeros(1, length(t)); % 保存输入历史 for i = 1:length(t) % 计算参考状态 x_ref_i = [x_ref(i); y_ref(i)]; % 构建MPC控制器问题 P = C * Q * C' + R; F = [A - eye(2), B; C, 0]; G = [x_ref_i - A*x0; 0]; H = [Q_mpc, zeros(2*N, N-1); zeros(N-1, 2*N), R_mpc]; L = [x0; u0] - K * x_ref_i; M = [F, G; H, L]; % 解决MPC控制器问题 Z = M \ [zeros(2, 1); zeros(N-1, 1); zeros(N, 1)]; u = Z(3:end); % 更新状态和输入历史 x_history(:, i) = x0; u_history(i) = u(1); % 更新状态 x0 = A * x0 + B * u(1); end % 绘制结果 figure; plot(x_ref, y_ref, '--k', 'LineWidth', 1.5); hold on; plot(x_history(1, :), x_history(2, :), 'b', 'LineWidth', 1.5); grid on; xlabel('X'); ylabel('Y'); legend('参考轨迹', '跟踪轨迹'); axis equal; ``` 这段代码实现了基于MPC控制算法的圆形轨迹跟踪。它首先定义了MPC的参数,包括预测时域长度N、状态权重Q和控制权重R。然后定义了圆形轨迹的参数,包括半径radius、时间步长dt和时间向量t。接下来定义了系统模型的状态转移矩阵A、输入矩阵B和输出矩阵C。 然后进行控制器设计,通过离散时间线性二次调节器(dlqr)计算得到反馈增益K。接着初始化状态和输入,并进行MPC控制循环。在每个时刻,根据当前参考状态和系统模型构建MPC控制器问题,并使用反向传播法求解得到最优输入。更新状态并保存状态和输入历史。 最后,绘制参考轨迹跟踪轨迹的图像。 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体系统进行参数调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值