自动驾驶——模型预测控制(MPC)理解与实践

article/2025/11/9 10:32:43

当时在做路径跟踪、路径规划时,使用了MPC,通过项目的应用,对于MPC建立了一定的认识,但是一段时间过去后,认知又渐渐模糊了,当时学习过程中也是看了许多人的blog及代码才弄清楚,这里试图从理论到实践,对MPC进行一次回顾整理。项目为Udacity的MPC课程,详细代码见 https://github.com/wisdom-bob/ipopt_MPC 。

什么是MPC

模型预测控制(Model Predictive Control)指一类算法,周期性基于当帧测量信息在线求解一个有限时间开环优化问题,并将结果的前部分控制序列作用于被控对象。根据所用模型不同,分为动态矩阵控制(DMC),模型算法控制(MAC)、广义预测控制(GPC)。在智能驾驶方向,重点在于基于状态空间模型的模型预测控制。

预测控制最大的吸引力在于它具有显式处理约束的能力, 这种能力来自其基于模型对系统未来动态行为的预测, 通过把约束加到未来的输入、输出或状态变量上, 可以把约束显式表示在一个在线求解的二次规划或非线性规划问题中。

在线求解开环优化问题获得开环优化序列是MPC和传统控制方法的主要区别,因为后者通常是离线求解一个反馈控制律,而该反馈控制律一旦确定,在系统中就不再变动。
在这里插入图片描述
其中,x(t)为t时刻车辆的测量状态量,x*(t)为t时刻车辆的估计状态,u’(t)为t时刻的最优控制解,y(t)为t时刻的系统输出。
MPC算法包括三个步骤:
预测模型:根据历史信息、当前输入预测未来输出。我们需要一个模型能够基于历史信息和当前状态,来预测未来输出,这就涉及状态量的描述,非线性模型的线性化,从而确保预测输出最大限度接近期望值。
滚动优化:某一性能指标最优,反复在线优化。由于外部干扰,模型系统误差等原因,预测输出与实际存在偏差,滚动优化要做的就是找到每个时刻下的局部最优解,一般会设计一个损失函数,转化为二次规划问题,找到最优解。
反馈校正:基于测量对模型预测进行修正。模型基于当前与过去信息预测未来输出,那么未来时刻的输出就是反馈信息,这一部分与模型有较大关系,有些模型把这一部分内容体现在前两步骤中。
下面将根据这三部分,结合代码进行说明,从而更直观的了解如何使用MPC。

问题概述

在这里插入图片描述
Udacity项目中基于MPC实现行驶轨迹跟踪。控制系统实时接收车辆的状态量(px,py,psi,v)以及前方预行驶航点(ptsx,ptsy),基于以上信息,根据设计的损失函数,基于Cppad的ipopt函数计算出车辆的下面N帧的车辆控制指令。
状态量记录车辆的位置和速度以及相对道路中心线的夹角(具体将在预测模型中讲解)
预行驶航点是经筛选过的行驶航点集,剔除了已走过的航点,一般记录为预行驶的10个航点到20个航点。

预测模型

项目希望基于A*算法实现路径规划,并利用MPC来实现路径跟踪,那么首先摆在面前要解决的问题是如何描述项目中的各个组成部分。
车辆具有多个自由度,运动姿态耦合强,受力复杂,可看做一个非线性多自由度运动刚体,我们希望问题简单化,那么我们就设法简化模型,把模型转化为线性模型。无论是车辆运动学模型,还是车辆动力学模型,皆为非线性系统,而线性模型预测控制较非线性模型预测控制有更好的实时性,且更易于分析和计算,而这对于智能驾驶都非常重要。
在这里插入图片描述
项目采用单车动力学模型自行车运动学模型,完成对车辆模型的描述。
关于自行车模型这块,详见1,书里面讲的很详细。

自行车动力学模型

