主要内容

基于非线性MPC的飞行机器人轨迹优化与控制

这个例子展示了如何使用非线性MPC控制器找到最优轨迹,使飞行机器人从一个地方到另一个地方的最低燃料成本。此外,在闭环仿真中,采用另一种非线性MPC控制器和扩展卡尔曼滤波器驱动机器人沿最优轨迹运动。

飞行机器人

这个例子中的飞行机器人有四个推进器来在二维空间中移动它。该模型有六种状态:

  • x (1)x质心的惯性坐标

  • x (2)y质心的惯性坐标

  • x (3)θ,机器人(推力)方向

  • x (4)vx, x的速度

  • x (5)v, y的速度

  • x (6)ω,角速度

有关飞行机器人的更多信息,请参阅[1]。本文模型使用了-1到1的两个推力。然而,这个例子假设机器人有四个物理推力,范围从0到1,以实现相同的控制自由度。

轨迹规划

机器人最初停留在(-10、-10)它的方向角是π/ 2弧度(面临北)。这个例子的飞行策略是将机器人移动并停放在最终的位置(0,0)角度为0弧度(朝东)12秒。目标是找到最优路径,使推进器在机动过程中消耗的总燃料量最小化。

非线性MPC是一种理想的轨迹规划工具,因为它解决了给定当前工厂状态的开环约束非线性优化问题。由于非线性动力学模型的可用性,MPC可以做出更准确的决策。

在本例中,目标预测时间为12秒。因此,指定的采样时间为0.4秒和预测视界30.步骤。创建一个多阶段非线性MPC对象6州和4输入。默认情况下,所有输入都是操纵变量(mv)。

t = 0.4;p = 30;nx = 6;ν= 4;nlobj = nlmpcMultistage (p nxν);nlobj。Ts = t;

对于一个路径规划问题,典型的做法是允许MPC在每个预测步骤都有自由移动,这为优化问题提供了最大数量的决策变量。由于规划通常以比反馈控制器慢得多的采样率运行,因此更大的优化问题引入的额外计算负荷是可以接受的。

使用函数名指定预测模型状态函数。你也可以使用函数句柄来指定函数。有关状态功能的详细信息请参见“打开”FlyingRobotStateFcn.m.有关指定预测模型的更多信息,请参见指定非线性MPC的预测模型

nlobj.Model.StateFcn =“FlyingRobotStateFcn”

使用函数句柄指定状态函数的雅可比矩阵。最好的做法是为预测模型提供一个解析雅可比矩阵。这样做可以显著提高模拟效率。关于雅可比函数的详细信息,打开FlyingRobotStateJacobianFcn.m

nlobj.Model.StateJacFcn = @FlyingRobotStateJacobianFcn;

一个轨迹规划问题通常涉及一个非线性成本函数,它可以用来找到最短的距离,最大的利润,或在这种情况下,最小的燃料消耗。由于推力值是燃料消耗的直接指标,因此计算燃料成本作为从阶段1到阶段p的每个预测步骤的推力值的总和。使用命名函数指定该成本函数。有关指定成本函数的更多信息,请参见为非线性MPC指定成本函数

ct = 1:p nlobj.分期(ct)。CostFcn =“FlyingRobotCostFcn”结束

机动的目标是将机器人停在(0,0)角度为012秒的弧度。将此目标指定为终端状态约束,其中最后一个预测步骤(阶段p+1)的每个位置和速度状态应该为零。有关指定约束函数的更多信息,请参见为非线性MPC指定约束条件

nlobj.Model.TerminalState = 0 (6,1);

最好的做法是为舞台成本和约束函数提供解析雅可比函数。然而,这个例子故意跳过它们,以便它们的雅可比矩阵由非线性MPC控制器使用内置的数值摄动方法计算。

每个推力都有一个操作范围01,转换成mv的上界和下界。

ct = 1:nu nlobj.MV(ct)。最小值= 0;nlobj.MV (ct)。Max = 1;结束

为机器人指定初始条件。

x0 =(-10; -10;π/ 2,0,0,0);%机器人泊位在[-10,-10],面朝北情况= 0(ν,1);推力百分比为零

最佳实践是验证用户提供的模型、成本和约束函数及其雅可比矩阵。要做到这一点,使用validateFcns命令。

validateFcns (nlobj x0,情况);
模型。StateFcn就可以了。模型。StateJacFcn就可以了。以下阶段的“CostFcn”[1 23 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30]都可以。分析了用户提供的模型、成本和约束功能。

最优状态和MV轨迹可以通过调用nlmpcmove命令一次,给定当前状态x0最后MV情况.最优成本和轨迹作为信息输出参数。

[~, ~,信息]= nlmpcmove (x0, nlobj情况);

绘制最佳轨迹。最优成本为7.8。

FlyingRobotPlotPlanning(信息,Ts);
最佳油耗= 7.797825

第一个图显示了六种机器人状态在机动过程中的最优轨迹。第二幅图显示了四个推力对应的最优MV剖面。第三个图显示了机器人的X-Y位置轨迹,从(-10 -10π/ 2)(0 0 0)

路径跟踪的反馈控制

在找到最优轨迹后,需要一个反馈控制器使机器人沿路径移动。理论上,你可以直接应用最优MV轮廓到推进器来实现前馈控制。然而,在实际应用中,需要一个反馈控制器来抑制扰动和补偿建模误差。

