四旋翼无人机的轨迹跟踪控制一直是飞行控制领域的热点问题。在实际工程应用中,PID控制器因其结构简单、参数物理意义明确、易于实现等优点,成为最常用的控制算法之一。这个项目将带你从零开始,在Simulink环境下搭建完整的四旋翼无人机PID控制系统,实现预设轨迹的精确跟踪。
我曾在多个无人机项目中采用这种控制方案,实测表明:只要参数调校得当,PID控制器完全能够满足大多数民用无人机对轨迹跟踪精度的要求。相比更复杂的控制算法,PID方案在计算资源占用和实时性方面具有明显优势。
四旋翼无人机是一个典型的欠驱动系统,具有6个自由度(位置x,y,z和姿态角φ,θ,ψ)却只有4个控制输入(4个电机的转速)。其非线性动力学方程可以表示为:
code复制ẍ = (cosφsinθcosψ + sinφsinψ)U₁/m
ÿ = (cosφsinθsinψ - sinφcosψ)U₁/m
z̈ = (cosφcosθ)U₁/m - g
φ̈ = θ̇ψ̇(Iy-Iz)/Ix + lU₂/Ix
θ̈ = φ̇ψ̇(Iz-Ix)/Iy + lU₃/Iy
ψ̈ = φ̇θ̇(Ix-Iy)/Iz + U₄/Iz
其中U₁~U₄为控制输入,l为电机到质心的距离,Ix,Iy,Iz为转动惯量。
PID控制器由比例(P)、积分(I)、微分(D)三部分组成,其连续时间形式为:
code复制u(t) = Kₚe(t) + Kᵢ∫e(t)dt + Kₚde(t)/dt
在离散化实现时,通常采用位置式算法:
code复制u(k) = Kₚe(k) + KᵢT∑e(i) + Kₚ[e(k)-e(k-1)]/T
其中T为采样周期。对于四旋翼系统,我们需要设计内外双环PID控制器:
Quadcopter_PID.slxmatlab复制% 示例:X轴加速度计算
x_ddot = (cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi))*U1/m;
code复制G(s) = 1/(0.01s+1)
matlab复制% X位置PID
Kp_x = 1.5; Ki_x = 0.01; Kd_x = 0.8;
matlab复制% Roll角PID
Kp_phi = 8; Ki_phi = 0.1; Kd_phi = 3;
code复制PID = Kp + Ki/s + Kd*s/(0.01s+1)
(注意加入滤波器防止微分噪声放大)将位置控制器输出的U₁和姿态控制器输出的U₂-U₄转换为4个电机的PWM信号:
code复制% 混控矩阵
w1 = sqrt((U1+U2+U3-U4)/4/k);
w2 = sqrt((U1-U2+U3+U4)/4/k);
w3 = sqrt((U1-U2-U3-U4)/4/k);
w4 = sqrt((U1+U2-U3+U4)/4/k);
其中k为升力系数。
| 参数 | 物理意义 | 典型范围 |
|---|---|---|
| Kp_pos | 位置比例增益 | 0.5-2.0 |
| Kd_pos | 位置微分增益 | 0.5-1.5 |
| Kp_att | 姿态比例增益 | 5-15 |
| Kd_att | 姿态微分增益 | 2-5 |
matlab复制pidTuner(sys, 'pid')
matlab复制xd = R*cos(2*pi*t/T);
yd = R*sin(2*pi*t/T);
matlab复制xd = R*sin(2*pi*t/T);
yd = R*sin(4*pi*t/T);
可能原因:
解决方案:
matlab复制% 抗饱和处理示例
if (u > umax)
u = umax;
disable_integration;
end
可能原因:
调试步骤:
可能原因:
解决方法:
matlab复制u_ff = inv(B)*x_ddot_desired;
matlab复制s = (2/T)*(z-1)/(z+1);
经过多次实测验证,这套PID控制方案在悬停和低速飞行场景下表现优异。当需要执行更复杂的机动动作时,可以考虑升级为LQR或MPC等先进控制算法。不过对于大多数应用场景,精心调校的PID控制器已经能够提供令人满意的性能表现。