模型预测控制 订阅
模型预测控制(MPC)是一类特殊的控制。它的当前控制动作是在每一个采样瞬间通过求解一个有限时域开环最优控制问题而获得。过程的当前状态作为最优控制问题的初始状态,解得的最优控制序列只实施第一个控制作用。这是它与那些使用预先计算控制律的算法的最大不同。本质上模型预测控制求解一个开环最优控制问题。它的思想与具体的模型无关,但是实现则与模型有关。 展开全文
模型预测控制(MPC)是一类特殊的控制。它的当前控制动作是在每一个采样瞬间通过求解一个有限时域开环最优控制问题而获得。过程的当前状态作为最优控制问题的初始状态,解得的最优控制序列只实施第一个控制作用。这是它与那些使用预先计算控制律的算法的最大不同。本质上模型预测控制求解一个开环最优控制问题。它的思想与具体的模型无关,但是实现则与模型有关。
信息
简    写
MPC
外文名
model predictive control
中文名
模型预测控制
模型预测控制发展背景
20世纪60年代初期发展起来并日趋完善的现代控制理论,具有最优的性能指标和系统而精确的理论设计方法,在航天航空、制导等领域中获得了卓越的成就。但是在应用于工业过程控制时却没有收到预期的效果。究其原因,现代控制理论的基础是精确的对象参数模型,而工业过程往往具有非线性、时变性、强耦合和不确定性等特点,难以得到精确的数学模型,因而控制效果将大大降低。面对理论发展与实际应用之间的不协调,人们从工业过程控制的特点与需求出发,探索各种对模型精度要求不高而同样能实现高质量控制的方法。模型预测控制(Model Predictive Control,简称预测控制)正是在这种背景下应运而生的一类新型控制算法。一经问世,它就在石油、电力和航空等工业中得到十分成功的应用并迅速发展起来。因此,预测控制的出现并不是某种理论研究的产物,而是在工业实践过程中发展起来的一种有效的控制方法。 [1] 
收起全文
精华内容
下载资源
问答
  • 模型预测控制

    2021-03-17 12:12:55
    模型预测控制
  • matlab模型预测控制工具箱英文教程-matlab模型预测控制工具箱.rar Model Predictive Control Toolbox For Use with MATLAB® Manfred Morari N. Lawrence Ricker matlab模型预测控制工具箱.rar
  • 找到了两个连杆机械手的状态空间方程。 然后从方程中获得传递函数。 阶跃响应是使用模型预测控制工具箱找到的。
  • MPC模型预测控制

    万次阅读 多人点赞 2018-12-17 17:02:00
    这篇主要讲一下模型预测控制,如果对PID控制了解的同学,那效果更好。如果不了解PID控制,还是熟悉下比较好。 模型预测控制,顾名思义,基于模型,预测未来,进行控制。这个控制是基于模型的,也就是model-based。 ...

    这篇主要讲一下模型预测控制,如果对PID控制了解的同学,那效果更好。如果不了解PID控制,还是熟悉下比较好。

    模型预测控制,顾名思义,基于模型,预测未来,进行控制。这个控制是基于模型的,也就是model-based。

    有人会问,我这个系统的模型怎么来呢?我想到两点解决方法:

    1. 文献上去找别人已经建好的,公认的模型;

    2. 首先进行系统辨识,再进行建模。(难度太大,不建议)

    下面给上经典的MPC控制流程图:

    模型预测控制是一种基于模型的闭环优化控制策略。

    预测控制算法的三要素:内部(预测)模型、参考轨迹、控制算法。现在一般则更清楚地表述为内部(预测)模型、滚动优化、反馈控制。 
    大量的预测控制权威性文献都无一例外地指出, 预测控制最大的吸引力在于它具有显式处理约束的能力, 这种能力来自其基于模型对系统未来动态行为的预测, 通过把约束加到未来的输入、输出或状态变量上, 可以把约束显式表示在一个在线求解的二次规划或非线性规划问题中. 
    模型预测控制具有控制效果好、鲁棒性强等优点,可有效地克服过程的不确定性、非线性和并联性,并能方便的处理过程被控变量和操纵变量中的各种约束。[1]

    在线性模型预测控制(Linear Model Predictive Control, LMPC)的基础上,发展了非线性模型预测控制(Non-linear Model Predictive Control, NMPC),显示模型预测控制(Explicit Model Predictive Control, EMPC)和 鲁棒模型预测控制(Robust Model Predictive Control)

    首先,我们定义一个模型来描述我们的车辆。[2]

    这是自行车模型,运动学上面经常使用。

    (x, y)是车辆的质心,ψ是当前车身的角度,v是当前车辆的速度,lf是当前车辆质心到原点的距离, β是速度和车身的角度。在我们的例子中,我们假设β为零,也就是没有侧滑。

    在我们的模型中,我们可以通过控制前轮的转角δf 以及车辆的加速度a来控制车辆轨迹。简单起见,我们只考虑前轮驱动的车辆,并且将δf记作δ。

      模型预测控制的细节

    每个控制周期,我们都从传感器读取数据并得到车辆状态量:

    • 车辆的位置(x,y)

    • 速度v

    • 车身角度 ψ

    • 转向角(舵角) δ

    • 加速度a

    轨迹模型:

    我们的道路检测系统应该能够为我们规划好路线,比如,以接下来6个航点的坐标的形式。在我们的例子中,我们使用6个航点去逼近一个3阶多项式函数。我们用这个模型去计算y坐标和相对于x轴的车身角度ψ。

    使用模型预测控制和PID实现自动驾驶的车道保持

    轨迹模型一般有规划模块给出,在这里就不做深入的研究。

    动态模型:

    接下来,我们要创建动态模型利用t时刻的状态去预测在t+1拍时刻的车辆状态。利用动力学模型,我们可以轻易地从最新时刻地采样推导出下一时刻的位置,车身角度和速度。

    使用模型预测控制和PID实现自动驾驶的车道保持

    我们可以在添加另外2个状态去衡量轨迹跟踪误差和车身角度误差ψ:

    使用模型预测控制和PID实现自动驾驶的车道保持

    损失函数:

    在模型预测控制中,我们需要定义损失函数来优化路径。如果模型不能保持目标速度,那么我们就要惩罚模型。如果可能的话,我们并不想要突然的加减速或者突然的转向。但是既然这些实际上是不可避免的,我们可以尽可能地抑制加减速和转向地变化率。这减轻了晕车同时更加省油(也省人民币)。模型的损失函数应当包含

    • 跟踪误差

    • 转向误差

    • 速度损失函数项(尽量保持在100英里每小时)

    • 转向损失函数项(尽量避免转向)

    • 加速度损失函数项(尽量保持0加速度)

    • 转向变化率(越小越好)

    • 加速度变化率(越小越好)

    因为这些目标也许会相互冲突,我们需要给这些损失项定义权重以体现优先级。损失函数如下:

    使用模型预测控制和PID实现自动驾驶的车道保持

    总而言之:

    我们需要用模型预测控制来寻找最优路径,那么就需要动力学模型来预测下一拍的状态,以下是动力学模型和系统约束:

    使用模型预测控制和PID实现自动驾驶的车道保持

    这是下面GitHub链接里,别人给的权重。

        const int cte_cost_weight = 2000;
        const int epsi_cost_weight = 2000;
        const int v_cost_weight = 1;
        const int delta_cost_weight = 10;
        const int a_cost_weight = 10;
        const int delta_change_cost_weight = 100;
        const int a_change_cost_weight = 10;

     

    优化模型预测控制

    我们通过解决一个约束条件下优化损失函数的问题来解决了控制问题。这些约束条件包括油门和转向的控制。

    1. 从道路中检测下6个航点,并且计算3次插值的来建立行驶轨迹

    2. 从传感器读取当前速度v,  方向ψ,  转向角 δ 以及加速度  a

    3. 使用传感器读取的数据和动力学模型计算出第一个车辆状态

    4. 根据1秒内的车辆状态响应优化控制动作,控制的周期为100ms,所以1s内有10个周期

    5. 模型预测控制的两个变量(也是控制量):加速度(油门对应正加速度,刹车对应负加速度)和转向角

    6. 给出加速度和转向角的约束范围

    7. 我们将动态模型计算9次,得到未来9个时间拍的系统状态

    8. 给出每个采样计算周期的损失函数

    9. 用1个优化器解算出在约束定义下周期1到周期9的最小总损失(注意,在我们的定义中,时间周期并不从0开始,而是从1开始到10)

    10. 我们仅仅选择周期1给出的控制量

    11. 但是,我们延时100ms后再将控制量给模拟器。这样能够模拟现实世界,毕竟处理计算(读取传感器)和执行都需要时间。

    12. 从步骤1开始重复,寻找下一个最优控制量。

     

    可调性:

    在我们的例子中,我们计算了1秒中内的最优解,这个参数是可以调节的。长时间窗口的优化会给控制器的动作漂亮的曲线,但是也会积累过多的误差。实际上,如果这个优化时间窗口太大,汽车反而会脱离期望轨迹。

    上面的文章内容都来自于链接[2]中,但是很多人对MPC还是有点不明白。模型也建立好了,约束我也会给,那怎么求解呢?求的解怎么利用呢?

    现在我们看第一个问题:

    1. 如何求解

    上面的文章其实来自于Udacity的自动驾驶的一个课程。

    大家可以去GitHub上下载下来,自己跑一下上面的代码。链接是这个https://github.com/mvirgo/MPC-Project,里面是一位博主写好的代码。大家配置好环境后可以直接跑起来的,然后有个可视化软件,可以看到3D引擎看到动画。

    比如像这样的:https://github.com/mvirgo/MPC-Project/blob/master/MPC_vid.mov

    这个代码尽量在Ubuntu上去跑,因为装的东西比较多,给的教程关于LInux的。教程还是看Udacity给的模板比较好,但是代码不要下这个网址的,当时我环境配置好了之后还是有报错,我还以为是我环境配置的有问题。https://github.com/udacity/CarND-MPC-Project

    这个代码是C++写的。

    主函数中的调用

     /*
              * Calculate steering angle and throttle using MPC.
              * Both are in between [-1, 1].
              * Simulator has 100ms latency, so will predict state at that point in time.
              * This will help the car react to where it is actually at by the point of actuation.
              */
              
              // Fits a 3rd-order polynomial to the above x and y coordinates
              auto coeffs = polyfit(ptsx_car, ptsy_car, 3);
              
              // Calculates the cross track error
              // Because points were transformed to vehicle coordinates, x & y equal 0 below.
              // 'y' would otherwise be subtracted from the polyeval value
              double cte = polyeval(coeffs, 0);
              
              // Calculate the orientation error
              // Derivative of the polyfit goes in atan() below
              // Because x = 0 in the vehicle coordinates, the higher orders are zero
              // Leaves only coeffs[1]
              double epsi = -atan(coeffs[1]);
              
              // Center of gravity needed related to psi and epsi
              const double Lf = 2.67;
              
              // Latency for predicting time at actuation
              const double dt = 0.1;
              
              // Predict state after latency
              // x, y and psi are all zero after transformation above
              double pred_px = 0.0 + v * dt; // Since psi is zero, cos(0) = 1, can leave out
              const double pred_py = 0.0; // Since sin(0) = 0, y stays as 0 (y + v * 0 * dt)
              double pred_psi = 0.0 + v * -delta / Lf * dt;
              double pred_v = v + a * dt;
              double pred_cte = cte + v * sin(epsi) * dt;
              double pred_epsi = epsi + v * -delta / Lf * dt;
              
              // Feed in the predicted state values
              Eigen::VectorXd state(6);
              state << pred_px, pred_py, pred_psi, pred_v, pred_cte, pred_epsi;
              
              // Solve for new actuations (and to show predicted x and y in the future)
              auto vars = mpc.Solve(state, coeffs);
              
              // Calculate steering and throttle
              // Steering must be divided by deg2rad(25) to normalize within [-1, 1].
              // Multiplying by Lf takes into account vehicle's turning ability
              double steer_value = vars[0] / (deg2rad(25) * Lf);
              double throttle_value = vars[1];

    MPC函数的实现

    // MPC class definition implementation.
    //
    MPC::MPC() {}
    MPC::~MPC() {}
    
    vector<double> MPC::Solve(Eigen::VectorXd state, Eigen::VectorXd coeffs) {
      bool ok = true;
      typedef CPPAD_TESTVECTOR(double) Dvector;
      
      // State vector holds all current values neede for vars below
      double x = state[0];
      double y = state[1];
      double psi = state[2];
      double v = state[3];
      double cte = state[4];
      double epsi = state[5];
    
      // Setting the number of model variables (includes both states and inputs).
      // N * state vector size + (N - 1) * 2 actuators (For steering & acceleration)
      size_t n_vars = N * 6 + (N - 1) * 2;
      // Setting the number of constraints
      size_t n_constraints = N * 6;
    
      // Initial value of the independent variables.
      // SHOULD BE 0 besides initial state.
      Dvector vars(n_vars);
      for (int i = 0; i < n_vars; i++) {
        vars[i] = 0.0;
      }
    
      Dvector vars_lowerbound(n_vars);
      Dvector vars_upperbound(n_vars);
      // Sets lower and upper limits for variables.
      // Set all non-actuators upper and lowerlimits
      // to the max negative and positive values.
      for (int i = 0; i < delta_start; i++) {
        vars_lowerbound[i] = -1.0e19;
        vars_upperbound[i] = 1.0e19;
      }
      
      // The upper and lower limits of delta are set to -25 and 25
      // degrees (values in radians).
      for (int i = delta_start; i < a_start; i++) {
        vars_lowerbound[i] = -0.436332;
        vars_upperbound[i] = 0.436332;
      }
      
      // Acceleration/decceleration upper and lower limits.
      for (int i = a_start; i < n_vars; i++) {
        vars_lowerbound[i] = -1.0;
        vars_upperbound[i] = 1.0;
      }
    
      // Lower and upper limits for the constraints
      // Should be 0 besides initial state.
      Dvector constraints_lowerbound(n_constraints);
      Dvector constraints_upperbound(n_constraints);
      for (int i = 0; i < n_constraints; i++) {
        constraints_lowerbound[i] = 0;
        constraints_upperbound[i] = 0;
      }
      
      // Start lower and upper limits at current values
      constraints_lowerbound[x_start] = x;
      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;
    
      // object that computes objective and constraints
      FG_eval fg_eval(coeffs);
    
      //
      // NOTE: You don't have to worry about these options
      //
      // options for IPOPT solver
      std::string options;
      // Uncomment this if you'd like more print information
      options += "Integer print_level  0\n";
      // NOTE: Setting sparse to true allows the solver to take advantage
      // of sparse routines, this makes the computation MUCH FASTER. If you
      // can uncomment 1 of these and see if it makes a difference or not but
      // if you uncomment both the computation time should go up in orders of
      // magnitude.
      options += "Sparse  true        forward\n";
      options += "Sparse  true        reverse\n";
      // NOTE: Currently the solver has a maximum time limit of 0.5 seconds.
      // Change this as you see fit.
      options += "Numeric max_cpu_time          0.5\n";
    
      // place to return solution
      CppAD::ipopt::solve_result<Dvector> solution;
    
      // solve the problem
      CppAD::ipopt::solve<Dvector, FG_eval>(
          options, vars, vars_lowerbound, vars_upperbound, constraints_lowerbound,
          constraints_upperbound, fg_eval, solution);
    
      // Check some of the solution values
      ok &= solution.status == CppAD::ipopt::solve_result<Dvector>::success;
    
      // Cost
      auto cost = solution.obj_value;
      std::cout << "Cost " << cost << std::endl;
    
      // Return the first actuator values, along with predicted x and y values to plot in the simulator.
      vector<double> solved;
      solved.push_back(solution.x[delta_start]);
      solved.push_back(solution.x[a_start]);
      for (int i = 0; i < N; ++i) {
        solved.push_back(solution.x[x_start + i]);
        solved.push_back(solution.x[y_start + i]);
      }
      
      return solved;
    
    }

     具体源码大家还是去直接下载代码看看看。跑下看看效果。然后可以改下预测步长N和采样周期t。这里给的N=10,t=0.1s。

    大家有什么问题,我们可以一起交流下,相互促进,共同进步。我C++一般,是硬伤,Linux也是用了没多久,就为了跑这个工程。

    如何求解的问题已经解决。

    2. 如何利用

    如何利用比求解简单多了啊,看代码:

    // Send values to the simulator
              json msgJson;
              msgJson["steering_angle"] = steer_value;
              msgJson["throttle"] = throttle_value;
    
              // Display the MPC predicted trajectory
              vector<double> mpc_x_vals = {state[0]};
              vector<double> mpc_y_vals = {state[1]};
    
              // add (x,y) points to list here, points are in reference to the vehicle's coordinate system
              // the points in the simulator are connected by a Green line
              
              for (int i = 2; i < vars.size(); i+=2) {
                mpc_x_vals.push_back(vars[i]);
                mpc_y_vals.push_back(vars[i+1]);
              }
    
              msgJson["mpc_x"] = mpc_x_vals;
              msgJson["mpc_y"] = mpc_y_vals;
    
              // Display the waypoints/reference line
              vector<double> next_x_vals;
              vector<double> next_y_vals;
    
              // add (x,y) points to list here, points are in reference to the vehicle's coordinate system
              // the points in the simulator are connected by a Yellow line
              double poly_inc = 2.5;
              int num_points = 25;
              
              for (int i = 1; i < num_points; i++) {
                next_x_vals.push_back(poly_inc * i);
                next_y_vals.push_back(polyeval(coeffs, poly_inc * i));
              }
              
              msgJson["next_x"] = next_x_vals;
              msgJson["next_y"] = next_y_vals;
    
              auto msg = "42[\"steer\"," + msgJson.dump() + "]";
              std::cout << msg << std::endl;
              // Latency
              // The purpose is to mimic real driving conditions where
              // the car doesn't actuate the commands instantly.
              this_thread::sleep_for(chrono::milliseconds(100));
              ws.send(msg.data(), msg.length(), uWS::OpCode::TEXT);
            }
          } else {
            // Manual driving
            std::string msg = "42[\"manual\",{}]";
            ws.send(msg.data(), msg.length(), uWS::OpCode::TEXT);
          }
    

     主要看前两句,就是把计算好的发送到模拟器,实际的话应该是发信号给方向盘和脚踏板。还有预测的轨迹点也输出到模拟器。

    现在大家再看看链接[2]中的这段话,是不是有点感觉:

    自动驾驶的3大核心科技是定位(在哪里),感知(周围是啥)以及控制(咋开车呢)。通过车道检测,我们可以对车的行进路线进行路径规划。本篇文章主要通过一个自行车的动力学模型讨论车辆的加速、刹车和转向的模型预测控制。目的不仅在于尽可能地控制车辆轨迹,同时也还要尽可能使速度平滑以避免晕车和频繁的刹车。

    模型预测控制主要在约束条件下使损失函数最小。例如,我们想要以100ms的周期调整转向和速度,在转向角度不能超过25°的约束下,最小化以规划的路径和实际路径之间的误差。我们通过传感器获取车辆的状态,比如速度,而我们的动作基于传感器读数以一个短的周期执行(例如1s)。例如,我们顺时针转向20°,然后每100ms周期减小1°。加入这些动作可以1秒钟之后的损失函数最小,我们将会采用第一个动作:顺时针转动20°,但是却并不执行后续的动作,而是在100ms后,重复优化过程。100ms后,有了新的读数,我们就重新计算下一个最优动作。模型预测控制通过预测接下来一段较长时间(1s)的损失函数,来计算选择出下一个较短周期(100ms)的最优动作。相比于短视的贪心算法,模型预测控制具有鲁棒性,因此能够控制得更好。

    给出一张图,大家可能看的更明白了。

    这是维基百科上的图[3]。 

    这一篇就到这里吧,写的也不够深入,下一篇我会讲MATLAB中的实现。感谢下以下三个链接的作者。

     [1] https://www.cnblogs.com/kui-sd具体u/p/9026796.html

     [2] https://www.leiphone.com/news/201812/3iia3PiNHnHiUFMb.html(中文翻译)

         https://medium.com/@jonathan_hui/lane-keeping-in-autonomous-driving-with-model-predictive-control-50f06e989bc9(英文原版,视频需翻墙)

     [3] https://zh.wikipedia.org/wiki/%E6%A8%A1%E5%9E%8B%E9%A0%90%E6%B8%AC%E6%8E%A7%E5%88%B6

    展开全文
  • 模型预测控制系列讲解(四):模型预测控制定量分析

    模型预测控制系列讲解(四):模型预测控制定量分析

    展开全文
  • 模型预测控制系列讲解(二)模型预测控制算法发展进程 后续更新

    模型预测控制系列讲解(二)模型预测控制算法发展进程以及基本原理

    写在前面

    很多时候人们会忽略科技以及工程发展的历史,个人觉得这种习惯特别要不的,一定会对一个问题的理解造成消极的影响,而这种消极的影响往往又是非常致命的(知其然,不知其所以然)。
    不管是人文的历史,还是科学技术的历史,都是我们的镜子,都蕴含着我们取之不尽的财富,尤其是伟大人物的思维方式。就像控制算法一样,我们要充分利用过去,现在和未来的信息来完成控制目标。
    我们在学习过程中一定要明白某些问题以及知识提出的背景是什么,发展脉络是什么,用来解决那些问题,这样脑海中就有一个清晰的认识,对自己的理解过程有着很大的积极作用。
    简单举个例子:控制算法的发展过程,其实就是一系列不同控制问题的解决历史,某种算法可以解决一类问题,而无法解决另一类问题,这个时候提出了另一种控制算法,以此类推。这些问题的背景以及提出解决问题方法的背景,很大程度上和我们运用那种控制算法的问题和背景很相似,这样是不是对控制算法的选型有着一定的帮助。还有,就是新控制算法的开发,是不是可以借鉴这些思维,并且弥补之前算法的不足等等。
    最后,我们不要只局限于本学科或者本领域内的知识,要拓展思维,跨学科,夸领域的思维,不同的领域可以相互借鉴,互补,而且很多都是相通的(在高中的时候,化学平衡反应的勒夏特列原理和物理的楞次定律是不是很像,大家在高中有过疑问吗?是不是曾经思考过这些?还有就是为什么万有引力公式和电荷相互作用力的公式那么像?)。化学,生物,人文等都可以给我们提供算法思维的源泉,仿生学就是一种,神经网络等等。多观察自然,经过多少亿年的进化,大自然是不是可以认为是趋近于最优,我们完全可以通过对自然中的某些现象,数学抽象化,算法化,应用于我们的人造工程中!

    预测控制的产生和发展

    预测控制的产生并非来源于理论发展的需要,而是从实践中发展起来的,后来人们才开始从理论上来分析预测控制。
    说起预测控制不得不从PID控制说,很长一段时期以来,PID几乎作为一种全能的控制器,应用于过程控制中,因其无需知道控制对象模型,参数较少且易调试的特点,应用非常广泛,当控制从回路发展到系统时,单回路的PID控制很难保持全局良好的性能,对约束处理能力的提升,以及由回路调节发展到优化时,PID则无法很容易的实现。
    基于优化和镇定的现代控制理论已经很成熟,由于需要精确的数学模型,并且控制算法相对也比较复杂,由于过程控制的不确定性,基于相对理想的数学模型得到的控制,会引起控制品质的严重下降,同时还需要系统辨识,模型简化,鲁棒控制,自适应控制等,会增加额外很大的工作量,也不经济,尤其是对模型的精确依赖,导致在工业过程控制中不易实现。
    预测控制就是这种对模型要求低,能处理多变量和显性处理约束且计算量又可以被接受的背景下发展起来的。
    预测控制算法大概分为三哥阶段:
    第一阶段:20世纪70年代以阶跃响应,脉冲响应等非模型参数实现的模型预测控制,由于缺乏强有力的理论约束,必须依靠专业知识和经验。
    第二阶段:20世纪80年代由自适应控制发展而来的自适应预测控制,给出了预测控制的一些定量分析,但约束优化难以给出最优解的解析式,给定量分析带来了本质困难。
    第三阶段:20世纪90年代发展起来的定性分析综合理论,使预测控制得到了质的飞跃,但也理论成果和实际控制还是有一些距离,需要结合实际进行修正。
    虽然有着诸多不足,但预测控制成为最具代表性的最优控制,而且具有滚动优化的特性,目前的应用相当广泛,我们可以在实际应用过程中不断完善预测控制,使预测控制更加有效。
    写的比较简单,大家可以去网上或者一些书籍上仔细的查阅预测控制的发展,会对我们对预测控制的理解,有着很大的帮助!

    预测控制的基本原理以及思想

    预测控制的基本原理:
    利用过程模型预测系统在一定控制作用下未来的动态行为,在此基础上根据给定的约束条件和性能要求滚动的求解最优控制作用并实施当前控制量,在滚动的每一步通过检测实时信息修正对未来动态行为的预测。预测控制可以综合过去,现在,将来的信息实现控制性能,而且最最要的是对系统未来信息的应用。
    预测控制基本可以归结为三个部分,预测模型,滚动优化,反馈校正。
    1、模型预测:
    预测控制是一种基于模型的控制算法,预测模型的功能是根据被控对象的历史信息和假设的未来输入,预测未来的状态和输出,只强调模型的预测功能,而不在乎模型的具体实现形式,例如状态方程,传递函数等参数模型,此外对于稳定的线性对象,阶跃响应,脉冲响应等非参数模型,以及任何可以实现预测功能的模型。
    2、滚动优化:
    预测控制也是一种基于优化的控制算法,通过某一性能指标的最优来确定未来的控制作用。预测控制的优化与传统意义的优化控制还是有很大的不同。预测控制通常采用有限时域滚动优化。在每一采样时刻,优化性能指标只覆盖该时刻起的未来有限时域,是一个以未来有限控制量为优化变量的开还优化,在求解出这些最优控制量后,预测控制不是将他们一一实施,而是选取当前时刻的控制量作用于系统,到下一采样时刻,这一优化时域随着同时向前滚动推移,接着优化出最优控制量,选取当前控制量作用于系统,循环往复,所以预测控制不是一次离线优化而是反复在线进行优化,这就是滚动优化的含义,也是预测控制区别于传统最优控制的特点。
    3、反馈校正:
    预测控制还是一种基于反馈的控制算法,由于滚动优化只是开环优化,实际系统不可避免会遇到模型失配,扰动等不确定性,是系统偏离实际的优化结果,为了补偿各种不确定性影响,引入反馈机制来解决这些问题。在每一采样时刻首先检测当前系统的实时状态或者输出,并在优化求解控制作用前,先利用这一反馈信息通过刷新或修正把下一步预测和优化建立在更接近实际的基础上,称为反馈校正。这其中反馈的方式有多式多样,可以根据不同的预测算法采用不同的形式完成反馈的作用。
    预测控制的基本思想:
    采用滚动优化不断向前推进,推进的过程中,实时考虑系统的不确定因素,实际控制过程是建立在模型基础上的优化和信息基础的反馈来实现相应的性能指标。
    具体过程就是在假定系统在预测时域内,有Nc个控制作用,这Nc个控制作用可以将系统作用到期望的性能指标上,最后通过对性能指标的优化求解得到这些控制作用,就像平时解方程组,有Nc个未知量,这Nc个未知量符合一组方程组或者不等式组,最后通过这些方程组和不等式组来求解这Nc个控制量!

    展开全文
  • 风机经济模型预测控制
  • 快速模型预测控制

    2019-02-20 15:09:59
    在航空发动机非线性模型预测控制中,快速最优控制的一个应用
  • 模型预测控制.rar

    2019-08-06 20:12:00
    模型预测控制 陈虹 科学出版社 模型预测控制是自动化同学必读的书籍之一。
  • 模型预测控制 (MPC) 预测和优化未来时间范围内的时变过程。 该控制包接受线性或非线性模型。 使用APOPT、IPOPT等大规模非线性规划求解器,解决数据协调、移动范围估计、实时优化、动态仿真和非线性MPC问题。 此目录...
  • 模型预测控制讲义

    2019-09-18 19:08:34
    Alberto Bemporad的模型预测控制(MPC)课程英文讲义,从理论到实践较为全面,适合MPC入门。
  • 模型预测控制 陈虹

    2018-06-12 00:18:54
    陈洪教授书籍: 模型预测控制 。。。。
  • 模型预测控制系列讲解(三):常见的几种模型预测控制算法实现方式

    模型预测控制系列讲解(三):常见的几种模型预测控制算法实现方式

    说明

    这里只介绍几种通用的预测控制算法的实现方式,每一种预测控制算法都可以通过对预测模型的改进或者采用不同反馈方式来实现扩展,以满足不同情况的控制。主要介绍根据预测模型的不同来分类的预测控制,来说明预测控制的基本原理。

    非参数模型

    我们选取的非参数模型为系统的阶跃响应
    基于阶跃响应的动态矩阵预测控制:

    参数模型

    我们选取的参数模型为系统的状态方程
    基于状态方程的预测控制:

    展开全文
  • 针对模型预测控制给出了详细介绍,附带有例程,对于初学者有很大帮助! 针对模型预测控制给出了详细介绍,附带有例程,对于初学者有很大帮助!
  • 模型预测控制MPC

    万次阅读 2019-05-15 18:40:02
    模型预测控制MPC 因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激;也望借此平台留下学习笔记以温故而知新。这一篇文章介绍的是控制理论中的模型预测控制算法。 模型预测控制简介 模型...
  • 无人驾驶车辆模型预测控制,无人驾驶车辆模型预测控制,无人驾驶车辆模型预测控制
  • 模型预测控制陈虹.pdf

    2021-03-05 09:52:46
    模型预测控制陈虹.pdf
  • 模型预测控制方面

    2018-10-08 13:47:50
    本文档是自己在学习模型预测控制时,借助matlab里面自带的帮助文档,将里面的部分内容翻译过来,仅作为参考来用。
  • 提出了一种用于降压 DC-DC 转换器的模型预测控制 (MPC) 方法。后者基于转换器的离散模型
  • 0 模型预测控制三个步骤 预测模型:根据历史信息、未来输入预测未来输出。 滚动优化:某一性能指标最优,反复在线优化。 反馈校正:基于测量对模型预测进行修正。 图例: 对于参考轨迹1,以时刻k作为当前时刻,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,098
精华内容 1,639
关键字:

模型预测控制