动力学模型:简化轮胎力、重力和质量的动力学模型,把车辆的形状简化为自行车结构,把所有的受力集中在前后车轮上。这种简化降低了模型的准确性,但也更易处理,在低速和中速时,运动模型通常近似于实际车辆动力学。
在这里插入图片描述
车前轮的方向即是车辆当前的速度方向,在实际车辆运动过程中,当车辆在以相对高的速度行驶时,车轮的方向并不一定车辆当前的速度方向,这个时候,我们引入车辆的动力学自行车模型。

车辆动力学模型通过对轮胎和路面之间的复杂相互作用来描述车辆的运动。在一个动力模型中,我们需要考虑各种各样的力的作用,他们可以大致分为两类:纵向力(Longitudinal force) 和侧向力(Lateral force), 纵向力就是使车辆前后移动的力量,而侧向力则促使车辆在横向移动,在力的相互作用过程中,轮胎起着决定性的作用(根据一定的物理常识,轮胎是车辆运动的一个重要的力的来源)。

由于动力学与控制关系较小,这里只做简单介绍。

自行车运动学模型

在这里插入图片描述
R为后轮转向半径,P为车辆瞬时转动中心,M为车辆后轮轴心,N为前轮轴心。此处,假设转向过程中车辆之心侧偏角保持不变,即车辆瞬时转向半径与道路曲率半径相同。
在后轮行驶轴心(Xr,Yr)处,速度为:
在这里插入图片描述
前后轮的运动学约束为:
在这里插入图片描述
联立可得:
在这里插入图片描述
根据前后轮的几何关系可得:
在这里插入图片描述
则可以求得横摆角速度为:
在这里插入图片描述
基于横摆角速度和车速,可求出转向半径和前轮偏角:
在这里插入图片描述
得到车辆运动学模型为:
在这里插入图片描述
此外我们也不能忽略了模型的物理约束:
在这里插入图片描述

模型整合

车辆模型通过单车模型来表示,而对于整个路径跟踪模型而言,则需要基于单车模型做一些修改。
通过前面介绍,我们知道车辆状态量有(px,py,psi,v),完整模型中又添加了两个量,epsi和cte,用来描述车辆与道路中心线的夹角以及车辆与参考轨迹的横向偏差。
ps.这里实际上道路的描述也并不是常规的笛卡尔坐标系。。
在这里插入图片描述
参考轨迹是基于(ptsx,ptsy)的三次多项式拟合曲线表达式f(xt),基于 f(xt) 实时求取横向偏移量cte。
结合以上所有,我们确认的完整模型如下所示:
在这里插入图片描述
以下结合代码说明输入数据处理。

 	vector<double> ptsx = j[1]["ptsx"];//世界坐标系预行驶航点x坐标vector<double> ptsy = j[1]["ptsy"];//世界坐标系预行驶航点y坐标double px = j[1]["x"];//汽车世界坐标xdouble py = j[1]["y"];//汽车世界坐标ydouble psi = j[1]["psi"];//航向角double v = j[1]["speed"];//行驶速度// 转化世界坐标系航点为车辆坐标系航点vector<double> waypoints_x;vector<double> waypoints_y;for (int i = 0; i < ptsx.size(); i++) {double dx = ptsx[i] - px;double dy = ptsy[i] - py;waypoints_x.push_back(dx * cos(-psi) - dy * sin(-psi));waypoints_y.push_back(dx * sin(-psi) + dy * cos(-psi));}Eigen::Map<Eigen::VectorXd> waypoints_mx(ptrx, 6);Eigen::Map<Eigen::VectorXd> waypoints_my(ptry, 6);// 三次多项式拟合得到预行驶轨迹曲线表达式Eigen::VectorXd coeffs = polyfit(waypoints_mx, waypoints_my, 3);double cte = polyeval(coeffs, 0);//当帧车辆行驶偏移量double epsi = -atan(coeffs[1]); //当帧航向角

滚动优化

