MPC控制器学习-NMPC

article/2025/11/9 10:52:15

趁着刚讲明白马上记录一下,不然以后又忘了_(:з」∠)_是一位老师给的现成的mpc小项目,代码写的很仔细能够帮助理解mpc的原理。
场景是一个二维平面的小车(看成一个质点),要运动到目标点,途中避开圆形范围的障碍物。
小车的矩形边框可以无视,只用作画图(方便展示旋转角度)。
MPC可以看做是一个算法,大概就是仿真系统运行K步,然后取第1步作为真实要走的步数。仿真通过常微分方程来计算,比如要仿真下一步step[k+1]=step[k]+ODE
第一步,因为有了ODE,又有了离散化的时间,我们就可以仿真出K步的位置。
第二步,设计目标函数。目标函数要最小,比如在这个例子中,就是距离goal的距离最短。一般是把K的距离都加起来再乘以一些参数啥的作为目标函数。
第三步,设置限制条件。比如速度不能超过多少,角速度不能超过多少,以及距离障碍物的距离要大于的半径等等。
这三样东西都有了呢,我们就可以把它们全部送进优化器里面,优化器会计算出来,优化的结果就放在state_predict数组里面,至于这个感觉还要研究一下语法的问题。
在这里插入图片描述
这个例子最后的效果如图:
在这里插入图片描述

