文章目录

  • 前言
  • 1. 背景 Background
  • 1.1 滚动时域控制 Receding Horizon Control
  • 1.2 线性模型预测控制 Linear Model Predictive Control
  • 1.3 非线性模型预测控制 Nonlinear Model Predictive Control
  • 1.4 线性鲁棒模型预测控制 Linear Robust Model Predictive Control
  • 1.4.1 反馈预测 Feedback Predictions
  • 1.4.2 鲁棒不确定不等式 Robust Uncertain Inequalities Satisfaction
  • 2. 用于多旋翼系统的基于模型的轨迹跟踪控制器 Model-Based Trajectory Tracking Controller for Multi-rotor System
  • 2.1 多旋翼系统模型 Multirotor System Model
  • 2.2 Linear MPC
  • 3.2.1 姿态环参数辨识 Attitude Loop Parameters Identification
  • 3.2.2 线性化、解耦和离散化 Linearization, Decoupling and Discretization
  • 2.2.3 ROS集成 ROS Integration
  • 2.2.4 实验结果 Experimental Results
  • 2.3 Nonlinear MPC
  • 2.3.1 ROS集成 ROS Integration
  • 2.3.2 实验结果 Experimental Results
  • 3 结论 Conclusion
  • 原文献


前言

  本章遵循的一般控制结构是一种级联控制方法,其中一个可靠的适用于系统的低级控制器作为内环,基于模型的轨迹跟踪控制器作为外环运行。

1. 背景 Background

1.1 滚动时域控制 Receding Horizon Control

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python步的控制输入滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_02。但是他有两个缺点:

  • (a) 当控制设计阶段出现意外(未知)扰动,或控制模型与实际系统行为不同时,控制器无法对计算出的控制序列进行解释;
  • (b) 在控制序列的最后一步时,由于剩下的时间较少,不能对目标函数进行求解。

为了解决这些限制,RHC提出了计算整个控制序列后,只应用它第一步的结果,然后再次迭代整个过程(滚动时域的方式)求解新的控制序列。RHC策略一般适用于非线性动力学(考虑到状态更新可用):
滚动时域优化代码python 滚动时域控制原理_模型预测控制_03
其中向量滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_04滚动时域优化代码python 滚动时域控制原理_无人机_05表示状态向量,滚动时域优化代码python 滚动时域控制原理_MPC_06表示输入向量。通常,RHC的基于状态反馈的优化问题可以定义如下。
滚动时域优化代码python 滚动时域控制原理_模型预测控制_07
其中滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_08是优化变量,滚动时域优化代码python 滚动时域控制原理_时域_09表示用于每级的权重(惩罚的度量),滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_10表示最终状态的权重,滚动时域优化代码python 滚动时域控制原理_MPC_11表示参考信号,下标滚动时域优化代码python 滚动时域控制原理_时域_12表示一个信号在当前时间滚动时域优化代码python 滚动时域控制原理_无人机_13之后滚动时域优化代码python 滚动时域控制原理_时域_14步处的采样(使用固定的采样时间滚动时域优化代码python 滚动时域控制原理_时域_15),而滚动时域优化代码python 滚动时域控制原理_模型预测控制_16则是其下一步的变化,滚动时域优化代码python 滚动时域控制原理_模型预测控制_17表示输入约束集,滚动时域优化代码python 滚动时域控制原理_无人机_18表示状态约束集,滚动时域优化代码python 滚动时域控制原理_无人机_19是当前RHC迭代开始时的状态向量的值。这个优化问题的解也是一个最优控制序列滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_20,只使用第一步的控制量滚动时域优化代码python 滚动时域控制原理_MPC_21作为当前的输入,第二步的输入需要再次迭代后获取(白话:每次求解都可以获得一系列包含未来滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python步的最优控制输入,但是实际使用的时候只取第一个,后面的舍弃)。

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_10在闭环稳定中起到了至关重要的作用。它迫使系统状态在预测期结束时在一个特定的集合内取值,可以使用李亚普诺夫稳定性来分析、证明每次局部迭代的稳定性。例如对于一个监管问题(滚动时域优化代码python 滚动时域控制原理_时域_24),和一个“衰减”因子滚动时域优化代码python 滚动时域控制原理_时域_09。上述优化问题的解使得系统在滚动时域优化代码python 滚动时域控制原理_时域_26, 滚动时域优化代码python 滚动时域控制原理_MPC_27处稳定,也就意味着系统的终端约束 (terminal constraint)为 滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_28,如图1所示。然而,全局的稳定性是没有保证的。为此,必须考虑引入terminal cost和terminal constraint。 但是,仅添加terminal constraints可能不可行,而且一般添加约束的优化问题可能会很难解决。 在许多实际情况下,在控制设计过程中不强制执行terminal constraints,而是验证了后验(如果不满足的话,则可以增加预测范围)。



