MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器

这篇具有很好参考价值的文章主要介绍了MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录


前言

本示例展示了如何利用非线性模型预测控制(MPC)为四旋翼飞行器设计一个跟踪轨迹的控制器。


一、四旋翼模型

四旋翼飞行器有四个向上的旋翼。从四旋翼飞行器的质量中心出发,旋翼呈等距离的正方形排列。四旋翼飞行器动力学数学模型采用欧拉-拉格朗日方程 [1]。

四旋翼飞行器的十二种状态为

其中

  • [x,y,z]表示惯性参考系中的位置。
  • 角度位置[j,θ,ψ]分别表示滚动、俯仰和偏航。
  • 其余状态为位置和角度的速度。

四旋翼飞行器的控制输入(也称为操纵变量,用 MV 表示)是四个旋翼的角速度平方:

这些控制输入可在机身 Z 轴方向产生力、扭矩和推力。在此示例中,每个状态都是可测量的,控制输入范围限制为:

 

非线性模型预测控制器使用的预测模型包括一个状态函数(表示作为当前状态和输入函数的状态导数)和一个状态雅各布函数(分别表示状态函数相对于状态和输入的导数)。这两个函数都是通过 Symbolic Math Toolbox™ 软件建立和导出的。更多详情,请参阅为非线性模型预测控制推导四旋翼飞行器动力学(符号数学工具箱)。

调用脚本 getQuadrotorDynamicsAndJacobian 生成状态及其雅各布函数并写入文件。

getQuadrotorDynamicsAndJacobian;

getQuadrotorDynamicsAndJacobian 脚本生成以下文件:

  • QuadrotorStateFcn.m - 状态函数
  • QuadrotorStateJacobianFcn.m - 状态雅各布函数

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

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

创建一个具有 12 个状态、12 个输出和 4 个输入的非线性 MPC 对象。默认情况下,所有输入均为操纵变量 (MV)。

nx = 12;
ny = 12;
nu = 4;
nlmpcobj = nlmpc(nx, ny, nu);
Zero weights are applied to one or more OVs because there are fewer MVs than OVs.

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

nlmpcobj.Model.StateFcn = "QuadrotorStateFcn";

最佳做法是为预测模型提供分析雅各布。这样做可以大大提高仿真效率。使用函数句柄指定返回状态函数雅各布的函数。

nlmpcobj.Jacobian.StateFcn = @QuadrotorStateJacobianFcn;

 修复随机发生器种子,实现可重复性。

rng(0)

要检查 nlobj 的预测模型函数是否有效,请使用 validateFcns 对状态输入空间中的一个随机点进行检查。

validateFcns(nlmpcobj,rand(nx,1),rand(nu,1));
Model.StateFcn is OK.
Jacobian.StateFcn is OK.
No output function specified. Assuming "y = x" in the prediction model.
Analysis of user-provided model, cost, and constraint functions complete.

指定采样时间为 0.1 秒,预测范围为 18 步,控制范围为 2 步。

Ts = 0.1;
p = 18;
m = 2;
nlmpcobj.Ts = Ts;
nlmpcobj.PredictionHorizon = p;
nlmpcobj.ControlHorizon = m;

 将所有四个控制输入限制在 [0,10] 范围内。同时将控制输入变化率限制在 [-2,2] 的范围内,以防止突然和粗暴的移动。

nlmpcobj.MV = struct( ...
    Min={0;0;0;0}, ...
    Max={10;10;10;10}, ...
    RateMin={-2;-2;-2;-2}, ...
    RateMax={2;2;2;2} ...
    );

 非线性 MPC 的默认代价函数是标准二次代价函数,适用于参考跟踪和干扰抑制。在本例中,要求前 6 个状态 [x,y,z,ϕ,θ,ψ] 遵循给定的参考轨迹。由于 MV 的数量(4 个)少于参考输出轨迹的数量(6 个),因此没有足够的自由度来独立跟踪所有输出的轨迹。

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

