MATLAB/Simulink 四旋翼仿真模型 四轴无人机PID控制

四旋翼无人机悬停时像个喝醉的平衡大师,四个螺旋桨疯狂调整转速却还要保持优雅姿态。在Simulink里搭建这个模型时,我总想起小时候玩竹蜻蜓——只不过这次得用数学方程代替手掌控制。

先看这个简化版动力学模型的核心代码块:

function dx = quadcopterDynamics(t,x,u)
    % 状态量:x=[位置; 角度; 速度; 角速度]
    m = 1.2;   % 无人机质量(kg)
    g = 9.81;  % 重力加速度
    l = 0.25;  % 机臂长度(m)
    
    % 控制输入分解
    F = u(1);  % 总升力
    tau_phi = u(2);  % 滚转力矩
    tau_theta = u(3); % 俯仰力矩
    tau_psi = u(4);  % 偏航力矩
    
    % 姿态角提取
    phi = x(4);   % 滚转角
    theta = x(5); % 俯仰角
    psi = x(6);   % 偏航角
    
    % 旋转矩阵
    R = [cos(theta)*cos(psi), sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi), cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi);
         cos(theta)*sin(psi), sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi), cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi);
         -sin(theta),         sin(phi)*cos(theta),                              cos(phi)*cos(theta)];
    
    % 平动动力学
    acceleration = [0;0;-g] + (R*[0;0;F])/m;
    
    % 转动动力学
    I = diag([0.03,0.03,0.04]);  % 转动惯量
    angular_accel = inv(I)*([tau_phi;tau_theta;tau_psi] - cross([x(10);x(11);x(12)],I*[x(10);x(11);x(12)]));
    
    dx = [x(7:12); acceleration; angular_accel];
end

这段代码像调酒师手里的摇壶,把牛顿力学和旋转矩阵混在一起调制。注意第18行的旋转矩阵R,它决定了无人机姿态如何影响运动方向——当俯仰角theta不为零时,原本垂直方向的升力就会产生水平分力,这也是四旋翼能平移的秘密。

PID控制在Simulink里的实现往往充满玄学色彩。看看这个高度控制器的调参现场:

% 高度PID参数
KP_z = 0.8;   % 看到振荡就砍一半
KI_z = 0.05;  % 积分项像慢性子管家
KD_z = 0.3;   % 微分项专治手抖

% 角度环参数更加敏感
KP_angle = 4.5;  % 需要快速响应姿态变化
KI_angle = 0.0;  % 角度积分容易导致震荡
KD_angle = 0.6;   % 阻尼器担当

参数设置像在走钢丝,特别是角度环的积分项——这里直接设为零不是偷懒,而是实测发现姿态动力学本身带有积分特性,再加积分项反而会让无人机像跳踢踏舞。调参时盯着Scope窗口里的响应曲线,总在超调量和响应速度之间找平衡,像在给无人机做心脏起搏。

MATLAB/Simulink 四旋翼仿真模型 四轴无人机PID控制

当把模型丢进Simulink跑实时仿真时,常会遇到这种典型错误:

Error: Algebraic loop detected at 'quad_model/Attitude Controller/Sum'

这通常是PID控制器输出直接反馈到被控对象造成的。解决办法是在反馈回路里加个unit delay模块,相当于给系统一个时间步长的缓冲,就像让对话双方不要同时开口说话。

看着三维动画里歪歪扭扭的飞行轨迹逐渐变得稳定,突然理解到PID控制就像在四个维度上玩杂耍——升力分配模块把总推力拆解到四个电机时,其实在做一道动态的数学题:

% 控制分配矩阵
mix_matrix = [1, 1, 1, 1;   % 总升力
             1, -1, -1, 1;  % 滚转力矩
             -1, -1, 1, 1;  % 俯仰力矩
             -1, 1, -1, 1]; % 偏航力矩

% 电机指令计算
motor_speeds = mix_matrix \ [F_total; tau_phi; tau_theta; tau_psi];

这个4x4矩阵就像无人机的神经中枢,把抽象的控制指令翻译成具体电机转速。注意最后一行用反斜杠运算符求解线性方程组,比直接求逆矩阵更数值稳定——连无人机都懂得要找最优解。

当模型最终能在虚拟风中稳如老狗时,才明白所谓自动控制不过是用数学构建的巴别塔,让钢铁机械听懂了人类的指令。调参到第17版时保存的模型文件,文件名从"quadv1.slx"变成"finalfinalusethis_one.slx",大概就是工程师的浪漫吧。

Logo

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

更多推荐