滚动时域优化代码python 滚动时域控制原理_MPC_29

图1 llustration of the terminal constraint set(Ω)


  此外,RHC的最大挑战就是递归可行性。尽管从理论角度绝对推荐,但由于理论或实践的影响,并不能确保可以构建预先保证递归可行性的RHC。一般来说,RHC策略缺乏递归可行性,因此即使有可能找到可行的状态,但最优控制动作将状态向量移动到RHC优化问题不可行的点。虽然一般的可行性分析方法是非常具有挑战性的,但对于特定的情况可能存在强大的工具可以用来求解。例如对于线性系统,可以使用Farkas的引理与双层编程(bilevel programming)结合来搜索缺乏递归可行性的有问题的初始状态。

1.2 线性模型预测控制 Linear Model Predictive Control

滚动时域优化代码python 滚动时域控制原理_MPC_30来表示模型的误差。 利用观测器(observer)对稳态下的扰动进行估计。本小节将简要讨论观测器的设计和干扰模型。

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_31

滚动时域优化代码python 滚动时域控制原理_MPC_32是代价函数,滚动时域优化代码python 滚动时域控制原理_无人机_33是参考状态序列,滚动时域优化代码python 滚动时域控制原理_MPC_34滚动时域优化代码python 滚动时域控制原理_MPC_35分别是控制输入序列和稳态输入序列,滚动时域优化代码python 滚动时域控制原理_MPC_36是扰动模型,滚动时域优化代码python 滚动时域控制原理_时域_37是外部干扰,滚动时域优化代码python 滚动时域控制原理_无人机_38滚动时域优化代码python 滚动时域控制原理_时域_39是正多面体(polyhedra)。扰动模型的选择不是一项简单的任务,它取决于所考虑的系统和预期扰动的类型。优化问题定义为

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_40

其中滚动时域优化代码python 滚动时域控制原理_时域_41是对状态错误的惩罚,滚动时域优化代码python 滚动时域控制原理_时域_42是对控制输入的惩罚,滚动时域优化代码python 滚动时域控制原理_MPC_43是对控制变化率的惩罚,滚动时域优化代码python 滚动时域控制原理_模型预测控制_44是对终端状态误差的惩罚。

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python步时,其稳定性和可行性保证是值得商榷的。理论上,随和预测步长的增加,有利于提高控制器的稳定性和可行性,但计算量会随之增加,而对于空中机器人应用来说,需要在计算能力有限的平台上进行计算,并对机器人进行快速控制。可以通过选择终端代价滚动时域优化代码python 滚动时域控制原理_模型预测控制_44和终端约束滚动时域优化代码python 滚动时域控制原理_时域_39来确保闭环的稳定性和可能性。在本章中,我们更多的关注终端权值P的选择,因为它比较容易计算,而终端约束通常比较困难,其在有足够长的预测范围的情况下可以实现实际的稳定性。

滚动时域优化代码python 滚动时域控制原理_时域_48。在成本函数中
(4),滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_49为上一个时间步长应用于系统的实际控制输入。

