基于matlab四旋翼无人机ADRC姿态控制器仿真

基于matlab四旋翼无人机ADRC姿态控制器仿真
模型包括无人机姿态模型、力矩方程和角运动方程。三个姿态角的数学模型,三个ADRC控制器,简洁易懂,输入可改,控制模型可自行替换其他。
在这里插入图片描述
以下文字及时示例代码仅供参考

基于MATLAB的四旋翼无人机ADRC姿态控制器仿真

以下是一个基于MATLAB/Simulink的四旋翼无人机自抗扰控制(ADRC)姿态控制器仿真实例。我们将构建一个简化的模型,实现对四旋翼无人机滚转角、俯仰角和偏航角的控制。


一、系统建模(四旋翼动力学)

四旋翼的姿态动力学可以简化为如下形式:

力学方程:

{ ϕ ¨ = l I x ( u 2 − d ϕ ) θ ¨ = l I y ( u 3 − d θ ) ψ ¨ = 1 I z ( u 4 − d ψ ) \begin{cases} \ddot{\phi} = \frac{l}{I_x}(u_2 - d_\phi) \\ \ddot{\theta} = \frac{l}{I_y}(u_3 - d_\theta) \\ \ddot{\psi} = \frac{1}{I_z}(u_4 - d_\psi) \end{cases} ϕ¨=Ixl(u2dϕ)θ¨=Iyl(u3dθ)ψ¨=Iz1(u4dψ)

其中:

  • ϕ \phi ϕ:滚转角(Roll)
  • θ \theta θ:俯仰角(Pitch)
  • ψ \psi ψ:偏航角(Yaw)
  • l l l:电机到质心的距离
  • I x , I y , I z I_x, I_y, I_z Ix,Iy,Iz:转动惯量
  • u 2 , u 3 , u 4 u_2, u_3, u_4 u2,u3,u4:对应轴上的力矩输入
  • d ϕ , d θ , d ψ d_\phi, d_\theta, d_\psi dϕ,dθ,dψ:外部扰动

二、ADRC控制器设计

ADRC(Active Disturbance Rejection Control)是一种不需要精确模型的控制方法,它通过扩张状态观测器(ESO)估计并补偿总扰动。

我们采用线性ADRC(LADRC),其结构如下:

  • 跟踪微分器(TD):平滑参考信号并提取其导数。
  • 扩张状态观测器(ESO):估计系统状态和总扰动。
  • 状态反馈控制器(SEF):根据误差进行控制律输出。

在这里插入图片描述

三、Simulink模型搭建步骤

1. 新建 Simulink 模型

打开 MATLAB,在命令行输入:

simulink

新建一个空白模型,并添加如下模块:

控制器部分:
  • Step / Signal Generator(参考输入)
  • Integrator(积分器)
  • Gain(增益)
  • Sum(加法器)
  • Transfer Function(用于模拟被控对象)
  • Scope(查看结果)
ADRC模块(需手动编写或使用S函数):
  • TD(跟踪微分器)
  • ESO(扩张状态观测器)
  • SEF(状态误差反馈)

四、MATLAB代码实现(ADRC核心算法)

下面给出一个简单的 LADRC 控制器的 M 文件实现,适用于单变量系统。

function [u] = ladrc_controller(r, y, params)
% LADRC控制器:线性ADRC控制器
%
% 输入:
%   r       - 参考输入
%   y       - 实际输出
%   params  - 参数结构体
%
% 输出:
%   u       - 控制量

persistent z1 z2 b0

if isempty(z1)
    % 初始化观测器状态
    z1 = 0;
    z2 = 0;
end

% 提取参数
w0 = params.w0;          % 观测器带宽
beta1 = params.beta1;    % ESO系数
beta2 = params.beta2;
k = params.k;            % 控制增益
b0 = params.b0;          % 控制通道增益

% 扩张状态观测器 (ESO)
e = z1 - y;
z1 = z1 + params.Ts * (b0*u_prev - beta1*e);
z2 = z2 + params.Ts * (-beta2*e);

% 控制律
u = k*(r - z1) - z2;

% 存储当前控制量供下次使用
u_prev = u;
end

⚠️ 注意:你需要将这个函数封装成 S-Function 或者在 Simulink 中使用 MATLAB Function Block 调用。


五、Simulink 模型结构图(建议)

你可以构建如下结构图:

[Step Reference] --> [LADRC Controller] --> [Plant (Transfer Function)] --> [Scope]
                             ↑
                             |
                           [y反馈]
  • Plant 使用如下传递函数表示某一轴的姿态动力学:

    G ( s ) = 1 I s 2 G(s) = \frac{1}{I s^2} G(s)=Is21

例如滚转角通道:

sys_roll = tf(1, [Ix 0 0]);

六、完整仿真脚本(初始化参数+调用Simulink)

% 定义参数
params.w0 = 100;         % ESO带宽
params.beta1 = 2*params.w0;
params.beta2 = params.w0^2;
params.k = 50;           % 控制增益
params.b0 = 1;           % 控制通道增益
params.Ts = 0.01;        % 采样时间

% 设置仿真时间
simTime = 10;

% 创建Simulink模型
modelName = 'quadcopter_ADRC_sim';
new_system(modelName);

% 添加模块
add_block('simulink/Sources/Step', [modelName '/Step']);
add_block('simulink/Continuous/Transfer Fcn', [modelName '/Plant']);
add_block('simulink/Math Operations/Gain', [modelName '/Gain']);
add_block('simulink/Math Operations/Sum', [modelName '/Sum']);
add_block('simulink/Sinks/Scope', [modelName '/Scope']);

% 设置Plant传递函数
set_param([modelName '/Plant'], 'Numerator', '[1]', 'Denominator', '[1 0 0]');

% 设置Gain为控制增益
set_param([modelName '/Gain'], 'Gain', 'params.k');

% 设置Sum端口
set_param([modelName '/Sum'], 'Inputs', '+--');

% 连接模块
add_line(modelName, 'Step/1', 'Sum/1');
add_line(modelName, 'Gain/1', 'Plant/1');
add_line(modelName, 'Plant/1', 'Scope/1');
add_line(modelName, 'Scope/1', 'Sum/2');
add_line(modelName, 'Sum/1', 'Gain/1');

% 保存模型
save_system(modelName);

% 运行仿真
sim(modelName);

七、结果分析与优化

运行仿真后,观察 Scope 中的响应曲线,分析系统的动态性能(如上升时间、超调量、稳态误差等)。可以通过调整以下参数来优化控制效果:

  • w0(ESO带宽):越大抗扰能力越强,但可能引起噪声放大
  • k(控制器增益):影响响应速度和稳定性
  • b0(通道增益):需要与实际系统匹配

八、扩展功能建议

  1. 多通道解耦控制:同时控制 Roll、Pitch、Yaw 三个轴,考虑交叉耦合
  2. 加入干扰信号:在Plant输出中人为加入扰动,测试ADRC抗扰性能
  3. 非线性ADRC:对于复杂系统可尝试使用非线性ESO和SEF
  4. 使用PID对比实验:与传统PID控制器进行性能对比

九、总结

本文提供了一个基于MATLAB/Simulink的四旋翼无人机姿态控制系统的设计与仿真方案,重点实现了ADRC控制器。该控制器具有良好的抗扰性和鲁棒性,适合应用于不确定性强的无人机系统中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值