在此示例中,MV 也有额定目标(稍后为模拟设置)。这些目标是在不需要跟踪时为保持四旋翼飞行器漂浮而设置的平均值,可能会导致 MV 和 OV 参考跟踪目标之间的冲突。要优先考虑 OV 目标,可将平均 MV 跟踪优先级设置为低于平均 OV 跟踪优先级。

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

此外,通过指定 MV 变化率的调整权重,惩罚过于激进的控制行动。

nlmpcobj.Weights.ManipulatedVariablesRate = [0.1 0.1 0.1 0.1];

三、闭环模拟

按照目标轨迹对系统进行 20 秒钟的模拟。

% Specify the initial conditions
x = [7;-10;0;0;0;0;0;0;0;0;0;0];

% Nominal control target (average to keep quadrotor floating)
nloptions = nlmpcmoveopt;
nloptions.MVTarget = [4.9 4.9 4.9 4.9]; 
mv = nloptions.MVTarget;

使用 nlmpcmove 函数模拟闭环系统,使用 nlmpcmove 对象指定模拟选项。

% Simulation duration in seconds
Duration = 20;

% Display waitbar to show simulation progress
hbar = waitbar(0,"Simulation Progress");

% MV last value is part of the controller state
lastMV = mv;

% Store states for plotting purposes
xHistory = x';
uHistory = lastMV;