%% Code for Nonlinear Model Predictive Control
% Status of cars and Navigation horizon can be modified in section
% "Set Robot Parameters" and "Set System Parameters".
% YALMIP required. Visit _yalmip.github.io_ for more information%% ============= Initialization =============
yalmip('clear'); clear ; close all; clc;%% ============= Render Obstacles =============
% Set number and size of obstacles
choice_size = 4;   
choice_num = 1;
horizon = 15; % 仿真步数 15if choice_num ~= 0obs = obs_render(choice_num,choice_size);
end%% ============= Set Robot Parameters =============
% Initialize robot status
robot = struct(...'length',4,...          % Length of the robot 画图用 后面三个点是换行用的,这样写好看'width',1.8,...         % Width of the robot 画图用'x_init',[-15;-15;0],...% Starting point of the robot 没用到'x_curr',[-15;-15;0],...% Current point of the robot 理论上初始化:x_curr=x_init,初始坐标和角度θ'x_goal',[15;15;0],...  % Goal point of the robot 目标坐标和角度θ'sample_freq',0.2,...   % Sampling frequency of the robot 步长,也可以说是时间间隔δt'flag',0,...            % Denote whether the robot has reached the goal point 标记是否到达目标'state_predict',0,...   % Predict sequence of state 预测的状态,里面应该存的是方程'control_predict',0);   % Predict sequence of control 控制的状态,里面应该存的是方程%% ============= Set System Parameters =============
% Set whether to print information for each optimization
verbose = 1;
% Global settings for map
world = struct(...'nx',3,...              % The number of parameters in state vector: q = [x y theta] 坐标和θ'nu',2,...              % The number of parameters in input vector: u = [v w] 速度和角速度'approx',0.3,...        % The range of error allowed near the goal point 'margin',20,...         % The margin of the world map'lim_v',2,...           % The limit of velosity'lim_w',pi/3,...        % The limit of angular velocity'horizon',horizon,...        % The prediction horizon 预测的步数 这里是15'safety_distance',2.2); % The safety distance between two robots 这里只有一个robot 没用到%% ============= Initialize Map =============
% Plot initial and goal states
trace = init_plot_map(robot,world);% 画图用
if choice_num ~= 0plot_obs(obs,world,robot,'C');
end
fprintf('Press enter to continue.\n');pause% ============= Initialize Constraints and Objective =============
robot.control_predict = ...sdpvar(repmat(world.nu,1,world.horizon), repmat(1,1,world.horizon)); % 生成了115列的矩阵,里面的每个元素是三行1[3,1]的sdpvar类型, 总的来说就是,315列的矩阵,用来存x,y,θ的,% sdqvar() 设置实型,intvar()设置整形,binvar()设置二进制形。
robot.state_predict = ...sdpvar(repmat(world.nx,1,world.horizon+1), repmat(1,1,world.horizon+1));% 生成了116列的矩阵,里面的每个元素是两行1[2,1]的sdpvar类型, 总的来说就是,315列的矩阵,用来存 v,w的
constraints = [];
objective = 0;for k = 1:world.horizonrobot.state_predict{k+1} = robot.state_predict{k} + robot.sample_freq*...[cos(robot.state_predict{k}(3)) 0; sin(robot.state_predict{k}(3)) 0; 0 1]*...robot.control_predict{k};% 这是它的预测方程预测的方式是,下一步的速度是用当前步+从当前的x,y,θ出发,按照v,w的速度前行0.2步,得到下一步的状态(里面的x,y,xita,v,w都更新了)。objective = objective + (1+40*floor(k/world.horizon))*...((robot.state_predict{k+1}(1)-robot.x_goal(1))^2+...(robot.state_predict{k+1}(2)-robot.x_goal(2))^2+...(robot.state_predict{k+1}(3)-robot.x_goal(3))^2); %目标函数,floor是向下取整这里的方式是前面k-1步都值只+1,最后一步距离目标的位置会被考虑进来。constraints = [constraints,...-pi            <= robot.state_predict{k+1}(3) <= pi,...-world.lim_v   <= robot.control_predict{k}(1) <= world.lim_v,...-world.lim_w   <= robot.control_predict{k}(2) <= world.lim_w];% 限制条件,if choice_num ~= 0for cnt = 1:length(obs)bias_x = obs{cnt}.center(1);bias_y = obs{cnt}.center(2);min_dis = obs{cnt}.size + world.safety_distance;constraints = [constraints, (robot.state_predict{k+1}(1)-bias_x)^2+...(robot.state_predict{k+1}(2)-bias_y)^2>=min_dis^2]; % 障碍物的限制条件endend
end% ============= Solve optimization problem =============
step = 0;
time_cost = []; objective_val = []; predict_graph = [];while (robot.flag ~= 1)% Solve optimization problem and save calculation timet_start = cputime;optimize([constraints, robot.state_predict{1} == robot.x_curr], objective, ...sdpsettings('solver','fmincon','verbose',verbose)); % 送进优化器,优化应该是state_predict和control_predict一起优化的,运行完这句话以后,里面存的值应该都是使得当前目标函数取得最小值时候的状态。%也可以写成result = optimize() 判断result.problem==0 % 要去看看yalmip用法。robot.state_predict{1} == robot.x_curr 这个也加到了限制条件里面去,就相当于每次起步的初始状态赋值% v和w是我们需要控制的,所以不用初始值,每次都可以完全不一样,我们的优化目的就是找到最好的v和w使得 距离最近% v 和w 的限制也也在constraints 里面了。% sdpsettings是YALMIP和solver之间通信的桥梁,t_central = cputime - t_start;time_cost = [time_cost, t_central];objective_val = [objective_val, norm(robot.x_curr-robot.x_goal)];% Plot preduction statuspredict_graph = plot_predicted_states(predict_graph,world,robot);% Set and plot new current state% *** KNOWN PROBLEM ***% Handle possible buggy situations due to solver that the first input% might be zero. In such case, we choose the second predict state.robot.x_curr = value(robot.state_predict{2});if abs(value(robot.state_predict{1}) - value(robot.state_predict{2})) <= 0.01robot.x_curr = value(robot.state_predict{3});end% 这里第一步就是当前步,所以预测15步,取第二步作为真实的下一步,如果第二步和第一步差距很小,就采用第三步。plot_robot(robot.x_curr(1),robot.x_curr(2),robot.x_curr(3));% Determine whether reached the goal pointstep = step + 1; % step只是用来计步数if norm(robot.x_curr-robot.x_goal)<world.approx  %如果离终点小于阈值,就认为到达了robot.flag = 1;endpause(0.0001);
end
%后面就是画图啥的了
% Delete prediction status
for i = 1:length(predict_graph)% delete(predict_graph{i});
end% Directly display the information of time cost
disp(mean(time_cost));
disp(max(time_cost));%% ============= Save graph and data =============
% Generate plot of time consuming for each step
[time,obj] = plot_time_and_obj(time_cost,step,objective_val);
% Save graph and data as fig and mat files
file_id = ['nmpc_num_',num2str(choice_num),'_size_',num2str(choice_size)];
saveas(trace,['.\output\NMPC\trace_',file_id,'.fig']);
saveas(time,['.\output\NMPC\time_',file_id,'.fig']);
saveas(obj,['.\output\NMPC\obj_',file_id,'.fig']);
save(['.\output\NMPC\time_',file_id,'.mat'],'time_cost');
save(['.\output\NMPC\obj_',file_id,'.mat'],'objective_val');