滚动时域优化代码python 滚动时域控制原理_时域_37来捕获建模误差,可以实现无偏置参考跟踪(offset-free reference tracking)。假设我们想跟踪系统输出滚动时域优化代码python 滚动时域控制原理_时域_51,实现稳态偏移无偏置追踪滚动时域优化代码python 滚动时域控制原理_模型预测控制_52。可以用下面这个简单的观察者来估计这种干扰

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_53

其中滚动时域优化代码python 滚动时域控制原理_MPC_54滚动时域优化代码python 滚动时域控制原理_时域_55分别是状态和外部干扰的预估,滚动时域优化代码python 滚动时域控制原理_MPC_56滚动时域优化代码python 滚动时域控制原理_MPC_57是观测器增益,滚动时域优化代码python 滚动时域控制原理_时域_58是时间滚动时域优化代码python 滚动时域控制原理_时域_14时的测量输出。

滚动时域优化代码python 滚动时域控制原理_MPC_60和稳定状态时输入滚动时域优化代码python 滚动时域控制原理_模型预测控制_61的状态:
滚动时域优化代码python 滚动时域控制原理_模型预测控制_62

1.3 非线性模型预测控制 Nonlinear Model Predictive Control

  飞行器的行为可以用一组非线性微分方程来更好地描述,以便更好的捕捉空气动力和耦合效应。因此,在本小节中,我们将介绍非线性MPC背后的理论,其涉及整个系统动力学,并且在轨迹追踪方面表现出更好的效果。非线性MPC的优化问题如式(7)所示。

滚动时域优化代码python 滚动时域控制原理_时域_63

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_64进行离散化处理。不等式约束和控制动作在同一时间网格上离散化。在每次迭代中求解一个附加的连续性约束的边值问题(Boundary Value Problem, BVP)。由于系统动力学的性质和施加的约束,优化问题成为一个非线性程序(NLP)。该问题的求解采用序列二次规划(Sequential Quadratic Programming, SQP)技术,其中二次规划(Quadratic Programs, QPs)的求解采用主动集方法,使用qpOASES求解器。

1.4 线性鲁棒模型预测控制 Linear Robust Model Predictive Control

  尽管MPC公式具有鲁棒性,但是存在存在鲁棒控制变量时需要进一步的鲁棒性保证。线性鲁棒模型预测控制(Robust Model Predictive Control, RMPC)问题可以表述为一个明确求解的极大极小优化问题。作为一个最优度量,我们可以选择最小峰值性能度量(MPPM)的已知鲁棒性。图2概述了相关的构建块。



滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_65

图2 Overview of the explicit RMPC optimization problem functional components


  在这种RMPC方法中,可以考虑以下系统动力学的线性时不变表示:

滚动时域优化代码python 滚动时域控制原理_MPC_66
其中滚动时域优化代码python 滚动时域控制原理_时域_67滚动时域优化代码python 滚动时域控制原理_时域_68干扰滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_69是已知且有界的。本文中考虑有界的干扰(滚动时域优化代码python 滚动时域控制原理_时域_70)。因此,针对上述的系统和外加干扰,可以定义成RMPC问题。下面表示所预测的输出、状态、输入和干扰的串联版本,其中滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_71表示从时间滚动时域优化代码python 滚动时域控制原理_时域_14开始的时间滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_73的值。
滚动时域优化代码python 滚动时域控制原理_时域_74
滚动时域优化代码python 滚动时域控制原理_无人机_75
滚动时域优化代码python 滚动时域控制原理_时域_76
滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_77
其中滚动时域优化代码python 滚动时域控制原理_MPC_78滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_79滚动时域优化代码python 滚动时域控制原理_模型预测控制_80。预测的状态和输出与当前状态、未来的控制输入和干扰呈线性相关,因此如下所示:
滚动时域优化代码python 滚动时域控制原理_MPC_81
其中滚动时域优化代码python 滚动时域控制原理_无人机_82滚动时域优化代码python 滚动时域控制原理_模型预测控制_83滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_84滚动时域优化代码python 滚动时域控制原理_MPC_85是堆叠的状态向量矩阵。因此,基于MPPM的RMPC问题(MPPM - RMPC)可表述为:
滚动时域优化代码python 滚动时域控制原理_模型预测控制_86