您可以使用不同的反馈控制技术进行跟踪。在本例中,使用一个通用的非线性MPC控制器将机器人移动到最终位置。在这个路径跟踪问题中,您跟踪所有六个状态的引用(输出的数量等于状态的数量)。

纽约= 6;nlobj_tracking = nlmpc (nx、纽约、ν);
在标准代价函数中,默认情况下对一个或多个OVs应用零权,因为mv比OVs少。

使用相同的状态函数和雅可比函数。

nlobj_tracking.Model。StateFcn = nlobj.Model.StateFcn;nlobj_tracking.Jacobian。StateFcn = nlobj.Model.StateJacFcn;

对于跟踪控制应用程序,可以通过指定更短的预测范围(不需要展望很远的未来)和控制范围(例如,在前几个预测步骤分配自由移动)来减少计算工作量。

nlobj_tracking。Ts = t;nlobj_tracking。PredictionHorizon = 10;nlobj_tracking。ControlHorizon = 4;

非线性MPC中的默认代价函数是一个适用于参考跟踪和干扰抑制的标准二次代价函数。对于跟踪,跟踪误差的优先级(对输出的惩罚权重较大)高于控制努力(对MV率的惩罚权重较小)。

nlobj_tracking.Weights。ManipulatedVariablesRate = 0.2 * 1(ν);nlobj_tracking.Weights。OutputVariables = 5 *的(nx);

为推进器输入设置相同的边界。

ct = 1:nu nlobj_tracking.MV(ct)。最小值= 0;nlobj_tracking.MV (ct)。Max = 1;结束

此外,为了减少燃料消耗,很明显u1u2在手术期间任何时候都不能阳性。因此,实现相等约束u (1) * (2)必须0用于所有预测步骤。应用类似的约束u3的愉快

nlobj_tracking.Optimization。CustomEqConFcn =...@ (X, U,数据)[U (1: end-1, 1)。* U (1: end-1, 2);U (1: end-1, 3) * U (1: end-1, 4)];

验证您的预测模型和自定义函数,以及它们的雅可比矩阵。

validateFcns (nlobj_tracking x0,情况);
模型。StateFcn就可以了。雅可比矩阵。StateFcn就可以了。没有指定输出函数。假设预测模型中的y = x。优化。CustomEqConFcn就可以了。分析了用户提供的模型、成本和约束功能。

非线性状态估计

在这个例子中,只测量了三个位置状态(x, y和角度)。速度状态是无法测量的,必须估计。使用控制系统工具箱中的扩展卡尔曼滤波器(EKF)进行非线性状态估计。

因为一个EKF需要一个离散时间模型,你使用梯形规则从x(k)过渡到x(k+1),这需要解nx非线性代数方程。欲了解更多信息,请打开FlyingRobotStateFcnDiscreteTime.m

DStateFcn = @(xk,uk,Ts) flyingrobotstatefcn离散时间(xk,uk,Ts);

测量可以帮助EKF修正其状态估计。只测量前三个状态。

DMeasFcn = @(xk) xk(1:3);

创建EKF,并表明测量结果有很小的噪声。

卡尔曼滤波器= extendedKalmanFilter (DStateFcn DMeasFcn, x0);卡尔曼滤波器。MeasurementNoise = 0.01;

跟踪控制的闭环仿真

为…模拟系统32步骤与正确的初始条件。

Tsteps = 32;xHistory = x0 ';uHistory = [];lastMV = 0(ν,1);

参考信号是规划阶段计算出的最优状态轨迹。当将这些轨迹传递给非线性MPC控制器时,可以预览当前和未来的轨迹。

Xopt = info.Xopt;Xref = [Xopt (2: p + 1,:); repmat (Xopt(最终,:),Tsteps-p, 1)];

使用nlmpcmovenlmpcmoveopt闭环仿真命令。

百巴= waitbar (0,“模拟进展”);选择= nlmpcmoveopt;k = 1: Tsteps通过传感器噪声获得工厂产量测量值。yk = xHistory(k,1:3)' + randn*0.01;正确的基于测量的状态估计。xk =正确(EKF, yk);使用参考预览计算控件移动。(英国、期权)= nlmpcmove (nlobj_tracking, xk, lastMV Xref (k: min (k + 9, Tsteps):),[],选项);%预测下一步的状态。预测(EKF、英国、Ts);%存储控制移动并更新最后一个MV为下一步。英国uHistory (k) = ';lastMV =英国;更新真实的植物状态为下一步解决%连续时间ode基于当前状态xk和输入uk。ODEFUN = @(t,xk) FlyingRobotStateFcn(xk,uk);[吹捧,你]=数值([0 t], ODEFUN xHistory (k,:));%存储状态值。: xHistory (k + 1) =你(最终:);%更新状态栏。waitbar (k / Tsteps百巴);结束关上(百巴)

比较计划的和实际的闭环轨迹。

FlyingRobotPlotTracking(信息、t、p Tsteps xHistory, uHistory);
实际油耗= 10.709242

非线性MPC反馈控制器成功地移动机器人(蓝色块),沿着最优轨迹(黄色块),并将其停在最后一个图中的最终位置(红色块)。

实际燃料成本高于计划成本。产生这个结果的主要原因是,由于我们在反馈控制器中使用了更短的预测和控制范围,与规划阶段使用的优化问题相比,每个区间的控制决策是次最优的。

参考文献

[1] y Sakawa。"利用最优控制实现自由飞行机器人的轨迹规划"最优控制应用与方法, 1999年第20卷,第235-248页。

另请参阅

|

相关的话题