理解模型预测控制,第8部分:用模型预测控制工具箱和FORCESPRO进行非线性MPC设计
从系列中:理解模型预测控制
Melda Ulusoy, MathWorks
Thivaharan Albin, Embotech
学习如何使用模型预测控制工具箱™和Embotech forcepro求解器为自动驾驶应用程序设计非线性MPC控制器。该演示演示了如何使用模型预测控制工具箱中的非线性MPC块来设计车道跟踪控制器,以保持车辆沿高速公路车道的中心线行驶,同时保持其纵向速度在用户设置的值。然后使用Embotech FORCESPRO求解器实现了相同的非线性MPC问题。
理解模型预测控制,第8部分:用模型预测控制工具箱和FORCESPRO进行非线性MPC设计
在本视频中,我们将为车道跟踪应用设计一个非线性MPC控制器。对于控制设计,我们将首先向您展示如何使用非线性MPC块,它使用优化工具箱中的“fmincon”算法解决非线性优化问题。然后,我们将演示如何使用Embotech的力量PRO非线性求解器与模型预测控制工具箱。该功能需要一个公开可用的插件和Embotech forcepro许可证。
正如我们在第4部分视频中讨论的那样,如果我们有一个高度非线性的对象,不能用线性模型来近似,或者我们有非线性约束和代价函数,那么线性MPC控制器将不足以控制对象。相反,我们可以使用一个非线性MPC控制器,它的工作原理类似于传统的MPC,因为它使用一个预测模型并解决一个优化问题来计算控制动作。与传统MPC的关键区别在于,非线性MPC允许我们使用非线性预测模型,具有非线性约束和非二次代价函数。注意,我们还需要使用非线性估计器来估计系统状态。
我们现在来看看这个由这三个子系统组成的车道跟踪示例,目前缺少“车道跟踪决策逻辑和控制器”子系统下的控制器。在开始控件设计之前,让我们讨论一下这些模块实现了什么。这一个模型的非线性横向和纵向车辆动力学使用自行车模型。它以控制器计算的转向角和加速度两个输入,输出纵向速度和包含车辆位置和方向的姿态。另一个子系统接收车辆动力学模块生成的输出,并使用虚幻引擎和前置摄像头传感器从虚幻环境中读取帧,实现具有3D可视化的交通场景。本例中使用的预定义开环场景包括一辆单车以14米/秒的预设速度沿着弯曲的道路行驶。摄像头采集的前视图图像用于车道边界检测,并作为车道跟踪决策逻辑和控制器的输入。该模块负责控制车辆的加速度和转向角度,使其沿车道中心行驶,同时将其纵向速度保持在理想值。该图描述了车道跟随的场景,并显示了如何定义系统参数。为了使车辆沿车道中心行驶,控制器需要使车辆的横向偏差和相对偏航角接近于零。 These two values are computed by these modules. This one takes the lane boundary information and estimates the lane center which is then used by the next module to compute the lateral deviation and relative yaw angle. The “Preview Curvature” subsystem also takes the longitudinal velocity and uses it along with the lane center to detect the road curvature sequence over the prediction horizon of the MPC controller which we’ll discuss shortly.
现在我们知道了这个车道跟踪应用程序的不同模块是如何工作的,我们将继续讨论控制器设计。为了控制非线性车辆动力学,我们将使用模型预测控制工具箱中的非线性MPC块。要使用这个块,我们需要创建一个非线性MPC对象,并在块对话框中指定它。我们现在将回顾这个脚本,它向我们展示了如何创建非线性MPC控制器并定义其参数。第一部分指定车辆、场景和传感器的参数。第二部分从设置纵向速度开始。初始速度是10m /s我们需要保持飞行器的目标速度是14m /s。正如我们前面讨论的,非线性MPC控制器使用非线性预测模型来预测未来的植物行为。在这里,我们使用“nlmpc”命令创建具有非线性预测模型的非线性MPC控制器,该模型具有七个状态、三个输出、两个操纵变量、一个测量扰动和一个未测量扰动。在创建控制器之后,我们需要指定非线性预测模型的状态和输出函数。 In this picture, we see the state and output equations that are defined in the highlighted functions. These are the states. The MVs are the acceleration and the steering angle. The measured disturbance is modeled as the product of the road curvature and the longitudinal velocity. The prediction model also includes an unmeasured disturbance modeled by white noise which gets added to the relative yaw angle output as seen in the output equation. The other outputs are the longitudinal velocity and lateral deviation that we’ve discussed previously.
我们刚刚看到的状态方程和输出方程分别在状态函数和输出函数中定义。突出显示的代码显示了如何为预测模型指定这些函数。最佳实践是为状态函数和输出函数提供一个解析雅可比矩阵,这有助于提高计算效率。如果解析雅可比矩阵不可用,非线性MPC控制器用数值方法计算雅可比矩阵。
在接下来的步骤中,我们为我们的非线性MPC控制器设置设计参数。控制器采样时间设置为0.1 s,预测范围和控制范围分别设置为30和2。在这里,我们定义了转向角度和加速度的约束条件。在这个例子中,我们有线性约束,但请注意,你也可以为你的非线性MPC问题指定非线性约束。在本节中,我们设置输出、操作变量和测量扰动的比例因子。最后,我们在MPC代价函数中指定了权重。在这个例子中,我们试图控制三个输出值,只有两个操纵变量导致一个非平方系统。因此,我们通过将纵向速度和横向偏差的相关权重设置为非零值来优先考虑两个输出的参考跟踪。我们还设置了MV和MV速率的权重。为MV速率选择权重是为了确保平稳行驶,让加速度和转向角度发生小幅度的变化。 The zero weights for the MVs indicate that they don’t need to track any reference values. If MVs had targets, we would select their weights to be much smaller than OV weights to prevent conflicting goals between OV and MV reference tracking. Once we’re done with the controller design, we can validate the controller functions at an arbitrary operating point. This is to test the prediction model functions for any potential problems.
接下来,我们运行这个脚本,然后回到我们的模型,在控制器块对话框中指定非线性MPC控制器,并连接它的输入和输出。非线性MPC控制器需要估计系统状态,对此我们使用了扩展卡尔曼滤波器。该模块使用与非线性MPC控制器相同的状态和输出函数。下一个输入是我们想控制输出的参考值。我们希望将纵向速度保持在先前定义的目标值上,并将横向偏差和相对偏航角驱动为零。非线性MPC块也需要前一个控制区间的mv。我们用单位延迟将它们反馈给控制器。我们还将当前的mv输入到扩展卡尔曼滤波块,因为它们需要进行状态估计计算。由控制器计算的mv是我们连接的转向角度和加速度,如图所示。最后,我们将输入测量的扰动,我们之前定义为纵向速度和道路曲率的乘积。
现在我们已经完成了控制设计,我们将模拟这个系统,看看非线性MPC控制器如何处理约束和执行参考跟踪。该模型被配置为记录感兴趣的信号,如输出和mv,稍后我们将使用数据检查器查看。一旦模拟开始,它将使用前置摄像头捕获的图像生成多个可视化。在这个视频中,我们看到车辆如何保持在车道内。其他视频向我们展示了车道检测是如何工作的。这是原始分割,其他视频分别以红色和绿色显示检测到的左右车道边界。我们现在切换到数据检查器来查看模拟过程中的日志信号。这些图表显示了测量的输出以及它们与参考值的比较情况。车辆以10米/秒的速度启动,并迅速收敛到目标速度,在剩余的模拟中成功跟踪。横向偏差和相对偏航角保持接近于零。 This implies that the vehicle is traveling along the lane center which we already confirmed with the 3D vehicle simulations. We can also view how acceleration and steering angle computed by the nonlinear MPC controller change to keep the outputs at their desired values. The plots also display the constraints that we specified for the MVs. We see that both MVs stay within the specified lower and upper bounds. In this timeframe, the acceleration hits the upper bound while the controller tries to speed up the vehicle from 10 to 14 m/s. But throughout the simulation, the acceleration stays within the specified upper and lower bounds. Similarly, the steering angle meets the specified constraints. In the next step, you can generate C code from your controller and deploy it for real-time control which we’ll discuss in more detail in a later video. Next, we’ll hear from Thiva on how to use the Embotech FORCESPRO solver for the same nonlinear MPC problem.
非常感谢Melda向我们展示了如何用模型预测控制工具箱来制定非线性MPC问题。现在,我们将为这个应用程序设计一个FORCESPRO求解器。
我们,MathWorks和Embotech共同设计了一个插件,这样就有一个直接的工作流程来结合MPC工具箱和Embotech FORCESPRO求解器。MathWorks的模型预测控制工具箱可以轻松设计和验证非线性MPC算法。此外,通过我们现在将介绍的工作流程,我们将为特定的NMPC应用程序和目标平台获得定制的FORCESPRO求解器。FORCESPRO是为嵌入式MPC问题开发的,其中计算时间、可靠性和内存效率非常重要。在生成求解器之后,我们可以在MathWorks环境中再次使用它,特别是在MATLAB、Simulink或模型预测控制工具箱中。如果您想使用此工作流,您将需要Embotech FORCESPRO许可证。
作为第一步,让我们回顾一下车道跟随的例子。我们将使用相同的MATLAB代码来定义非线性MPC对象,就像我们之前看到的那样。只有一个不同之处:我们没有指定雅可比函数。对于插件工作流,我们将使用一个称为CASADI的自动区分工具。这个工具将直接计算雅可比函数,因此我们不需要提供它们。其余部分保持不变。这包括定义参数,比如视界,代价函数和模型。在定义了NMPC对象之后,我们可以为这个优化问题设置forcespro求解器。我们构造这个选项结构体并给它贴上标签。这允许我们为求解器设置选项。 First, we set an initial guess for warm starting of the solver. We can also choose the optimization algorithm that is used within the solver. We will take the interior point option here. Alternatively, there is also the option of using the sequential quadratic programing algorithm. After setting all options, we can use the command “nlmpcToForces”. The command generates a tailored solver. The first input to the command defines the NMPC problem and the second input contains the options struct with all the settings of the solver. As an output of the function we receive the struct “coredata” and “onlinedata”, which are the structs that we need for running the MPC solver. Now, we are ready, so that we can run the command “nlmpcToForces”. After the solver generation is finished, we will find all the necessary files like the compiled library and the mex versions in our folder.
为了在MATLAB中运行生成的求解器,我们使用命令“nlmpcmoveForces”。输入“coredata”包含有关MPC求解器常量部分的信息,例如预测范围。此外,我们输入“x”表示当前系统状态,“lastMV”表示最后执行值。使用“onlinedata”,我们输入运行时参数,例如参考值和解决方案的初始猜测。现在,我们可以运行命令“nlmpcmoveForces”。计算完成后,我们将收到作为输出的最佳驱动值。我们也可以看看信息结构。例如,它给了我们一个exitflag,这里是1,意味着问题已经成功解决,直到收敛。info结构体还向我们展示了总的计算时间。该算法在4.8 msec的时间内解决了车道跟随的优化问题,体现了FORCESPRO的计算效率。
接下来,我们将基于forcespro的NMPC控制器集成到车道跟踪Simulink模型中。我们将使用之前见过的Simulink模型。在那里,我们将集成FORCESPRO Simulink块。这个块包含在FORCESPRO客户端安装中。在选项中,我们需要设置“coredata”,这是在生成求解器时创建的结构体。我们还指定我们已经测量了扰动。我们还可以看到其他选项,如输出最优成本、最优控制序列或非线性程序的状态。为了将FORCESPRO求解器集成到我们的Simulink车道跟踪模型中,我们只是将基于“fmincon”的NMPC控制器替换为基于FORCESPRO的NMPC控制器,这就是它了。
现在,我们可以运行闭环控制模拟。我们可以通过查看图形模拟来验证控制行为。车辆在车道上正常行驶。此外,我们还可以查看一下数据检查器。图显示,各种参考值可以以非常高的性能跟踪。事实上,除了小的数值差异之外,还实现了与“fmincon”相同的闭环行为。同时,FORCESPRO具有非常小的计算时间和非常高的内存效率。
好了,这就是将FORCESPRO求解器与模型预测控制工具箱集成到非线性MPC项目的整个工作流程的概述。通过我们开发的工作流,有一个简单的过程可以实现这一点。现在,我将再次交给梅尔达。
在本视频中,我们向您展示了如何使用模型预测控制工具箱为车道跟踪应用程序设计一个非线性MPC控制器。我们还讨论了如何为相同的应用程序设计一个force PRO求解器。有关模型预测控制的更多信息,请查看本页以及视频描述中给出的链接。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。