1.4.1 反馈预测 Feedback Predictions

  按照上述公式,优化问题将趋于保守,因为优化本质上计算的是开环控制序列。反馈预测是一种对遵循后退时域方法的知识进行编码的方法。为了将它们合并,必须假定一种反馈控制结构。在已知导致凸问题空间的反馈参数化中,选择如下:

1.4.2 鲁棒不确定不等式 Robust Uncertain Inequalities Satisfaction

2. 用于多旋翼系统的基于模型的轨迹跟踪控制器 Model-Based Trajectory Tracking Controller for Multi-rotor System

  在本节中,我们提出一个多转子系统的简化模型,可用于基于模型的控制来实现轨迹跟踪,并提出一个线性和非线性的模型预测控制器来实现轨迹跟踪。

2.1 多旋翼系统模型 Multirotor System Model

滚动时域优化代码python 滚动时域控制原理_时域_87(世界坐标系)和机身坐标系滚动时域优化代码python 滚动时域控制原理_模型预测控制_88来定义,如图3所示。我们用滚动时域优化代码python 滚动时域控制原理_时域_89表示坐标系滚动时域优化代码python 滚动时域控制原理_时域_87中坐标系滚动时域优化代码python 滚动时域控制原理_模型预测控制_88的原点位置,用滚动时域优化代码python 滚动时域控制原理_无人机_92表示坐标系滚动时域优化代码python 滚动时域控制原理_时域_87中坐标系滚动时域优化代码python 滚动时域控制原理_模型预测控制_88的旋转矩阵。此外,我们用滚动时域优化代码python 滚动时域控制原理_无人机_95滚动时域优化代码python 滚动时域控制原理_时域_96滚动时域优化代码python 滚动时域控制原理_模型预测控制_97来表示飞行器的横摇、俯仰和偏航角。在该模型中,我们假设一个低级的姿态控制器能够跟踪期望的横摇和俯仰滚动时域优化代码python 滚动时域控制原理_无人机_98滚动时域优化代码python 滚动时域控制原理_时域_99角,并具有一阶行为。一阶内环近似为MPC提供了充分的信息来考虑低电平控制器的行为。通过经典的系统辨识技术,可以辨识出回路的一阶参数。用于多转子系统轨迹跟踪的非线性模型如式(37)所示。



滚动时域优化代码python 滚动时域控制原理_无人机_100

图3 Illustration of the Firefly hexacopter from Ascending Technologies with attached body fixed frame B and inertial frame W


滚动时域优化代码python 滚动时域控制原理_模型预测控制_101
其中滚动时域优化代码python 滚动时域控制原理_模型预测控制_102代表无人机的速度,滚动时域优化代码python 滚动时域控制原理_时域_103是重力加速度,滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_104是质量标准化推力,滚动时域优化代码python 滚动时域控制原理_模型预测控制_105滚动时域优化代码python 滚动时域控制原理_时域_106滚动时域优化代码python 滚动时域控制原理_无人机_107表示质量归一化阻力系数,滚动时域优化代码python 滚动时域控制原理_无人机_108是外部干扰,滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_109滚动时域优化代码python 滚动时域控制原理_模型预测控制_110滚动时域优化代码python 滚动时域控制原理_模型预测控制_111滚动时域优化代码python 滚动时域控制原理_时域_112分别为滚转角和俯仰角内环行为的时间常数和增益。

  本章假设的级联控制器结构如图4所示。



滚动时域优化代码python 滚动时域控制原理_时域_113

图4 Controller scheme for multi-rotor system. n1 . . . nm are the i − th rotor speed and y is the measured vehicle state


2.2 Linear MPC

  在本小节中,我们将展示如何制定一个线性MPC来实现多旋翼系统的轨迹跟踪,并将其集成到ROS中。利用CVXGEN框架生成c代码求解器,求解式(3)中的优化问题。CVXGEN利用问题结构生成了一个求解凸优化问题的高速求解器。为了清晰起见,我们在这里重写了优化问题,并展示了如何使用CVXGEN生成自定义求解器。优化问题定义如下:

滚动时域优化代码python 滚动时域控制原理_MPC_114

为生成上述优化问题的求解器,CVXGEN中使用了以下问题描述。

dimensions
  m = 3 # dimension of i n p u t s .
  nd = 3 # dimension of d i s t u r b a n c e s .
  nx = 8 # dimension of s t a t e ve c t o r .
  T = 18 # horizon − 1 .
  end
 
  parameters
  A (nx,nx) # dynamics mat r ix .
  B (nx,m) # t r a n s f e r matrix .
  Bd ( nx , nd ) # di s t u r b a n c e t r a n s f e r mat r ix
  Q_x ( nx , nx ) psd # s t a t e cost , p o s i t i v e semidi f ined .
  P (nx,nx) psd # f i n a l s t a t e penal ty , p o s i t i v e semidi f ined .
  R_u (m,m) psd # input penal ty , p o s i t i v e semidi f ined .
  R_delta (m,m) psd # de l t a input penal ty , p o s i t i v e semidi f ined .
  x [0] ( nx ) # i n i t i a l s t a t e .
  d (nd) # di s t u r b a n c e s .
  u_prev (m) # previous input applied to the system .
  u_max (m) # input ampl i tude l i m i t .
  u_min (m) # input ampl i tude l i m i t .
  x_ss [ t ] ( nx ) , t =0. .T+1 # r e f e r e n c e s t a t e .
  u_ss [ t ] (m) , t =0. .T # r e f e r enc e input .
end

variables
  x [ t ] ( nx ) , t =1. .T+1 # s t a t e .
  u [ t ] (m) , t =0. .T # input .
  end
 
  minimize
  quad ( x[0]−x_ss [0] , Q_x) + quad ( u[0]−u_ss [0] , R_u) + quad ( u [0] −
u_prev , R_del ta ) + sum[ t =1 . .T] ( quad ( x [ t ]−x_ss [ t ] , Q_x) + quad (
u [ t ]−u_ss [ t ] , R_u) + quad ( u [ t ] − u [ t −1] , R_delta ) )+quad ( x [T+1]−
x_ss [T+1] , P)
  s u b j e c t to
  x [ t +1] == A∗x [ t ] + B∗u [ t ] + Bd∗d , t=0..T # dynamics
  u_min <= u [ t ] <= u_max , t = 0 . .T # input c o n s t r a i n t .
end

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_109滚动时域优化代码python 滚动时域控制原理_模型预测控制_110滚动时域优化代码python 滚动时域控制原理_模型预测控制_111滚动时域优化代码python 滚动时域控制原理_时域_112,以及离散系统模型A,B,Bd的推导。

3.2.1 姿态环参数辨识 Attitude Loop Parameters Identification

  如果不了解无人机上上使用的姿态控制器,则建议进行姿态环识别。 许多市售平台就是这种情况。 姿态命令和实际无人机姿态(使用运动捕捉系统(如果可用)或惯性测量单元(IMU)估算)均带有准确的时间戳记。 通常收集两个数据集,一个用于参数估计,另一个用于验证目的。

  要使用可用脚本进行参数识别,请遵循以下步骤:

  1. 准备系统,并确保您能够记录带时间戳的姿态命令和实际无人机姿态。
  2. 执行飞行,将命令和无人机姿态记录在包文件中。 在飞行过程中,尽可能的激活无人机的每个轴。
  3. 重复飞行测试以收集验证数据集。
  4. 在提供的脚本中设置正确的包文件名和主题名称,然后运行它。
  5. 控制器参数将以确认百分比显示在屏幕上,以确认标识的有效性。

3.2.2 线性化、解耦和离散化 Linearization, Decoupling and Discretization

滚动时域优化代码python 滚动时域控制原理_时域_119)的情况下,这时可以近似计算悬停状态下的飞行器动力学。围绕悬停状态的线性化方程组可以写成