滚动优化是求取最优控制解,基于约束,使某一或某些性能指标达到最优实现控制作用。那么设计合适的优化目标函数,就是结果优越性的关键,目标函数的一般形式可表示为状态和控制输入的二次函数:
在这里插入图片描述
其中,J为损失函数,N为预测时域,cteref,eφref分别为横向偏移量和角度的参考值。
构建损失函数后,还需要设定约束条件:
在项目中,控制输出为[φ,a],即车辆的转向和加速度。
在这里插入图片描述
由于约束函数和损失函数的许多参量与整体模型息息相关,这里先对整体模型进行说明。
如图所示为我们目前构建的MPC系统,周期性接受状态量state,输入MPC模型,基于ModelCostConstraints计算最优控制解。
在这里插入图片描述
基于CppAD的ipopt控制器进行二次规划求解最优解,关于cppad.ipopt详见2

size_t N = 10;//预测时域
double dt = 0.1;//时间间隔
const double Lf = 2.67;//前半轴距,用于计算航向角
const double ref_cte = 0;//参考横向偏移量
const double ref_epsi= 0;//参考角度
const double ref_v = 100;//参考速度// 为使用ipopt构建输入数据
size_t x_start = 0;//0~y_start-1
size_t y_start = x_start + N;//y_start~psi_start-1
size_t psi_start = y_start + N;//psi_start ~v_start-1
size_t v_start = psi_start + N;//...
size_t cte_start = v_start + N;
size_t epsi_start = cte_start + N;
size_t delta_start = epsi_start + N;
size_t a_start = delta_start + N - 1;// fg[]记录所有要求的函数等式,fg[0]嵌入损失函数,fg[>0]嵌入各状态量;
// 同时用lower和upper约束结果,var_bound单独约束fg[0]各参量,constraints约束fg[>0]
// 初始值设定,即当帧检测数据
fg[1 + x_start] = vars[x_start];
fg[1 + y_start] = vars[y_start];
fg[1 + psi_start] = vars[psi_start];
fg[1 + v_start] = vars[v_start];
fg[1 + cte_start] = vars[cte_start];
fg[1 + epsi_start] = vars[epsi_start];for (int t = 1; t < N; t++) {AD<double> x1 = vars[x_start + t];AD<double> x0 = vars[x_start + t - 1];AD<double> y1 = vars[y_start + t];AD<double> y0 = vars[y_start + t - 1];AD<double> psi1 = vars[psi_start + t];AD<double> psi0 = vars[psi_start + t - 1];AD<double> v1 = vars[v_start + t];AD<double> v0 = vars[v_start + t - 1];AD<double> cte1 = vars[cte_start + t];AD<double> cte0 = vars[cte_start + t - 1];AD<double> epsi1 = vars[epsi_start + t];AD<double> epsi0 = vars[epsi_start + t - 1];AD<double> a = vars[a_start + t - 1];AD<double> delta = vars[delta_start + t - 1];if (t > 1) {   a = vars[a_start + t - 2];delta = vars[delta_start + t - 2];}AD<double> f0 = coeffs[0] + coeffs[1] * x0 + coeffs[2] * CppAD::pow(x0, 2) + coeffs[3] * CppAD::pow(x0, 3);AD<double> psides0 = CppAD::atan(coeffs[1] + 2 * coeffs[2] * x0 + 3 * coeffs[3] * CppAD::pow(x0, 2));fg[1 + x_start + t] = x1 - (x0 + v0 * CppAD::cos(psi0) * dt);fg[1 + y_start + t] = y1 - (y0 + v0 * CppAD::sin(psi0) * dt);fg[1 + psi_start + t] = psi1 - (psi0 - v0/Lf * delta * dt);fg[1 + v_start + t] = v1 - (v0 + a * dt);fg[1 + cte_start + t] = cte1 - ((f0 - y0) + (v0 * CppAD::sin(epsi0) * dt));fg[1 + epsi_start + t] = epsi1 - ((psi0 - psides0) - v0/Lf * delta * dt);
}Dvector vars(n_vars);
for (int i = 0; i < n_vars; i++) vars[i] = 0;vars[x_start] = x;
vars[y_start] = y;
vars[psi_start] = psi;
vars[v_start] = v;
vars[cte_start] = cte;
vars[epsi_start] = epsi;

