精华内容
下载资源
问答
  • 本书一方面可以作为地面无人车辆、空中无人机、无人艇及移动机器人等无人车辆模型预测控制的研究资料,同时也可以作为学习模型预测控制理论的应用教材。 本书主要介绍模型预测控制理论与方法在无人驾驶车辆运动规划...
  • 模型预测控制 陈虹

    2018-06-12 00:18:54
    陈洪教授书籍: 模型预测控制 。。。。
  • 学习无人车辆轨迹跟踪很好的一本书,在这里推荐给大家。
  • 其中为MPC模型预测控制仿真程序,为m文件,包含了对模型预测控制的理解,有助于结合理论
  • 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

    展开全文
  • 针对模型预测控制给出了详细介绍,附带有例程,对于初学者有很大帮助!
  • 分别给出了无约束MPC和约束MPC的MATLAB程序
  • 基于模型预测控制设计的无人驾驶车辆轨迹跟踪问题,内附有MATLAB程序与详细的建模过程,研究车辆转向的同学可以作为参考
  • ARMA模型预测

    2014-08-28 15:37:08
    ARMA模型预测及其对参数的识别完整有效程序程序。可以一次进行参数识别
  • 模型预测控制MPC程序代码

    热门讨论 2015-11-17 16:51:04
    基于状态空间的模型预测MPC控制器的设计,附带例子(MATLAB)
  • 基于模型预测控制(MPC)的车道保持控制实现方法

    万次阅读 多人点赞 2019-04-10 19:05:44
    车辆保持的目的是通过检测到车辆与道路中心线的横向偏差和横摆角偏差来控制车辆的方向盘的转角,最终使车辆行驶...整个基于模型预测控制的车道保持系统simulink仿真框架如下所示 图 1 在实际的车辆保持控制算法...

         车辆保持的目的是通过检测到车辆与道路中心线的横向偏差和横摆角偏差来控制车辆的方向盘的转角,最终使车辆行驶在道路中心线上。

           MATLAB 2018b中有一个关于车道保持的案例,本次设计模型控制算法部分与案例相同,但是车辆对象采用Carsim中的车辆模型。整个基于模型预测控制的车道保持系统simulink仿真框架如下所示

    图 1

           在实际的车辆保持控制算法中可用惯性测量单元IMU测量纵向速度 、横向速度、横向加速度、横摆角速度 等参数。可通过摄像头获取横向偏差,也可以通过摄像头预瞄的点计算出道路的曲率。

         车辆的动力学模型

           MATLAB 2018b中关于车道保持的案例采用的模型预测控制实现车辆的横向控制,其动力学模型及其推导过程如下

    最原始的状态变量为横向距离变化率和横摆角速度变化率,输入变量车辆的前轮偏角为

       (1)

    将上述公式拓展输出变量为,输入变量为新的状态空间方程为

    (2)

     

      (3)

    将公式(2)带入公式(3)

    选取的状态变量 ,输入变量为

     (4)

    注:公式(2)和公式(4)将将期望横摆角的变化率作为输入,实际上期望横摆角的变化率是一个扰动量,在MATLAB2018中输入量和扰动量放在一起,这一点在下一节中也会提到。

    MPC的实现

           模型预测控制主要包含三大部分:模型预测、滚动优化和反馈矫正。常规的模型预测控制的框架如下所示。

     

    图 2

    模型预测

    公式(4)为对车辆进行模型预测控制需要的连续车辆横向动力学模型。为了在计算机中实现需要对公式(4)的模型进行离散化,在MATLAB 2018b的getDiscrete函数中采用Simpson's rule 计算,,在实际车辆控制中为了实现的方便性建议中采用双积分变换求解具体实现如下所示

           在公式(4)的状态空间方程中,对应的横向偏差及变化率,横摆角偏差及变化率的计算如下所示。

    期望的横摆角速度 ,车辆实际的偏航角速度通过IMU测量得到。从而得到横摆角速度偏差。横摆角偏差通过横摆角速度偏差求积分得到。

    横向偏差的变化率,横向偏差 通过横向偏差的变化率求积分得到。横向偏差和横摆角的偏差如图3所示。实际这么求解横向偏差和偏航角偏差是否有问题?

    图3

    根据道路中心线的坐标计算出道路中心线曲率的时间序列,根据当前的时间和预瞄的长度,从上述时间序列中取出当前的曲率和预瞄时间内需要的曲率。在Curvature Previewer模块中实现上述功能。

           航向角偏差通过本车的航向角、纵向速度、曲率计算得到。期望的航向角计算的方法,期望的航向角为在期望位置的切线与X轴之间的夹角。

           如果是双移线工况

    可以通过上述公式直接计算出期望的航向角。如果能够事先获得参考轨迹的Xref,Yref坐标则可以通过另外一种方法计算期望航向角,具体如下所示。

    DX = gradient(Xref,Ts);

    DY = gradient(Yref,Ts);

    head_angle = atan2(DY,DX);

           Matlab中对应状态空间方程的表示形式,控制量、可测量的扰动,以及不可测量的扰动对应矩阵都是放在B中。

      

    在MPC控制作为模型预测的模型中,期望的航向角速度时作为测量扰动。

           获得离散后的车辆状态空间模型后,通过不断的迭代就可以得到模型的预测输出。

           在MATLAB 2018b的案例中获得模型预测控制需要的状态空间模型在lkablock_utilGetDiscreteModelForMPC函数实现。

           [mpcobj,UseExternalModel,DataType,NumEgoStates,hasLag] = ...

    lkablock_MaskInitFcn(gcb,EgoModelMatrixA,EgoModelMatrixB,EgoModelMatrixC,...

        MaxSteering,MinSteering,...

        InitialLongVel,...

        PredictionHorizon,Ts,maxiter,ControllerBehavior,...    VehicleMass,VehicleYawInertia,LengthToFront,LengthToRear,FrontTireStiffness,RearTireStiffness,TransportLag);

           MPC控制是采用simulink中的Model Predictive Control Toolbox工具箱中的Adaptive MPC Controller模块来实现的。

           控制相关的参数如下所示

    名称

    Ts

    0.1s

    m

    1575kg

    Iz

    2875kg.m2

    If

    1.2m

    Ir

    1.6m

    Cf

    68623 N/rad

    Cr

    533911 N/rad

    Np

    10

    Nu

    2

    R1

    0

    R2

    0.1/alpha

    Q

    [1 0.1]/alpha

    Umax

    0.5rad

    Umin

    -0.5rad

     

    滚动优化

    得到车辆模型在预测时域内的预测输出后,建立模型预测输出与期望输出之间的偏差和控制量及其变化率的二次型目标函数,具体如下所示。通过二次规划的方法可以求解出最优的控制量即前轮偏角。由于期望的输出是横向偏差和横摆角偏差,所以期望的输出值为0。

           通过在每个控制周期不断地求解最优的控制量,形成滚动优化过程。

    反馈矫正

           反馈矫正是通过比较模型输出与实际对象输出之间的偏差来修正模型的预测输出,这一点在目前的MATLAB 的车道保持案例中暂未体现出来。

    MPC 控制参数调节

    MPC的控制参数通过Mask->View base mask->Initialization中调用lkablock_MaskInitFcn函数实现的。权重参数、预测时域、控制时域等在lkablock_MaskInitFcn函数中的子函数generateMPC中设置。

    整个权重参数的调节是通过一个基本参数beta来调节,其值在0-1之间可调,具体计算如下所示。

    weightrange = 50;

          alpha =1 /weightrange^(beta-0.5);

    控制量变化率的权重为0.1*alpha, 输出偏差的权重为[1 0.1]/Alpha。

    当beta往1变大时,alpha变小,控制量变化率的权重系数变小,输出偏差的权重系数变大,控制量变化率变大,控制很激进。当beta往0变小时,alpha变大,控制量变化率的权重系数变大,输出偏差的权重系数变小,控制量变化率变小,控制相对来说变得缓慢。详细的参数调节对应的MATLAB程序如下所示。

    % Specify the MPC signal types in the plant.

    sys = setmpcsignals(sys,'MV',1,'MD',2);

    %% MPC Design

    mpc1 = mpc(sys,Ts);

    % Specify the prediction horizon.

    mpc1.PredictionHorizon = psteps;

    % Specify the control horizon.

    mpc1.ControlHorizon = round(max(0.1*mpc1.PredictionHorizon,2)); //控制时域

    % Specify MV constraints: max/min acceleraion.

    mpc1.MV.Min = umin;

    mpc1.MV.Max = umax;

    % Specify scale factors based on the operating ranges of the variables.

    mpc1.MV.ScaleFactor = umax-umin; % range of the steering angle

    mpc1.DV.ScaleFactor = 0.01; % scale factor of road yaw angle rate

    mpc1.OV(1).ScaleFactor = 0.5; % scale factor of lateral deviation w.r.t road

    mpc1.OV(2).ScaleFactor = 0.1; % scale factor of relative yaw angle w.r.t. road

    % Specify weights.

    alpha = getWeightParam(weightratio); % relating slider on mask to weights in MPC design

    mpc1.Weights.MVRate = 0.1*alpha;

    mpc1.Weights.OV = [1 0.1]/alpha; % tighter control on lateral deviation over relative yaw angle

    ScaleFactor 的作用是在优化的目标函数中将控制量和输出量统一成一样的范围,方便调节输出权重和控制权重。

     

    总结

           本文介绍MATLAB的基于MPC的车道保持控制案例的实现过程,并将实际的车辆对象通过Carsim中的车辆仿真对象进行替代,最后重点介绍了MATLAB中关于模型预测控制的参数调节方法。

    展开全文
  • 0 模型预测控制三个步骤 预测模型:根据历史信息、未来输入预测未来输出。 滚动优化:某一性能指标最优,反复在线优化。 反馈校正:基于测量对模型预测进行修正。 图例: 对于参考轨迹1,以时刻k作为当前时刻,...

    0 模型预测控制三个步骤

    1. 预测模型:根据历史信息、未来输入预测未来输出。
    2. 滚动优化:某一性能指标最优,反复在线优化。
    3. 反馈校正:基于测量对模型预测进行修正。

    图例:

    在这里插入图片描述

    对于参考轨迹1,以时刻k作为当前时刻,预测[K,K+Np]的系统输出,通过求解以某目标的优化问题,得到预测控制量4,以该控制序列的第一个元素作为实际控制量。
    下一时刻,重复该过程(滚动)。

    根据所用模型不同,模型预测控制分为动态矩阵控制(DMC),模型算法控制(MAC)、广义预测控制(GPC)。对于无人驾驶车辆方向,重点在于基于状态空间模型的模型预测控制上。
    在这里插入图片描述

    非线性系统线性化方法

    具体编程时的流程

    1. 先写出此系统的状态空间方程
    2. 转换为线性化模型
    3. 转换为预测模型
    4. 转换为二次规划问题
    5. 利用求解器求解该二次规划
      matlab程序中,控制量是[v,w]

    非线性化方法

    1. 设定costfunction,以控制量序列为变量,轨迹跟踪误差为输出。
    2. 滚动优化进行求解(本质就是最优化问题)
      matlab程序中,控制量是[v,前轮偏角]

    线性约束下的二次型规划控制

    对于线性系统,如果去状态变量和控制变量的二次型函数的积分作为性能指标函数,则这种动态系统最优问题称为线性系统二次型性能指标的最优控制问题。
    是一种状态反馈控制律。

    LQR在无人驾驶车辆路径跟踪中的应用

    无人驾驶中利用LQR构建前馈+反馈的控制系统:
    控制量是[前轮偏角],速度v书中设置为了常数

    1. 根据参考轨迹获得前馈控制量(还未经过的轨迹的对应的控制量)
    2. 得到线性化的车辆状态空间方程(此方程与线性化方法中的方程一致)
      在这里插入图片描述
    3. 定义LQR评价函数
      在这里插入图片描述
    4. 引入拉格朗日乘子(运动约束),构造无约束的最优化问题
    5. 使用迭代公式进行求解控制量(从预测终点时刻向后迭代至当前位置时刻)
    展开全文
  • 模型预测控制与机器学习

    千次阅读 2020-11-17 21:10:12
    文章目录一、模型预测控制原理及应用二、浅谈机器学习技术三、基于机器学习的模型预测控制四、总结 最近几年,人工智能和机器学习受到了各行各业的热捧,已经不再是计算机科学系(CS)的“专利”,甚至连我这个...


    最近几年,人工智能和机器学习受到了各行各业的热捧,已经不再是计算机科学系(CS)的“专利”,甚至连我这个传统的机械工程系(ME)研究生都跑来凑了个热闹。本文将不使用任何让人敬而远之的公式,试图通过自然语言深入浅出的讨论,当模型预测控制遇见机器学习,它们会擦出怎样的思想火花。

    一、模型预测控制原理及应用

    凡学过自动控制原理的学生,或者从事控制系统开发工作的工程师应该对于PID(比例Proportional-积分Integral-微分Derivative)这种最为古老和成功的控制方法并不陌生,而对于MPC(模型Model-预测Predictive-控制Control)这种新兴的强大的控制技术可能并不很熟悉。

    国际自动控制联合会(英文缩写IFAC)每三年召开一次的世界大会是自动控制领域公认的顶级学术会议,其在2014年发布的一项调查报告显示,PID仍然是在工业领域具有最大影响力的控制技术,紧随其后的就是MPC。

    在这里插入图片描述

    图1. 影响工业界的控制技术

    (来源: Tariq Samad, A Survey on Industry Impact and Challenges Thereof)

    PID和MPC控制的共同之处在于其目的都是通过控制执行器,例如电机,阀门等,使被控对象,如汽车,化学反应器等,跟随一种期望的行为轨迹。

    其不同之处在于,如图所示,PID控制器使用通过传感器采集到的被控对象当前的和过去的状态来控制执行器动作,而MPC控制器基于被控对象当前的状态,利用控制器内部简化的被控对象物理模型来预测被控对象在接下来一段时域内,一系列执行器动作作用下的行为轨迹。

    进而通过优化工具搜索到能实现对期望轨迹最优跟随效果的一系列执行器动作,然后只将第一步动作施加在被控对象上,被控对象执行完毕后再次反馈其当前的状态给MPC控制器,以重复这个控制过程。

    两种方法各有优劣,PID控制方法简单,工程实现容易,但存在超调问题,而且难以胜任多个输入和输出(Multi-Input and Multi-Output,简称MIMO)的复杂控制系统的多目标受限优化问题;MPC理论上可以实现最优的控制性能,并且可以轻松应对MIMO系统的挑战,但其性能非常依赖预测模型的精度。
    在这里插入图片描述
    图2. PID控制与MPC控制效果的差别

    (来源: Ylva Lindberg, A Comparison Between MPC and PID Controllers)

    在这里插入图片描述
    图3. MPC控制原理示意

    (来源: Melda Ulusoy, Understanding Model Predictive Control)

    学术界的读者通常比较关心某个技术的理论和原理,而工业界的读者可能更加关心这种技术的量产应用。相比PID这种已经在产品控制器中大量使用的控制技术,MPC的量产应用,特别是在我所熟悉的汽车领域可以说还处在早期阶段。

    这与MPC控制技术的研究起步较晚,技术门槛较高,以及量产控制器出于成本考虑所用芯片较为有限的计算能力和存储资源有关。

    令人振奋的是,通用汽车(GM)与ODYS公司合作,在2018年将MPC技术成功的应用到了GM 的量产控制器,用于发动机扭矩控制和变速箱速比控制,并取得了不错的节油效果。

    这是MPC在汽车工业界的第一次量产应用,感兴趣的读者可以阅读GM 和 ODYS 在SAE上联合发表的文章。另外,在百度Apollo开源自动驾驶平台上,MPC被用于百度自动驾驶车辆的路径跟踪控制。感兴趣的读者可以在百度Apollo的网站上观看相关培训视频和下载MPC代码学习。

    因此,总体而言,虽然MPC在汽车工业量产的应用案例还不多,但随着芯片技术的飞速发展,可以预见未来会有越来越多的基于MPC的产品控制器落地。
    在这里插入图片描述
    图4. MPC 用于GM量产发动机控制器扭矩控制和变速箱控制器速比控制

    (来源: Alberto Bemporad, Supervisory Model Predictive Control of a Powertrain with a Continuously Variable Transmission)

    在这里插入图片描述
    图5. MPC用于百度Apollo自动驾驶车辆路径跟踪控制

    (来源: Qi Luo, An Automated Learning-Based Procedure for Large-scale Vehicle Dynamics Modeling on Baidu Apollo Platform)

    二、浅谈机器学习技术

    在过去的几年,机器学习技术在不同的应用领域取得了巨大的成功,这主要归功于大量可获取的数据,更加高效的算法,以及越来越强大的传感器、芯片和通讯技术。机器学习(ML)是人工智能(AI)的一个分支,也是实现AI的一个途径。大家可以在书籍或网上找到很多关于ML的定义。

    我从工程系统的角度理解,用一句话解释,那就是ML是利用数学(例如概率论)将工程系统的历史数据(Data)转换为数字(Numbers),并从中找出系统的行为模式(Patterns),以对其未来的行为进行预测(Prediction)。

    如果只用一个词解释,那就是预测(Prediction)。ML跟MPC一样,都是预测,只不过ML的预测是基于数据(Data-based),而MPC的预测是基于物理模型(Model-based or Physics-based)。

    机器学习方法可以分为如下几种类别:

    监督学习: 从给定的训练数据集中学习出一个函数,当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求是包括输入和输出,也可以说是特征和目标。训练集中的目标是由人标注的。常见的监督学习算法包括回归分析和统计分类。

    无监督学习: 与监督学习相比,训练集没有人为标注的结果。常见的无监督学习算法有生成对抗网络(GAN)、聚类。

    迁移学习: 专注于存储已有问题的解决模型,并将其利用在其他不同但相关问题上。比如说,用来辨识汽车的知识也可以被用来提升识别卡车的能力。

    强化学习: 机器为了达成目标,随着环境的变动,而逐步调整其行为,并评估每一个行动之后所到的回馈是正向的或负向的。
    在这里插入图片描述
    这些ML的基础知识并非本文讨论的重点,仅作为接下来要讨论的内容的铺垫。

    2020年9月份,计算机科学领域的世界知名学者、加州大学洛杉矶分校计算机科学教授朱松纯,以国家战略科学家的身份回国并任教清华大学自动化系。我读过他在2017年写的一篇很有意思的科普文章,中文题目为《人工智能的现状、任务、构架与统一》,英文题目为“AI:The Era of Big Integration”。

    在这篇文章里,首先讲了一个“聪明的乌鸦”的故事来启示读者,然后科普了AI涉及到的六大学科的前沿问题,包括计算机视觉、自然语言理解与交流、认知与推理、机器人学、博弈与伦理以及机器学习,最后总结了一个很有意思的观点,在此先按下不表。

    让我们先看看这只乌鸦是何等聪明。事实上,这是日本东北大学的一项研究,图a是一只乌鸦,它找到了一个坚果,然而砸碎坚果吃到果肉超出了它自己的物理动作能力。于是,它想到一个办法,那就是飞到高处,然后把坚果丢到地面上,试图砸开果壳。

    这是在利用坚果自身的重力势能砸碎果壳。很可惜,这个办法不行(图b)。于是,它通过观察,又想到另一个办法,那就是飞到马路上的斑马线上空,然后把坚果丢到斑马线上让汽车轧过去。这其实是在利用汽车的重量轧碎果壳。这个方法成功了(图c和图d)。

    生物都有趋利避害的本能,乌鸦知道如果在车辆穿过斑马线时去吃果肉,自己很可能会被轧死。但它观察到一个现象,那就是当允许行人通行的指示灯亮起时(图e),汽车都会停在斑马线前方。于是它选择在这个时候飞到斑马线上,安全的吃到了果肉(图f)。

    我们不难发现,在这个过程中,乌鸦巧妙的利用了物理学中的重力。

    朱松纯教授认为,物理学往往把生物智能排除在研究之外,而人工智能也很少关注物理学,但两者本质上是相通的:当你有了一个概率分布,你就有了势能函数,然后就有了相互作用,也就是力和场。

    因此,他认为人工智能本质上必将是以牛顿和达尔文为代表的物理学和进化论两大理论的统一

    在这里插入图片描述
    图7. 牛顿(物理学)和达尔文(进化论)

    (来源: Song-Chun Zhu, AI: The Era of Big Integration)
    在这里插入图片描述
    图8. 牛顿和达尔文

    (来源: Song-Chun Zhu, AI: The Era of Big Integration)

    三、基于机器学习的模型预测控制

    写到这里,终于可以毫无违和感的引出本文的主题——基于机器学习的模型预测控制,英文名为Learning-based MPC。

    前面讲了传统的MPC是在控制器内部基于牛顿力学搭建了一个简化的被控对象物理模型以用于预测,并基于预测,在一定的约束条件下搜索最优的控制解。通过合理的设置约束条件,MPC可以确保控制行为的安全性(Safety Guarantees)。

    然而,这种控制方法的性能(Performance)非常依赖于物理模型的精度。为了提高控制性能,通常的做法是搭建更加复杂的物理模型,或者使用非线性的优化求解器。

    这些做法面临几大挑战,一是难以通过物理学方法(例如牛顿力学)对越来越复杂的工程系统(例如自动驾驶)进行足够精确的建模,特别是当被控对象的运行环境存在较大不确定性;

    另一方面,过于复杂的物理模型和非线性优化必然带来过高的计算负荷和存储需求,导致这种方法通常止步于计算机仿真和实验室用于学术研究的高性能控制器,难以进一步走向能大规模量产的低成本控制器;

    此外,传统的MPC控制是不具有进化能力的,其物理模型和控制参数并不会随被控对象和运行环境的变化(例如产品的老化)做出自适应的调整。

    ML是基于数据来进行预测,随着有效数据的积累,理论上ML的预测能力可以持续的进化。

    ML也存在一些问题,一是其预测性能非常依赖于训练数据的数量,然而,在很多的应用领域难以获取大量有效的训练数据,这就极大的限制了ML的应用。

    另一方面,很多的ML方法(例如深度神经网络DNN)被视为黑盒子,其预测性能难以被解释。还有很重要的一点,一旦学习失败,ML通常难以保证安全(No Safety Guarantees),这种失效对于很多安全性要求比较高(Safety Critical)的工程应用是难以接受的。

    基于上述讨论不难看出,MPC的不足刚好是ML的优势,而ML的不足又刚好是MPC的优势。

    因此,加州大学伯克利分校的学者在2012年首次提出了一种基于机器学习的模型预测控制方法,把MPC和ML两种技术完美的结合起来,并通过理论和试验证明了该方法的安全性,以及比传统MPC更优的控制性能。这种新的方法的提出如同打开了一扇门,让牛顿和达尔文走到了一起。

    从此之后,越来越多的学者开始研究这种新的控制方法,设计出了不同的变种,并探索了不同的ML方法(如回归,强化学习,深度学习等)在MPC控制问题上的应用。

    我在今年7月份参加了IFAC 2020国际会议(自动控制领域的顶级会议)。在该会议上,Alberto Bemporad 教授受邀做了题为Machine Learning: A New ICE (Identification, Control, Estimation) Age 的主题报告。

    Alberto Bemporad 是意大利Lucca IMT先进技术研究院的教授,MATLAB MPC 工具箱的作者,MPC研究领域的专家,同时也是上文提到的是与GM合作率先实现MPC控制技术在汽车工业量产应用的ODYS公司的创始人。

    Alberto Bemporad 教授的报告内容非常精彩,受限于篇幅,我这里只引用其中两页纸并略作解释。

    在第一页报告里,Bemporad教授认为ML可以在三个方面赋能MPC,分别是:

    1)利用ML算法(例如非线性回归)从数据中学习预测模型,以提高预测模型的精度,进而实现更优的控制;

    2)利用ML算法(例如强化学习)从数据中直接学习并生成MPC控制策略,以及MPC控制参数标定;

    3)利用ML算法(例如深度神经网络)从数据中学习和重构不可直接测量,而需要估计的MPC控制所需的状态量。

    在总结报告中,Bemporad教授认为ML和MPC的结合会产生“化学反应”,并会极大的提高控制系统的设计和开发水平,同时指出单独使用ML搭建的黑盒模型(例如DNN)不能替代自动控制技术,因此应尽量使用灰盒模型(即ML+MPC)以实现可解释的最优性能,同时确保控制系统的稳定性和安全性。

    感兴趣的读者可以阅读Bemporad 教授发表的一系列文章。朱松纯教授和Alberto Bemporad 教授,一位是ML领域的知名学者,一位是MPC领域的顶级专家,他们的观点居然不谋而合,何其妙哉!
    在这里插入图片描述
    图9. ML如何赋能MPC

    (Source: Alberto Bemporad, Presentation at IFAC 2020)
    在这里插入图片描述
    图10. 当MPC遇到ML

    (Source: Alberto Bemporad, Presentation at IFAC 2020)

    四、总结

    本文首先介绍了模型预测控制技术(MPC)的原理,及其在汽车控制领域的应用。

    然后简要的谈了谈机器学习技术(ML)的基本概念,引用了全球著名的人工智能专家朱松纯教授的科普文章中“聪明的乌鸦”的故事,并借用他的观点“人工智能本质上必将是达尔文与牛顿为代表的两大理论的统一”引出了本文重点讨论的基于机器学习的模型预测控制技术(Learning-based MPC)这一前沿的技术方向。

    最后结合MPC领域专家Alberto Bemporad 教授在IFAC 2020国际会议上的报告,讨论了ML将如何赋能MPC。

    受限于篇幅,本文没有展开讨论Learning-based MPC技术及其研究进展。

    其他

    本文转载于 https://mp.weixin.qq.com/s/jp0NP5jolLJ6SjE3SBDyTg ,仅用于交流学习。

    展开全文
  • 线性时变模型预测控制推导

    千次阅读 2021-04-09 17:49:40
    以自行车模型为例,在推导过程中下角标 r (reference),即参考的意思。
  • 模型预测控制系列讲解(二)模型预测控制算法发展进程 后续更新
  • 无人驾驶汽车系统入门(十)——基于运动学模型的模型预测控制 在前面的第五篇博客中,我们介绍了两种常见的车辆模型——运动学自行车模型和动力学自行车模型,本节我们基于运动学车辆模型引入一种新的控制理论...
  • 无人驾驶汽车模型预测控制

    千次阅读 2018-12-05 20:39:56
    无人驾驶汽车模型预测控制 1.车辆控制模型 在之前我的博客文章里面介绍无人驾驶车辆横向控制模型,在上面基础上,MPC控制模型将纵向与横向控制模型结合起来,实现纵向与横向一起控制 车辆的横向误差模型如下: 2...
  • 模型预测控制(MPC)解析(一):模型

    千次阅读 多人点赞 2020-05-31 23:19:22
    一、状态空间模型 1.1 单输入单输出系统 二、优化窗口内的预测控制 2.1 状态变量和输出变量的预测 2.2 优化 三、滚动时域控制 3.1 闭环控制系统
  • 基于运动学模型的模型预测控制

    千次阅读 2019-12-28 15:50:00
    什么是模型预测控制 模型预测控制(MPC)是一种致力于将更长时间跨度、甚至于无穷时间的最优化控制问题,分解为若干个更短时间跨度,或者有限时间跨度的最优化控制问题,并且在一定程度上仍然追求最优解。模型预测...
  • ARIMA模型,全称为自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model),是由博克思(Box)和詹金斯(Jenkins)于20世纪70年代初提出的一种时间序列预测方法。ARIMA模型是指在将非平稳时间序列...
  • 本篇文章为永磁同步电机模型预测控制(PMSM-MPC)Simulink仿真教程 包含了控制原理和simulink仿真搭建。 详细的描述了模型预测的研究。个人花费了很久的时间整理和完善!希望对大家有用喔! 希望大家点赞,收藏喔...
  • 使用Gompertz模型预测非典的趋势

    千次阅读 2020-01-29 19:57:30
    预测软件的可靠性时,可以根据该软件多轮测试发现的缺陷个数来预测应该发现的总缺陷数。在软件测试过程中,最开始的时候,会呈现缺陷增长较快的趋势状态,随着...在实践中预测总缺陷数的常用方法是Gompertz模型,...
  • 一、模型预测的发展 1、先进控制技术及其分类 预测控制是一种基于模型的先进控制技术,即模型预测控制(MPC:Model Predictive Control); 基本特点:预测模型、滚动优化、反馈校正、设定值柔化; 主要优点:...
  • 模型预测控制(MPC)简介

    万次阅读 多人点赞 2018-09-12 21:10:31
    在MPC算法中,需要一个描述对象动态行为的模型,这个模型的作用是预测系统未来的动态。即能够根据系统k时刻的状态和k时刻的控制输入,预测到k+1时刻的输出。在这里k时刻的输入正是用来控制系统k+1时间的输出,使其...
  • IEEE / ASME International Conference on Advanced Intelligent Mechatronics , 2003 ( 2 ) : 1390-1395 模型预测控制在无人驾驶车辆运动规划与控制中的应用 车辆动力学模型分析对于解决无人驾驶车辆运动规划与...
  • 传统的时序模型预测

    千次阅读 2019-08-11 23:28:50
    周五听了一讲报告,报告中老师讲述了传统的时序模型预测问题,因为认真的记录了笔记,所以利用今天时间整理出来,供以后学习作参考。 传统的时序模型预测问题一共有8类模型: 1)平滑法 平滑法常用于趋势分析和预...
  • 模型预测控制MPC

    千次阅读 2019-04-08 21:00:56
    模型预测控制MPC 模型预测控制(或MPC)是一种更复杂的控制器,它非常依赖于数学优化,但基本上可以将MPC归结为三个步骤: 1、建立车辆模型。 2、使用优化引擎计算有限时间范围内的控制输入。 3、执行第一组控制输入...
  • 无人驾驶模型预测控制carSIM和MATLAB联合仿真

    万次阅读 多人点赞 2019-08-03 21:52:27
    本例参照龚建伟的《无人驾驶车辆模型预测控制》书中第四章节 1.carSIM软件介绍 carSIM是由美国MSC公司开发的车辆动力学仿真软件,它可以方便灵活地定义实验环境和试验过程,准确预测和仿真汽车的操纵稳定性、动力性...
  • Maxent模型预测

    千次阅读 2021-02-09 19:24:40
    前言 近日,笔者学习了Maxent模型预测,在这里做一个总结和分享。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475,258
精华内容 190,103
关键字:

模型预测