滚动时域优化代码python 滚动时域控制原理_无人机_120
其中状态向量滚动时域优化代码python 滚动时域控制原理_MPC_121,输入向量滚动时域优化代码python 滚动时域控制原理_模型预测控制_122,干扰向量滚动时域优化代码python 滚动时域控制原理_时域_123。公式(38)中三个矩阵分别对应连续时间模型中的滚动时域优化代码python 滚动时域控制原理_模型预测控制_124滚动时域优化代码python 滚动时域控制原理_无人机_125滚动时域优化代码python 滚动时域控制原理_无人机_126。注意,在这个线性化中,我们将姿态标记为在惯性坐标系滚动时域优化代码python 滚动时域控制原理_时域_87,以消除模型中的偏航角滚动时域优化代码python 滚动时域控制原理_时域_128。在惯性坐标系中计算姿态控制动作滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_129滚动时域优化代码python 滚动时域控制原理_时域_130,然后绕滚动时域优化代码python 滚动时域控制原理_MPC_131轴旋转将姿态控制动作转化为机体框架。机体框架滚动时域优化代码python 滚动时域控制原理_模型预测控制_88中的控制作用为

滚动时域优化代码python 滚动时域控制原理_模型预测控制_133

  在计算控制输入后,建议加入前馈项来补偿耦合效应,以获得更好的跟踪性能。为了补偿非零姿态对推力的影响,实现更好的动态轨迹跟踪,采用了以下补偿方案。

滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_134
其中滚动时域优化代码python 滚动时域控制原理_时域_135滚动时域优化代码python 滚动时域控制原理_时域_136滚动时域优化代码python 滚动时域控制原理_MPC_137是机体坐标系下期望轨迹加速度,带波浪符号的量是实际应用的控制输入。

  由于控制器是在离散时间内实现的,因此有必要对系统动力学进行离散化(39)。这可以如下所示
滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_138
其中滚动时域优化代码python 滚动时域控制原理_时域_15为采样时间。终端代价滚动时域优化代码python 滚动时域控制原理_模型预测控制_44矩阵的计算是通过迭代求解代数Riccati方程来完成的。

2.2.3 ROS集成 ROS Integration

  在ROS中集成求解器时,通常需要创建一个ROS节点来将控制器连接到ROS环境,而控制器、估计器和其他组件实现为c++共享库,在编译时链接到节点。控制器节点将无人机状态作为nav里程计消息,并封装成自定义消息类型RollPitchYawRateThrust。规划出的轨迹可以发送到ROS主题MultiDOFJointTrajectory上,也可以作为单个PoseStamped类型的轨迹点。将整个预期轨迹传递给单个点的优势在于,MPC可以考虑未来的预期轨迹并做出相应的反应。图5通过ros图概述了节点和话题之间的通信关系。



滚动时域优化代码python 滚动时域控制原理_时域_141

图5 ROS graph diagram showing various nodes and topics to control multi-rotor system


  控制器每次接收到新的里程计消息时,就计算并发布一个控制动作。因此,这就需要状态估计器以期望的控制速率发布里程测量信息。我们推荐控制器使用多传感器融合的模块化框架(Modular Framework for MultiSensor Fusion)。在实现这种控制器时,需要尽可能地减少循环中的延迟。例如可以通过ROS:: transporthents()ros::TransportHints()来发送数据给里程计话题的订阅者。

  控制器节点发送以下消息:

  1. Current desired reference as tf.


滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_142

图6 Through dynamic reconfiguration it is possible to change the controller parameters online for tuning purposes


  1. Desired trajectory as rviz marker.
  2. Predicted vehicle state as rviz marker.

可以通过修改图6中的参数来动态修改控制器的参数。控制器的开源代码连接为https://github.com/ethz-asl/mav_control_rw.



滚动时域优化代码python 滚动时域控制原理_时域_143

图7 Aggressive trajectory tracking performance using linear MPC controller running onboard of Firefly hexacopter from Ascending Technologies


2.2.4 实验结果 Experimental Results

