Matlab四旋翼无人机ADRC姿态控制器仿真 / 复现 无人机姿态模型,力矩方程,角运动方程 包含三个姿态角的数学模型,以及三个adrc控制器。

要搞定四旋翼无人机的姿态控制,ADRC(自抗扰控制)这玩意儿是真香。今天咱们直接开撸Matlab仿真,手把手实现三个姿态角的ADRC控制器。先别急着写代码,得把飞行器的"扭动规律"摸清楚。

飞行器的姿态说白了就是滚转、俯仰、偏航三个角的运动。用欧拉角描述时,角速度转换关系挺有意思:

% 角速度转换矩阵
E = [1, sin(phi)*tan(theta), cos(phi)*tan(theta);
     0, cos(phi),           -sin(phi);
     0, sin(phi)/cos(theta), cos(phi)/cos(theta)];
omega_body = E \ [p; q; r];  % 机体角速度转欧拉角速率

这矩阵看着唬人,其实就是处理机身转动和地面坐标系的关系。比如俯仰角theta接近90度时tan(theta)会炸,这也是万向节锁的老问题,不过咱们先假设在小角度范围内操作。

ADRC的核心在于扩张状态观测器(ESO),它能实时估计系统内外扰动。拿滚转角控制举例,先整跟踪微分器(TD):

function [x1, x2] = TD(v, h, T)
    persistent v1 v2
    if isempty(v1)
        v1 = 0; v2 = 0;
    end
    fh = fhan(v1 - v, v2, 100, h);
    v1 = v1 + T * v2;
    v2 = v2 + T * fh;
    x1 = v1;
    x2 = v2;
end

function y = fhan(x1, x2, r, h)
    d = r*h^2;
    a0 = h*x2;
    y = x1 + a0;
    a1 = sqrt(d*(d + 8*abs(y)));
    a2 = a0 + sign(y)*(a1 - d)/2;
    sy = (sign(y + d) - sign(y - d))/2;
    y = -r*(a2/d - sign(y))*sy - r*sign(y);
end

这个非线性函数fhan是精髓,比线性TD响应更快。参数r决定跟踪速度,h是滤波因子。调试时如果发现指令跟踪有超调,可以把r适当调小。

姿态控制最刺激的部分莫过于ESO设计。机体动力学模型可以简化为:

phi_ddot = (Mx - Kp*phi_dot)/Ix + w(t)

其中w(t)包含模型误差和外界扰动。对应的ESO写成:

function z = ESO(y, u, beta, delta, T)
    persistent z1 z2 z3
    if isempty(z1)
        z1 = 0; z2 = 0; z3 = 0;
    end
    e = z1 - y;
    fe = fal(e, 0.5, delta);
    z1 = z1 + T*(z2 - beta(1)*e);
    z2 = z2 + T*(z3 - beta(2)*fe + 0.8*u);  % 0.8是控制增益估计值
    z3 = z3 + T*(-beta(3)*fe);
    z = [z1; z2; z3];
end

function y = fal(e, alpha, delta)
    if abs(e) > delta
        y = abs(e)^alpha * sign(e);
    else
        y = e / (delta^(1 - alpha));
    end
end

beta参数需要满足带宽概念,比如取beta=[100, 300, 1000],但别照搬,得根据实际系统调。调试时盯着z3的输出,如果出现高频抖动,说明观测器带宽太高了。

最后把三个ADRC控制器并联:

for k = 1:N
    % 滚转通道
    [phi_ref, ~] = TD(phi_cmd(k), 0.01, Ts);
    z_phi = ESO(phi_actual, u_phi, [80, 200, 500], 0.01, Ts);
    e1 = phi_ref - z_phi(1);
    u0_phi = 150*fal(e1, 0.75, 0.05) - 10*z_phi(2);
    u_phi = u0_phi - z_phi(3)/0.8;
    
    % 俯仰、偏航通道结构相同
    ...
end

非线性反馈里的fal函数参数需要配合TD和ESO的带宽调整。遇到过调时别急着改增益,先检查转动惯量参数是否正确——之前有哥们把Ixx单位搞错成kg·m²,结果控制器直接抽风。

仿真结果跑起来后,能看到典型的ADRC响应曲线:超调小于5%,上升时间0.3秒左右。故意加个20%的力矩扰动,估计器z3会在0.1秒内捕获扰动并补偿。调参秘诀就一句话:ESO带宽要比系统动态高3~5倍,但别超过采样频率的1/3。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