http://chatgpt.dhexx.cn/article/Ztx231Mk.shtml

相关文章

MPC简介

1.引言 在当今过程控制中&#xff0c;PID当然是用的最多的控制方法&#xff0c;但MPC也超过了10%的占有率。MPC是一个总称&#xff0c;有着各种各样的算法。其动态矩阵控制&#xff08;DMC&#xff09;是代表作。DMC采用的是系统的阶跃响应曲线&#xff0c;其突出的特点是解决…

MPC(模型预测控制)-Simulink仿真

文章目录 一、为什么使用MPC控制器?二、什么是MPC控制器?三、MPC控制器的参数如何设置?3.1 采样时间3.2 预测范围、控制范围3.3 约束条件3.4 权重 四、自适应增益调度和非线性MPC五、Simulink仿真MPC控制器5.1 数学分析5.2 实验过程 一、为什么使用MPC控制器? ① MPC可以处…

使用MPC设计控制器

这个例子展示了如何使用MPC设计器设计连续搅拌釜式反应器(CSTR)的模型预测控制器。 一、 CSTR 模型 下面的微分方程表示了涉及放热反应的连续搅拌釜式反应器(CSTR)的线性化模型: 其中 输入为 &#xff1a; CAi -料流中试剂A浓度(kgmol/m3) Tc -反应堆冷却剂温度(℃) 输出为&…

MPC(模型预测控制)控制小车沿轨迹移动——C++实现

任务说明 要求如下图所示&#xff0c;给定一条轨迹&#xff0c;要求控制小车沿这条轨迹移动&#xff0c;同时可以适用于系统带有延时的情况。注意&#xff0c;本篇文章只给出部分C代码参考。 主要流程 首先用运动学自行车模型&#xff08;Kinematic Bicycle Model&#xff09…

mpc模型预测控制原理详解

mpc模型预测控制原理详解 前言mpc算法步骤mpc算法推导 前言 本文是对mpc模型预测控制学习的记录&#xff0c;主要参照了DR_CAN老师的视频进行学习。视频专栏链接&#xff1a;DR_CAN老师mpc视频专栏。在这篇博客中博主也针对DR_CAN老师的讲解做了详尽的笔记和代码实现。读者可以…

模型预测控制(MPC)解析(一):模型

一、MPC简介 1.1 预测控制的日常应用 模型预测控制的设计目标是计算未来控制变量u的轨迹&#xff0c;以优化未来的系统输出y。优化过程在一个有限的时间窗口进行&#xff0c;并且利用优化时间窗口开始时的系统信息进行优化。为了理解预测控制的基本思想&#xff0c;以一个日常…

MPC控制

基于状态空间模型的控制 模型预测控制&#xff08;MPC&#xff09;简介 对基于状态空间模型的控制理解得很到位 在这里我重点讲解一下状态空间模型。那么什么是状态&#xff1f;输出是不是也是状态的一种&#xff1f;对的&#xff0c;输出也是一种状态&#…

MPC模型预测控制

这篇主要讲一下模型预测控制&#xff0c;如果对PID控制了解的同学&#xff0c;那效果更好。如果不了解PID控制&#xff0c;还是熟悉下比较好。 模型预测控制&#xff0c;顾名思义&#xff0c;基于模型&#xff0c;预测未来&#xff0c;进行控制。这个控制是基于模型的&#xf…

模型预测控制(MPC)简介

1.引言 在当今过程控制中&#xff0c;PID当然是用的最多的控制方法&#xff0c;但MPC也超过了10%的占有率。MPC是一个总称&#xff0c;有着各种各样的算法。其动态矩阵控制&#xff08;DMC&#xff09;是代表作。DMC采用的是系统的阶跃响应曲线&#xff0c;其突出的特点是解决…