构造代价函数与约束

构建代价函数,与深度学习的损失函数是一个意思,我们想要输出满足什么要求,越重要的参数权重越大,反之依然,甚至不约束。
注意!
平方是为了统一符号,权重差异不能过于悬殊,本身数据间存在量纲差异,既然没有进行归一化处理,那就特别注意权重间的权衡。下面根据优先级排列损失函数的参数:
a. 横向偏移误差,指实际轨迹点与参考轨迹点间的距离;
b. 速度误差,指实际速度与期望速度的差;
c. 角度偏移量,指航向角与参考值的差异;
d. 刹车/油门调节量,目的是为了保证刹车/油门变化的平稳性;
e.航向角变化率,相邻时间间隔的航向角变化量;
f.加速度变化量,描述相邻时间间隔,加速度的变化快慢。
ps.具体权重只有调试才能完全确定,编码见代码。

// fg[0]挂载损失函数值
for (uint i = 0; i < N; i++) {fg[0] += 2500*CppAD::pow(vars[cte_start + i] - ref_cte, 2);fg[0] += 2500*CppAD::pow(vars[epsi_start + i] - ref_epsi, 2);fg[0] += CppAD::pow(vars[v_start + i] - ref_v, 2);
}for (uint i = 0; i < N - 1; i++) {fg[0] += 5*CppAD::pow(vars[delta_start + i], 2);fg[0] += 100*CppAD::pow(vars[a_start + i], 2);fg[0] += 700*CppAD::pow(vars[delta_start + i] * vars[v_start+i], 2);
}for (int i = 0; i < N - 2; i++) {
fg[0] += 200*CppAD::pow(vars[delta_start + i + 1] - vars[delta_start + i], 2);
fg[0] += 10*CppAD::pow(vars[a_start + i + 1] - vars[a_start + i], 2);
}

设定了损失函数,车辆已经能够计算出可行的结果,但结果的可行性却还有待考究,这就需要约束条件来表现了。
约束条件有两个作用:
1.确保结果的实际可行性,满足损失函数最小的最优解不一定模型能够执行,而加上约束,结果就一定是在车辆模型执行范围内的结果。
2.约束条件缩小了状态空间范围,二次规划等最优解算法往往需要反复递归迭代得出结果,状态空间越小,计算时间也将缩减。
在项目中,可以考虑的约束条件有如下:
a. 最大前轮转角
b. 最大刹车/油门调节量
ps.在损失函数中已约束参量,不再重复约束,另外一些约束是针对等式而设定的,详见代码。

//6个state量,N为预测时域,delta和a各N-1个,为输出控制数量
size_t n_vars = N * 6 + (N - 1) * 2;
size_t n_constraints = N * 6;//记录约束的最小值和最大值,对应fg[0]损失函数的各参量的约束
Dvector vars_lowerbound(n_vars);
Dvector vars_upperbound(n_vars);for (int i = 0; i < delta_start; i++) {vars_lowerbound[i] = -1.0e19;//除了a和delta其他量无约束vars_upperbound[i] = 1.0e19; //值域为(-inf,inf)
}
for (int i = delta_start; i < a_start; i++) {vars_lowerbound[i] = -0.436332;//delta约束为角度制下vars_upperbound[i] = 0.436332; //(-25,25)
}
for (int i = a_start; i < n_vars; i++) {vars_lowerbound[i] = -1.0;//a约束为(-1,1)vars_upperbound[i] = 1.0;
}// 设置约束的最短值和最小值,约束fg[i]的值域限制,i!=0
Dvector constraints_lowerbound(n_constraints);
Dvector constraints_upperbound(n_constraints);
for (int i = 0; i < n_constraints; i++) {constraints_lowerbound[i] = 0;// lower和upper=0,代表fg[i]嵌入为等式constraints_upperbound[i] = 0;
}constraints_lowerbound[x_start] = x;//嵌入为常数,则upper=lower
constraints_lowerbound[y_start] = y;
constraints_lowerbound[psi_start] = psi;
constraints_lowerbound[v_start] = v;
constraints_lowerbound[cte_start] = cte;
constraints_lowerbound[epsi_start] = epsi;constraints_upperbound[x_start] = x;
constraints_upperbound[y_start] = y;
constraints_upperbound[psi_start] = psi;
constraints_upperbound[v_start] = v;
constraints_upperbound[cte_start] = cte;
constraints_upperbound[epsi_start] = epsi;

