主要内容

基于非线性模型预测控制的四旋翼控制

该算例说明了如何利用非线性模型预测控制(MPC)设计四旋翼飞行器的轨迹跟踪控制器。

Quadrotor模型

四轮电机有四个转子,该转子向上。从四足电池的质心,转子放置在具有相同距离的方形形成中。四元动力学的数学模型来自euler-lagrange方程[1]。

四态的四个州是:

x y z φ. θ. ψ x ˙ y ˙ z ˙ φ. ˙ θ. ˙ ψ ˙ ]

在哪里

  • x y z ] 表示惯性系中的位置

  • 角度位置 φ. θ. ψ ] 是横摇,俯仰和偏航的顺序吗

  • 其余状态是位置和角度的速度

四旋翼的控制输入是四个旋翼角速度的平方:

ω. 1 2 ω. 2 2 ω. 3. 2 ω. 4 2 ]

这些控制输入在身体方向上产生力,扭矩和推力 z -轴。在该示例中,每个状态是可测量的,并且控制输入被约束为在[0,12]中 rad 年代 2

模型的状态函数和状态Jacobian函数是使用符号数学工具箱™软件的构建和派生。

getquadrotordynamicandandjacobian;
ans =.function_handle与价值:@quadrotorstatefcn.
ans =.function_handle与价值:@quadrotorstatejacobianfcn.

getquadrotordynamicandandjacobian.脚本生成以下文件:

  • QuadrotorStateFcn.m——状态函数

  • QuadrotorStateJacobianFcn.m- 州雅各比函数

有关任一函数的详细信息,请打开相应的文件。

设计非线性模型预测控制器

使用12个状态,12个输出创建非线性MPC对象,4输入。默认情况下,所有输入都是被操纵变量(MVS)的。

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

使用函数名指定预测模型状态函数。您还可以使用函数句柄指定函数。

nlobj.Model.StateFcn =“QuadrotorStateFcn”

使用函数句柄指定状态函数的Jacobian。最好的做法是为预测模型提供分析雅各比。这样做明显提高了模拟效率。

nlobj.jacobian.statefcn = @quadrotorstatejacobianfcn;

验证您的预测模型、自定义函数及其雅可比矩阵。

rng (0) validateFcns (nlobj,兰德(nx, 1),兰特(ν,1));
model.statefcn是好的。jacobian.statefcn还可以。没有指定输出函数。假设预测模型中的“y = x”。分析用户提供的模型,成本和约束函数完成。

指定的采样时间0.1秒,18步预测视界,2步控制视界。

ts = 0.1;p = 18;m = 2;nlobj.ts = ts;nlobj.predictionhorizo​​n = p;nlobj.controlhorizo​​n = m;

限制所有四个控制输入在范围[0,12]。

nlobj.mv = struct(“最小值”,{0; 0; 0; 0},“马克斯”,{12; 12; 12; 12});

非线性MPC中的默认成本功能是适用于参考跟踪和干扰抑制的标准二次成本函数。在这个例子中,前6个州 x y z φ. θ. ψ ] 都需要遵循给定的参考轨迹。由于MVs(4)的数量小于参考输出轨迹(6),因此没有足够的自由度来跟踪所有输出变量(OVs)所期望的轨迹。

nlobj.Weights.OutputVariables = [1 1 1 1 1 1 0 0 0];

在该示例中,MVS还具有标称目标,以保持四轮电机浮动,这可能导致MV和OV参考跟踪目标之间的冲突。要优先考虑目标,请将平均MV跟踪优先级设置为低于平均OV跟踪优先级的平均MV跟踪优先级。

nlobj.Weights.ManipulatedVariables = [0.1 0.1 0.1 0.1];

另外,通过指定MV变化率的调优权重来惩罚激进的控制操作。

nlobj.weights.manipuldvariablesrate = [0.1 0.1 0.1];

闭环仿真

使用目标轨迹模拟系统20秒。

%指定初始条件x = [7, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);%标称控制,使四轮压力机浮动nloptions = nlmpcmoveopt;nloptions。MVTarget = [4.9 4.9 4.9 4.9];mv = nloptions.MVTarget;

仿真闭环系统使用nlmpcmove函数,使用一个指定模拟选项nlmpcmove目的。

时间= 20;百巴= waitbar (0,'模拟进度');xhistory = x';lastmv = mv;Uhistory = lastmv;k = 1 :(持续时间/ TS)%设置预览的引用t = linspace(k*Ts, (k+p-1)*Ts,p);yref = QuadrotorReferenceTrajectory (t);%计算控件使用参考预览移动。xk = xhistory(k,:);[英国,nloptions,信息] = nlmpcmove(nlobj,xk,lastmv,yref',[],nloptions);Uhistory(k + 1,:) =英国';Lastmv =英国;%更新状态。Odefun = @(t,xk)quadrotorstatefcn(XK,英国);[tout] = ode45(odefun,[0 ts],xhistory(k,:)');xhistory(k + 1,:) = yout(结束,:);waitbar(k * ts / duration,hbar);结束关闭(HBAR)

可视化和结果

绘制结果,并比较计划和实际闭环轨迹。

plotquadrotortroratory;

图状态包含6个轴。标题为Qruadrotor x位置的轴1包含2个类型为line的对象。这些对象代表实际的引用。标题为Qruadrotor y位置的轴2包含2个类型为line的对象。这些对象代表实际的引用。标题为Qruadrotor z位置的轴3包含2个类型为line的对象。这些对象代表实际的引用。轴4与标题四转子phi角包含2个对象的类型线。这些对象代表实际的引用。轴5与标题Qruadrotor角包含2个对象的类型线。 These objects represent actual, reference. Axes 6 with title Qruadrotor psi angle contains 2 objects of type line. These objects represent actual, reference.

图控制输入包含4个轴。标题为输入1的轴1包含2个类型为stair, line的对象。这些对象代表实际的引用。标题为Input 2的Axes 2包含2个类型为stair, line的对象。这些对象代表实际的引用。标题为Input 3的Axes 3包含2个类型为stair, line的对象。这些对象代表实际的引用。带有标题输入4的轴4包含2个类型为stair, line的对象。这些对象代表实际的引用。

因为MV的数量小于参考输出轨迹的数量,所以没有足够的自由度来跟踪所有OV的所需轨迹。

如州的图所示 x y z φ. θ. ψ ] 和控制输入,

  • 美国 x y z ] 在7秒内非常密切地匹配参考轨迹。

  • 美国 φ. θ. ψ ] 会在9秒内被驱至零附近。

  • 控制输入​​被驱动到目标值4.9左右10秒。

您可以为四元流器的轨迹设置动画。四轮电路机靠近沿7秒内沿着参考轨迹行进的“目标”四足电池移动。之后,四轮压力机紧密遵循参考轨迹。动画终止于20秒。

Animatequadrotortororatory;

图QuadrotorAnimation包含2个轴。坐标轴1包含22个类型为line, patch, text的对象。axis 2包含22个类型为line, patch, text的对象。

结论

此示例显示了如何设计用于轨迹跟踪的非线性模型预测控制器。使用符号数学工具箱软件导出了四元电机的动态和雅典人。Quadrotor密切追踪参考轨迹。

参考

[1] T. Luukkonen,四轴飞行器的建模与控制,埃斯波应用数学的独立研究项目:2011年Aalto University。

E. Tzorakoleftherakis和T. D. murphy。基于模型的非线性系统稳定控制的迭代顺序动作控制自动控制学报(2018)。

另请参阅

||

相关话题