基于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(u2−dϕ)θ¨=Iyl(u3−dθ)ψ¨=Iz1(u4−dψ)
其中:
- ϕ \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
(通道增益):需要与实际系统匹配
八、扩展功能建议
- 多通道解耦控制:同时控制 Roll、Pitch、Yaw 三个轴,考虑交叉耦合
- 加入干扰信号:在Plant输出中人为加入扰动,测试ADRC抗扰性能
- 非线性ADRC:对于复杂系统可尝试使用非线性ESO和SEF
- 使用PID对比实验:与传统PID控制器进行性能对比
九、总结
本文提供了一个基于MATLAB/Simulink的四旋翼无人机姿态控制系统的设计与仿真方案,重点实现了ADRC控制器。该控制器具有良好的抗扰性和鲁棒性,适合应用于不确定性强的无人机系统中。