模型预测控制算法(MPC算法)底层逻辑

目录 MPC算法的基本原理 详细解析 预测模型中需要注意的点 滚动优化需要注意的点 构造目标函数约束部分 约束部分 举例说明 复盘总结 MPC算法的基本原理 MPC 的基本原理可以分为三个步骤&#xff1a;预测模型、滚动优化、反馈校正 &#xff08;1&#xff09;预测模型…

模型预测控制(MPC)算法原理

模型预测算法是在欧美等国家兴起的应用于工业领域的一种优化控制算法。目前经过多年的发展&#xff0c;在工业领域、智能控制领域等都有应用。随着算法的理论的完善&#xff0c;其已经成为工业领域内经常使用的一种经典算法。虽然在各个领域算法的应用存在差异。但他们都遵循预…

到底什么是模型预测控制MPC(一)

1. 为什么使用MPC控制 在浏览文章的时候&#xff0c;很多文章都是基于MPC来做的。那么究竟什么是模型预测呢&#xff1f; 模型预测也可以说是一种我们熟悉的反馈控制算法&#xff0c;其目的就是预测出未来的输出。以一个生活中的例子引入&#xff1a; 在我们驾驶汽车的时候&am…

MPC控制笔记(一)

转自 我的博客 笔记参考1&#xff1a;Understanding Model Predictive Control(Youtube 带自动生成字幕) 笔记参考2&#xff1a;Understanding Model Predictive Control(B站 生肉) 一、什么是MPC模型预测控制 MPC(Model Predict Control)是一种反馈控制(feedback control)算…

PID与MPC控制方法

记录udacity–无人驾驶工程师课程中控制部分。 MPC代码和实践链接https://github.com/udacity/CarND-MPC-Quizzes 本文按照对udacity课程的理解和翻译而来 1、PID P&#xff1a;Proportional 比例项&#xff0c; 用比例项乘以误差&#xff1b;快速缩小误差&#xff1b; I&…

了解模型预测控制2--什么是模型预测控制(MPC)

本节&#xff0c;我们将讨论模型预测控制器的工作原理。 在控制问题中&#xff0c;控制器的目标是计算被控对象的输入&#xff0c;使得被控对象输出遵循期望的参考信号。模型预测控制器计算此输入的策略是预测未来。 这听起来像算命&#xff0c;但让我们看看它究竟是什么。MPC使…

模型预测控制(MPC,Model Predictive Control)

发展历史 20世纪70年代后期&#xff0c;一类新型的计算机控制算法出现在美法等国的工业过程领域&#xff0c;如动态矩阵控制(DMC,Dynamic Matrix Control)、模型算法控制(MAC,Model Algorithm Control)。1987年&#xff0c;首次有学者阐述了该系列算法的动因、机理及其在控制工…

MPC学习笔记(1)——原理

最近在学习M. W. Mehrez的MPC时发现了很多不了解的细节&#xff0c;分享一下对该算法的梳理与理解。 在自动驾驶或机器人领域中&#xff0c;模型预测控制(Model Predictive Control, MPC)解决的是轨迹规划的问题。其前提条件是环境地图、载体位姿已知&#xff0c;根据MPC算法&…

MPC 控制原理

MPC 控制原理 1 生活中的启示2 实际控制的例子参考文献 Yin 机械工程师 本文引自 一个模型预测控制&#xff08;MPC&#xff09;的简单实现. 1 生活中的启示 情景如下&#xff1a;你们团队每天早晨开一次例会&#xff0c;主要会议内容是你汇报工作进度&#xff0c;领导根据工作…

EA建模工具,介绍常用的UML图

[导读] 作为程序猿都最好掌握的一门语言&#xff0c;那就是UML&#xff08;Unified Modeling Language&#xff09;&#xff0c;统一建模语言(UML)是软件工程领域中一种通用的开发建模语言&#xff0c;旨在提供一种可视化系统设计的标准方法。是开发人员、系统设计人员交流的有…

uml c语言函数流程图,UML流程图模板分享

原标题&#xff1a;UML流程图模板分享 UML是统一建模语言&#xff0c;又称标准建模语言是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。在流程图中也会经常使用到&#xff0c;但是网上关于该主题的模板不是很多&#xff0c;下面是分…