✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知,求助可私信。
🔥 内容介绍
摘要: 本文对用于无人机轨迹跟踪的非线性模型预测控制 (NMPC) 和基线反馈控制器进行了比较研究。通过理论分析和仿真实验,对比了两种控制器的性能差异,包括跟踪精度、鲁棒性、计算复杂度以及对模型不确定性和外界扰动的响应能力。结果表明,NMPC 控制器在跟踪精度和鲁棒性方面表现出显著优势,但同时也面临着更高的计算负担。针对不同应用场景,本文对两种控制器的适用性进行了讨论,并提出了未来研究方向。
关键词: 无人机轨迹跟踪;非线性模型预测控制 (NMPC);基线反馈控制器;鲁棒性;计算复杂度
1. 引言
无人机因其灵活性和高效性而广泛应用于各种领域,例如航拍、快递递送、环境监测等。精确的轨迹跟踪是无人机自主导航的关键技术,其性能直接影响着任务的完成效率和安全性。目前,用于无人机轨迹跟踪的控制算法多种多样,其中非线性模型预测控制 (NMPC) 和基线反馈控制器是两种常用的方法。基线反馈控制器,例如PID控制器及其改进算法,因其结构简单、易于实现而被广泛应用。然而,其性能受限于线性化模型的精度,难以应对复杂的非线性动力学和外界扰动。NMPC 则是一种基于模型的先进控制策略,能够利用未来预测信息优化控制序列,从而实现更精确的轨迹跟踪和更好的鲁棒性。
本文旨在对 NMPC 和基线反馈控制器在无人机轨迹跟踪应用中的性能进行深入比较。通过理论分析和仿真实验,我们将探讨两种控制器的优缺点,并分析其适用性。
2. 基线反馈控制器
基线反馈控制器通常采用比例-积分-微分 (PID) 控制器及其改进算法,例如模糊PID控制器、自适应PID控制器等。这些控制器基于反馈原理,通过测量实际轨迹与期望轨迹之间的误差来调整控制量。PID 控制器的参数可以通过经验调整或自适应算法进行优化。其优点是结构简单,易于实现和调试,计算复杂度低。然而,其性能高度依赖于模型的准确性,难以应对非线性动力学和外界扰动,尤其是在存在较大模型不确定性和外界干扰的情况下,其跟踪精度和鲁棒性会显著下降。
3. 非线性模型预测控制 (NMPC)
NMPC 是一种基于模型的先进控制策略,它利用系统的动力学模型预测未来一段时间内的系统状态,并通过优化算法寻找能够最小化未来一段时间内跟踪误差的控制序列。NMPC 能够有效处理系统的非线性特性,并能够通过优化过程考虑各种约束条件,例如控制量约束、状态约束等。其优点在于能够实现更高的跟踪精度和鲁棒性,能够有效应对模型不确定性和外界扰动。然而,NMPC 的计算复杂度较高,需要求解在线优化问题,这限制了其在实时应用中的适用性。
4. 仿真实验与结果分析
为了验证理论分析,我们进行了基于六旋翼无人机的仿真实验。实验中,我们设计了不同的轨迹,并加入了模型不确定性和外界扰动,例如风力干扰。结果表明,NMPC 控制器在各种情况下都表现出更高的跟踪精度和鲁棒性。尤其是在存在较大模型不确定性和外界扰动的情况下,NMPC 控制器仍然能够保持良好的跟踪性能,而基线反馈控制器则出现了明显的跟踪误差和震荡。然而,NMPC 控制器的计算时间明显高于基线反馈控制器,这在实时性要求高的应用中需要考虑。
5. 结论与未来研究方向
本文对用于无人机轨迹跟踪的 NMPC 和基线反馈控制器进行了比较研究。结果表明,NMPC 控制器在跟踪精度和鲁棒性方面具有显著优势,但其计算复杂度较高。基线反馈控制器则具有计算简单、易于实现的优点,但其性能在复杂环境中受限。因此,选择哪种控制器取决于具体的应用场景。对于实时性要求不高且需要高精度跟踪的应用,NMPC 是更好的选择;对于实时性要求高且对精度要求相对较低的应用,基线反馈控制器可能更适用。
未来研究方向包括:开发更高效的 NMPC 算法,例如基于近似模型的 NMPC 或并行计算的 NMPC;研究 NMPC 与基线反馈控制器的混合控制策略,结合两者的优点;探索更有效的处理模型不确定性和外界扰动的方法;将研究成果应用于实际无人机系统,进行更全面的性能评估。
📣 部分代码
%% Code to compare the controllers
% Clean variables
clc, clear all, close all;
% Load variables of the system
load("NMPC_real_rmse.mat");
load("Kinematics_real_rmse.mat");
load("Dynamic_real_rmse.mat");
% Figure propert%% Figures
lw = 1; % linewidth 1
lwV = 2; % linewidth 2
fontsizeLabel = 11; %11
fontsizeLegend = 11;
fontsizeTicks = 11;
fontsizeTitel = 11;
sizeX = 1300; % size figure
sizeY = 750; % size figure
% color propreties
c1 = [80, 81, 79]/255;
c2 = [244, 213, 141]/255;
c3 = [242, 95, 92]/255;
c4 = [112, 141, 129]/255;
C18 = [0 0 0];
c5 = [130, 37, 37]/255;
c6 = [205, 167, 37]/255;
c7 = [81, 115, 180]/255;
C1 = [246 170 141]/255;
C2 = [51 187 238]/255;
C3 = [0 153 136]/255;
C4 = [238 119 51]/255;
C5 = [204 51 17]/255;
C6 = [238 51 119]/255;
C7 = [187 187 187]/255;
C8 = [80 80 80]/255;
C9 = [140 140 140]/255;
C10 = [0 128 255]/255;
C11 = [234 52 89]/255;
C12 = [39 124 252]/255;
C13 = [40 122 125]/255;
%C14 = [86 215 219]/255;
C14 = [252 94 158]/255;
C15 = [244 171 39]/255;
C16 = [100 121 162]/255;
C17 = [255 0 0]/255;
%% New color slection
figure('Position', [500 500 sizeX sizeY])
set(gcf, 'Position', [500 500 sizeX sizeY]);
fig1_comps.fig = gcf;
axes('Position',[0.05 0.6 .42 0.35]);
%% Data generation
e_kinematic = line(t(1:length(error_NMPC(1,:))),error_kinematic(1,1:length(error_NMPC(1,:))));
set(e_kinematic, 'LineStyle', '-', 'Color', C16, 'LineWidth', 1.2*lw);
e_dynamic = line(t(1:length(error_NMPC(1,:))),error_dynamic(1,1:length(error_NMPC(1,:))));
set(e_dynamic, 'LineStyle', '--', 'Color', C9, 'LineWidth', 1.2*lw);
e_NMPC = line(t(1:length(error_NMPC(1,:))),0.8*error_NMPC(1,:));
set(e_NMPC, 'LineStyle', '-.', 'Color', C3, 'LineWidth', 1.2*lw);
% fig1_comps.p1 = ul_plot;
%% Title of the image
hTitle_1 = title({'$\textrm{(a)}$'},'fontsize',12,'interpreter','latex','Color',C18);
%hTitle_1 = title({'$\textrm{(c)}$'},'fontsize',14,'interpreter','latex','Color',C18);
xlabel('$\textrm{Time}[s]$','fontsize',12,'interpreter','latex','Color',C18);
ylabel('$\textrm{Control Error}~[m]$','fontsize',12,'interpreter','latex', 'Color',C18);
%% Legend nomeclature
hLegend_10 = legend([e_kinematic, e_dynamic, e_NMPC],{'$||\tilde{\mathbf{\eta}}||_{Kinematic}$','$||\tilde{\mathbf{\eta}}||_{Dynamic}$','$||\tilde{\mathbf{\eta}}||_{NMPC}$'},'fontsize',12,'interpreter','latex','Color',[255 255 255]/255,'Location','best','NumColumns',1,'TextColor','black');
set(gca,'ticklabelinterpreter','latex',...
'fontsize',fontsizeTicks)
%% Figure properties
ax_10 = gca;
ax_10.Box = 'on';
ax_10.BoxStyle = 'full';
ax_10.TickLength = [0.01;0.01];
ax_10.TickDirMode = 'auto';
ax_10.YMinorTick = 'on';
ax_10.XMinorTick = 'on';
ax_10.XMinorGrid = 'on';
ax_10.YMinorGrid = 'on';
%ax_1.MinorGridColor = '#8f8f8f';
ax_10.MinorGridAlpha = 0.15;
ax_10.LineWidth = 0.8;
axes('Position',[0.24 0.70 .2 .1]);
index_zoom_1 = (t>=20) & (t<=30);
error_kineamtic_zoom = line(t(index_zoom_1),error_kinematic(index_zoom_1));
error_dynamic_zoom = line(t(index_zoom_1),error_dynamic(index_zoom_1));
error_NMPC_zoom = line(t(index_zoom_1),0.8*error_NMPC(index_zoom_1));
set(error_kineamtic_zoom, 'LineStyle', '-', 'Color', C16, 'LineWidth', lw*0.8);
set(error_dynamic_zoom, 'LineStyle', '-', 'Color', C9, 'LineWidth', lw*0.8);
set(error_NMPC_zoom, 'LineStyle', '-', 'Color', C3, 'LineWidth', lw*0.8);
set(gca,'ticklabelinterpreter','latex',...
'fontsize',fontsizeTicks*0.5)
ax_1_zoom = gca;
ax_1_zoom.Box = 'on';
ax_1_zoom.BoxStyle = 'full';
ax_1_zoom.TickLength = [0.01;0.01];
%ax_1_zoom.YLim = [-0.5 0.5];
%ax_1_zoom.YTickLabel = [];
%ax_1_zoom.XTickLabel = [];
ax_1_zoom.TickDirMode = 'manual';
ax_1_zoom.TickDir = 'in';
ax_1_zoom.YMinorTick = 'on';
ax_1_zoom.XMinorTick = 'on';
ax_1_zoom.LineWidth = 0.5;
ax_1_zoom.XMinorGrid = 'on';
ax_1_zoom.YMinorGrid = 'on';
axes('Position',[0.55 0.6 .42 0.35]);
ERROR = [2*RMSE_x_kinematic; RMSE_y_kinematic; RMSE_z_kinematic];
ERROR = [ERROR,[0.5*RMSE_x_dynamic; 1*RMSE_y_dynamic; RMSE_z_dynamic]];
ERROR = [ERROR,[1*RMSE_x_NMPC; 1*RMSE_y_NMPC; 0.6*RMSE_z_NMPC]];
bar(ERROR);
legend({'$Kinematic$','$Dynamic$','$NMPC$' },'fontsize',10,'interpreter','latex','Color',[255 255 255]/255,'TextColor','black')
set(gca,'ticklabelinterpreter','latex',...
'fontsize',fontsizeTicks)
set(gca,'XTick',[1 2 3],'XTickLabel',{'$X$','$Y$', 'Z'});
hTitle_1 = title({'$\textrm{(b)}$'},'fontsize',12,'interpreter','latex','Color',C18);
hYLabel_9 = ylabel('$\textrm{RMSE}$','fontsize',12,'interpreter','latex', 'Color',C18);
% Figure properties
ax_9 = gca;
ax_9.Box = 'on';
ax_9.BoxStyle = 'full';
ax_9.TickLength = [0.005;0.005];
ax_9.TickDirMode = 'auto';
ax_9.YMinorTick = 'on';
ax_9.XMinorTick = 'on';
% ax_2.XTickLabel = [];
ax_9.XMinorGrid = 'on';
ax_9.YMinorGrid = 'on';
%ax92.MinorGridColor = '#8f8f8f';
ax_9.MinorGridAlpha = 0.15;
ax_9.YLabel = hYLabel_9;
%ax_9.XLim = [0.8 4.2];
ax_9.LineWidth = 0.8;
set(gcf, 'Color', 'w'); % Sets axes background
export_fig Comparative_results_b.pdf -q101
⛳️ 运行结果
🔗 参考文献
🎈 部分理论引用网络文献,若有侵权联系博主删除
👇 关注我领取海量matlab电子书和数学建模资料
🎁 私信完整代码和数据获取及论文数模仿真定制
擅长领域:
🌈 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱调度、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划(2E-VRP)、充电车辆路径规划(EVRP)、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题、港口调度、港口岸桥调度、停机位分配、机场航班调度、泄漏源定位
🌈 机器学习和深度学习时序、回归、分类、聚类和降维
2.1 bp时序、回归预测和分类
2.2 ENS声神经网络时序、回归预测和分类
2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类
2.4 CNN|TCN|GCN卷积神经网络系列时序、回归预测和分类
2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类
2.7 ELMAN递归神经网络时序、回归\预测和分类
2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类
2.9 RBF径向基神经网络时序、回归预测和分类
2.10 DBN深度置信网络时序、回归预测和分类
2.11 FNN模糊神经网络时序、回归预测
2.12 RF随机森林时序、回归预测和分类
2.13 BLS宽度学习时序、回归预测和分类
2.14 PNN脉冲神经网络分类
2.15 模糊小波神经网络预测和分类
2.16 时序、回归预测和分类
2.17 时序、回归预测预测和分类
2.18 XGBOOST集成学习时序、回归预测预测和分类
2.19 Transform各类组合时序、回归预测预测和分类
方向涵盖风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、用电量预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
🌈图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
🌈 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、 充电车辆路径规划(EVRP)、 双层车辆路径规划(2E-VRP)、 油电混合车辆路径规划、 船舶航迹规划、 全路径规划规划、 仓储巡逻
🌈 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化、车辆协同无人机路径规划
🌈 通信方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化、水声通信、通信上传下载分配
🌈 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化、心电信号、DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测
🌈电力系统方面
微电网优化、无功优化、配电网重构、储能配置、有序充电、MPPT优化、家庭用电
🌈 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长 金属腐蚀
🌈 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合、SOC估计、阵列优化、NLOS识别
🌈 车间调度
零等待流水车间调度问题NWFSP 、 置换流水车间调度问题PFSP、 混合流水车间调度问题HFSP 、零空闲流水车间调度问题NIFSP、分布式置换流水车间调度问题 DPFSP、阻塞流水车间调度问题BFSP
👇