% Simulation loop
for k = 1:(Duration/Ts)

    % Set references for previewing
    t = linspace(k*Ts, (k+p-1)*Ts,p);
    yref = QuadrotorReferenceTrajectory(t);

    % Compute control move with reference previewing
    xk = xHistory(k,:);
    [uk,nloptions,info] = nlmpcmove(nlmpcobj,xk,lastMV,yref',[],nloptions);

    % Store control move
    uHistory(k+1,:) = uk';
    lastMV = uk;

    % Simulate quadrotor for the next control interval (MVs = uk) 
    ODEFUN = @(t,xk) QuadrotorStateFcn(xk,uk);
    [TOUT,XOUT] = ode45(ODEFUN,[0 Ts], xHistory(k,:)');

    % Update quadrotor state
    xHistory(k+1,:) = XOUT(end,:);

    % Update waitbar
    waitbar(k*Ts/Duration,hbar);
end

% Close waitbar 
close(hbar)

四、可视化和结果

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

plotQuadrotorTrajectory;

MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器,matlab,机器人,自动驾驶,机器人控制,最优控制,模型预测控制,四旋翼飞行器 

MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器,matlab,机器人,自动驾驶,机器人控制,最优控制,模型预测控制,四旋翼飞行器 

由于 MV 的数量少于参考输出轨迹的数量,因此没有足够的自由度来独立跟踪所有 OV 的理想轨迹。

如图所示,状态 [x,y,z,j,θ,ψ] 和控制输入、

  • 状态[x,y,z]在 7 秒内与参考轨迹非常吻合。
  • 状态 [j,θ,ψ]在 9 秒内被驱动到零点附近。
  • 控制输入在 10 秒钟左右被驱动到目标值 4.9。

您可以将四旋翼飞行器的轨迹制成动画。在 7 秒内,四旋翼飞行器靠近沿参考轨迹飞行的 "目标 "四旋翼飞行器。之后,四旋翼飞行器将紧跟参考轨迹。动画在 20 秒时结束。

animateQuadrotorTrajectory;

 MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器,matlab,机器人,自动驾驶,机器人控制,最优控制,模型预测控制,四旋翼飞行器

五、结论

本例展示了如何设计用于四旋翼飞行器轨迹跟踪的非线性模型预测控制器。四旋翼飞行器的动力学和 Jacobian 是通过 Symbolic Math Toolbox 软件得出的。四旋翼飞行器能紧密跟踪参考轨迹。 

参考资料

[1] Raffo, Guilherme V., Manuel G. Ortega, and Francisco R. Rubio. "An integral predictive/nonlinear ℋ∞ control structure for a quadrotor helicopter". Automatica 46, no. 1 (January 2010): 29–39. https://doi.org/10.1016/j.automatica.2009.10.018.

[2] Tzorakoleftherakis, Emmanouil, and Todd D. Murphey. "Iterative sequential action control for stable, model-based control of nonlinear systems." IEEE Transactions on Automatic Control 64, no. 8 (August 2019): 3170–83. https://doi.org/10.1109/TAC.2018.2885477.

[3] Luukkonen, Teppo. "Modelling and control of quadcopter". Independent research project in applied mathematics, Aalto University, 2011.文章来源地址https://www.toymoban.com/news/detail-815923.html

到了这里,关于MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多旋翼无人机的软着陆,使用稳健的非线性控制和风力建模(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 Quadcopter wind SMC ground 2.2 Quadcopter wind

    2024年04月11日
    浏览(34)
  • 用于永磁同步电机驱动器的自适应SDRE非线性无传感器速度控制(Matlab&Simulink实现)

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码Simulink仿真实现 本文方法基于状态依赖的里卡蒂方程(SDRE)控制技术及其梯度型神经网络的实时计算方法,允许在线控制PMSM。 为了实现用于永磁同步电机驱动器的自适应 SDRE(State-Dependent Riccati Equation)非线性无传感

    2024年02月15日
    浏览(38)
  • MATLAB 非线性规划

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 非线性规划问题 仍是规划问题的一种,但是

    2024年02月05日
    浏览(39)
  • 【具有非线性反馈的LTI系统识别】针对反馈非线性的LTI系统,提供非线性辨识方案(Simulink&Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink仿真

    2024年02月14日
    浏览(46)
  • Matlab多元非线性函数拟合

    看了多篇文章,觉得没有一篇比较全,且可以参照的多元非线性函数拟合,看了多篇文章后总结以下内容,主要以示例给出,希望能帮助到大家快速上手。 beta = nlinfit(X, Y, modelfun, beta0) X为你的自变量,Y是因变量,modelfun是你用inline定义的函数名字,beta0是模型参数的初始值。

    2024年02月07日
    浏览(38)
  • 数学建模| 非线性规划(Matlab)

    非线性规划:约束条件和目标函数存在非线性函数。简单点说,约束条件和目标函数中至少一个决策变量不是一次方,例如三角函数、对数、多次方等。 线性规划和非线性在解决上的不同:线性规划可以有通用方法,但是非线性规划的求解是没有特定算的,只能用近似的算法

    2024年02月07日
    浏览(40)
  • Matlab 线性拟合、一维、多维度非线性拟合、多项式拟合

      线性拟合 我随便设定一个函数然后通过解方程计算出对应的系数 假设我的函数原型是 y=a*sin(0.1*x.^2+x)+b* squre(x+1)+c*x+d  拟合系数:   利用matlab实现非线性拟合(三维、高维、参数方程)_matlab多元非线性拟合_hyhhyh21的博客-CSDN博客 简单的一维的拟合: 思路: 将非线性-》线

    2024年02月12日
    浏览(41)
  • 【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

    目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 对于解决多自由度(MDOF)非线性振动问题,使用单个谐波表示是一种常见的近似方法。这种方法将系统的非线性部分在谐波振动的基础上线性化,从而简化求解过程。 以下是一个基于GUI的单谐波非线性振动问题

    2024年02月15日
    浏览(35)
  • 【基于FFT的自由响应非线性检测方案】使用归零早期FFT的非线性检测研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及详细文章

    2024年02月15日
    浏览(43)
  • matlab使用教程(22)—非线性优化函数的设置

            可以使用由 optimset 函数创建的 options 结构体来指定优化参数。然后,可以将 options 作为输入传递给优化函数,例如,通过使用以下语法调用 fminbnd x = fminbnd(fun,x1,x2,options)         或使用以下语法调用 fminsearch x = fminsearch(fun,x0,options)         例如,要显示算

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包