以上完成对模型参量的约束,输出结果的约束,损失函数的构建,只需要调用求解器CppAD::ipopt::solve,即可求出结果。详见代码 https://github.com/wisdom-bob/ipopt_MPC 。

  FG_eval fg_eval(coeffs);// a class for cost function and model std::string options="";//NULLCppAD::ipopt::solve_result<Dvector> solution;CppAD::ipopt::solve<Dvector, FG_eval>(options, vars, vars_lowerbound, vars_upperbound, constraints_lowerbound,constraints_upperbound, fg_eval, solution);// Check some of the solution valuesok &= solution.status == CppAD::ipopt::solve_result<Dvector>::success;// Costauto cost = solution.obj_value;std::cout << "Cost " << cost << std::endl;vector<double> result;result.push_back(solution.x[delta_start]);result.push_back(solution.x[a_start]);for (int i = 0; i < N-1; i++) {result.push_back(solution.x[x_start + i + 1]);result.push_back(solution.x[y_start + i + 1]);}return result;

反馈矫正

在这里插入图片描述
MPC本质上还是一种反馈控制,当我们通过最优化方法得到一组控制输出后(本例中就是未来10步的控制输出),车辆执行控制指令,同时继续以一定的频率接收到表示当前车辆的状态 [px,py,v,psi,cte,epsi]。这个状态会被同时输入到路径规划模块以及MPC控制模块,路径规划模块会依据新的车辆状态,结合感知模块的信息以及地图信息重新做出规划。MPC则根据新的参考路径和车辆当前状态进行新一轮的预测控制。需要注意的是,车辆真实状态的反馈并不是一个预测时间段的控制执行完以后才反馈的,反馈的时间间隔往往小于一个预测时间段(在本例中,预测时间段为 0.1×10=1s)。

项目整理总结

以上基于MPC的整体架构进行思路讲解和代码说明,但是结构太生硬,不易理解。下面进行思路整理,这里参考了较多这位博主的思路3

我们希望车辆按照我们的参考路线行驶,设定时间间隔dt=0.1s,选取10个dt,那么根据预测模型,我们可以预测车辆在未来1s的状态(准确的说是每个时间间隔的状态)。
要求解这样一个最优化问题,首先依据神经网络优化方式设计损失函数,把车辆参考速度、车辆与参考路线偏移量、车辆航向角、车辆加速度等量以加权平方形式都考虑进来;
此外设计最优化问题的变量约束,如车辆航向角转角theta、加速度a的取值范围。基于输入,求解带约束的最优化问题,得到控制输出。

要注意的是车辆执行延迟问题。已知车辆执行延迟为100ms,即在指令发出时,模型预测的第一步实际上在制动延迟的时间内,车辆执行上状态指令。本文中模型采用10步预测,每步间隔为100ms,为让模型更贴近实际,我们约束这一步控制指令,即(a,deltaf)为上一状态的指令,这样,我们的模型预测控制就将制动延迟考虑了进来。

MPC的一般工作步骤可以概括如下:
0、基于事件信息构建预测模型,并基于模型约束和输出需求,设计损失及约束函数;
1、结合历史信息、当前状态以及预测模型,计算最优控制解,预测N步的系统输出;
2、输出执行;
3、等待下一周期,获取检测信息,重复步骤1、2、3。