为了验证控制器的性能,我们追踪一段轨迹。控制器运行在上Ascending Technologies (AscTec)的一架Firefly六轴无人机上,机载一台NUC i7计算机。采用外部运动捕捉系统Vicon作为姿态传感器,利用多传感器融合框架(MSF)将其与车载仿真系统融合。控制器运行在100Hz,预测的时长为20步。图7展示了控制器的追踪性能。

2.3 Nonlinear MPC

  在本小节中,我们利用无人机的非线性模型设计连续时间非线性模型预测控制器。用于生成非线性求解器的工具包是ACADO,它能够为一般的最优控制问题OCP(optimal control problems)快速生成C语言求解器。优化问题可以写成

滚动时域优化代码python 滚动时域控制原理_模型预测控制_144

  为了生成上述优化问题的求解器,在ACADO的Matlab界面中使用下面的问题描述。

1 c l c ;
2 c l e a r a l l ;
3 close a l l ;
4
5 Ts = 0 . 1 ; %sampling time
6 EXPORT = 1 ;
7
8 D i f f e r e n t i a l S t a t e p o s i t i o n (3) ve l o c i t y (3) r o l l p i t c h yaw;
9 Control r o l l _ r e f p i t c h _ r e f t h r u s t ;
10
11 %online data r epr e s ent data t h a t can be pa s s ed to the s o l v e r online .
12 OnlineData r o l l _ t a u ;
13 OnlineData r o l l _ g a i n ;
14 OnlineData p i t c h _ t a u ;
15 OnlineData pi t c h _ g a i n ;
16 Onl ineData yaw_rate_command ;
17 OnlineData dr a g _ c o e f f i c i e n t (3) ;
18 OnlineData e x t e r n a l _ d i s t u r b a n c e s (3) ;
19
20 n_XD = length ( d i f f S t a t e s ) ;
21 n_U = length ( c o n t r o l s ) ;
22
23 g = [ 0 ; 0 ; 9 . 8 0 6 6 ] ;
24
25 %% Di f f e r e n t i a l Equation
26
27 %de f ine v e h i c l e body z−axi s expres sed in i n e r t i a l frame .
28 z_axis = [ ( cos (yaw) ∗ s i n ( p i t c h ) ∗cos ( r o l l )+s i n (yaw) ∗ s i n ( rol l ) ) ; . . .
29 ( s i n (yaw) ∗ s i n ( p i t c h ) ∗cos ( r o l l )−cos (yaw) ∗ s i n ( rol l ) ) ; . . .
30 cos ( p i t c h ) ∗cos ( r o l l ) ] ;
31
32 d r o l l = (1/ r o l l _ t a u ) ∗( r o l l _ g a i n ∗ r o l l _ r e f − r o l l ) ;
33 dpitch = (1/ p i t c h _ t a u ) ∗( pi t c h _ g a i n ∗ p i t c h _ r e f − p i t c h ) ;
34
35 f = dot ( [ p o s i t i o n , ve loc i ty ; r o l l ; p i t c h ; yaw] ) == . . .
36 [ ve l o c i t y . . . ;
37 z_axis ∗ t h r u s t − g − diag ( dr a g _ c o e f f i c i e n t ) ∗ v e l o c i t y +
e x t e r n a l _ d i s t u r b a n c e s ; . . .
38 d r o l l ; . . .
39 dpitch ; . . .
40 yaw_rate_command ] ;
41
42 h = [ p o s i t i o n ; ve l o c i t y ; r o l l ; p i t c h ; r o l l _ r e f ; p i t c h _ r e f ; z_axis (3) ∗
t h r u s t −g (3) ] ;
43
44 hN = [ p o s i t i o n ; ve l o c i t y ] ;
45
46
47 %% NMPCexport
48 acadoSet ( ’ problemname ’ , ’ nmpc_trajectory_tracking ’ ) ;
49
50 N = 20;
51 ocp = acado .OCP( 0.0 , N∗Ts , N ) ;
52
53 W_mat = eye ( length ( h ) ) ;
54 WN_mat = eye ( length (hN) ) ;
55 W = acado . BMatrix (W_mat ) ;
56 WN = acado . BMatrix (WN_mat) ;
57
58 ocp . minimizeLSQ ( W, h ) ;
59 ocp . minimizeLSQEndTerm ( WN, hN ) ;
60 ocp . subjectTo(−deg2rad (45) <= [ r o l l _ r e f ; p i t c h _ r e f ] <= deg2rad (45) ) ;
61 ocp . subjectTo ( g (3) /2.0 <= t h r u s t <= g (3) ∗1.5) ;
62 ocp . setModel ( f ) ;
63
64 mpc = acado . OCPexport ( ocp ) ;
65 mpc . s e t ( ’HESSIAN_APPROXIMATION’ , ’GAUSS_NEWTON’ ) ;
66 mpc . s e t ( ’DISCRETIZATION_TYPE ’ , ’MULTIPLE_SHOOTING’ ) ;
67 mpc . s e t ( ’SPARSE_QP_SOLUTION’ , ’FULL_CONDENSING_N2’ ) ;
68 mpc . s e t ( ’INTEGRATOR_TYPE’ , ’INT_IRK_GL4 ’ ) ;
69 mpc . s e t ( ’NUM_INTEGRATOR_STEPS’, N ) ;
70 mpc . s e t ( ’QP_SOLVER’ , ’QP_QPOASES’ ) ;
71 mpc . s e t ( ’HOTSTART_QP’ , ’NO’ ) ;
72 mpc . s e t ( ’LEVENBERG_MARQUARDT’, 1e−10 ) ;
73 mpc . s e t ( ’LINEAR_ALGEBRA_SOLVER’ , ’GAUSS_LU’ ) ;
74 mpc . s e t ( ’IMPLICIT_INTEGRATOR_NUM_ITS’, 4 );
75 mpc . s e t ( ’CG_USE_OPENMP’ , ’YES’ ) ;
76 mpc . s e t ( ’CG_HARDCODE_CONSTRAINT_VALUES’ , ’NO’ ) ;
77 mpc . s e t ( ’CG_USE_VARIABLE_WEIGHTING_MATRIX’ , ’NO’ ) ;
78
79
80
81 i f EXPORT
82 mpc . exportCode ( ’mav_NMPC_trajectory_tracking ’ ) ;
83
84 cd mav_NMPC_trajectory_tracking
85 make_acado_solver ( ’ . . / mav_NMPC_trajectory_tracking ’ )
86 cd . .
87 end

2.3.1 ROS集成 ROS Integration

  非线性控制器的ROS集成遵循先前介绍的线性MPC的相同准则。 可以在此处找到先前介绍的控制器的开源实现 https://github.com/ethz-asl/mav_control_rw

2.3.2 实验结果 Experimental Results

  非线性MPC的设置方式与线性MPC相同, 唯一的不同是,我们目前正在以更具波动性的(aggressive)轨迹评估控制器,如图8所示。



滚动时域优化代码python 滚动时域控制原理_滚动时域优化代码python_145

图8 Aggressive trajectory tracking performance using nonlinear MPC controller running onboard of Firefly hexacopter from Ascending Technologies


3 结论 Conclusion

在这一章中,我们概述了多种类型的无人机基于模型的控制策略。提出了多旋翼系统的鲁棒MPC、多旋翼系统的线性MPC和多旋翼系统及固定翼无人机的非线性MPC策略。这些控制策略在实际实验中进行了评价,本章给出了性能评价。所提出的控制器可作为开放源码ROS包在https://github.com/ethz-asl/mav_control_rw和https:// github.com/ethz-asl/mav_control_fw,前者是多旋翼,后者是固定翼。

原文献

  • Kamel, M. , Stastny, T. , Alexis, K. , & Siegwart, R. . (2017). Model Predictive Control for Trajectory Tracking of Unmanned Aerial Vehicles Using Robot Operating System. Robot Operating System (ROS) The Complete Reference, Volume 2. Springer International Publishing.