关于Cppad::ipopt算法核心可见内点法
现明确算法使用内点法,而内点法解法主要分为障碍函数法和对偶内点法,这里对障碍函数法做一个简单说明:
##已知线性约束和非线性约束,以及要求最优化式子->等式约束、不等式约束、损失函数,
##那么基于约束,我们可以很容易得到关于最优化式子的拉格朗日乘子式(把约束转化为各乘子)
##障碍函数法的关键在于对于不等式约束提出了一种障碍函数,构建阻碍拉格朗日乘子:
在这里插入图片描述
##综上所示,最后得到拉格朗日乘子式如下所示在这里插入图片描述
此时,基于牛顿下降法,经过多次迭代后取得目标最优解。


  1. https://download.csdn.net/download/uxux007/10345011 ↩︎

  2. http://coin-or.github.io/CppAD/doc/ipopt_solve_get_started.cpp.htm ↩︎

  3. https://blog.csdn.net/AdamShan/article/details/79083755 ↩︎


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

相关文章

MATLAB模型预测控制(MPC)示例

MPC matlab demo 前言一、模型预测控制的理论&#xff08;MPC&#xff09;二、实例代码2.simulink模型 总结 前言 本文是基于matlab/simulink中的模型预测控制例子的学习记录 提示&#xff1a;以下是本篇文章正文内容 一、模型预测控制的理论&#xff08;MPC&#xff09; 模…

模型预测控制(Model predictive control,MPC)

模型预测控制( MPC ) 是一种先进的过程控制方法&#xff0c;用于在满足一组约束条件的同时控制过程。自 1980 年代以来&#xff0c;它一直在化工厂和炼油厂的加工工业中使用。近年来&#xff0c;它还被用于电力系统平衡模型[1]和电力电子学中。[2]模型预测控制器依赖于过程的动…

MPC(模型预测控制)_附matlab例程

写在前面&#xff1a;   本文为科研理论笔记的第二篇&#xff0c;其余笔记目录传送门&#xff1a; 理论笔记专栏目录 介绍结束下面开始进入正题&#xff1a; 1 基本概念 1.1 最优控制 ​   最优控制(optimal control)&#xff1a;在约束条件下的最优表现&#xff0c;约束…

模型预测控制MPC

模型预测控制MPC 因本人刚开始写博客&#xff0c;学识经验有限&#xff0c;如有不正之处望读者指正&#xff0c;不胜感激&#xff1b;也望借此平台留下学习笔记以温故而知新。这一篇文章介绍的是控制理论中的模型预测控制算法。 模型预测控制简介 模型预测控制MPC是指&#x…

自动驾驶-MPC控制器

上节介绍了使用PID控制器控制车辆&#xff0c;PID控制器的优点是实现简单&#xff0c;处理速度快&#xff0c;但是缺点是不能处理有延迟的系统。本章介绍的MPC&#xff08;modle predictive control&#xff09;控制器能够很好的解决延迟的问题。 MPC控制器的和PID控制器一样&…

学习随笔#13 模型预测控制(MPC)

MPC基本概念 模型预测控制&#xff08;MPC&#xff09;是指通过模型来预测系统在某一未来时间段内的表现来进行优化控制。MPC多用于数位控制&#xff0c;因此使用系统的离散型状态空间表达形式&#xff0c;即 x k 1 A x k B u k x_{k1}Ax_kBu_k xk1​Axk​Buk​。MPC一般分为…

MPC控制器学习-NMPC

趁着刚讲明白马上记录一下&#xff0c;不然以后又忘了_(:з」∠)_是一位老师给的现成的mpc小项目&#xff0c;代码写的很仔细能够帮助理解mpc的原理。 场景是一个二维平面的小车(看成一个质点)&#xff0c;要运动到目标点&#xff0c;途中避开圆形范围的障碍物。 小车的矩形边框…

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)算…