四旋翼无人机作为一种典型的欠驱动系统,其动力学特性复杂且具有强耦合性。在实际飞行控制中,如何实现稳定悬停和精准轨迹跟踪一直是核心难题。PD控制器因其结构简单、参数物理意义明确,成为入门级飞控算法的首选方案。
我最早接触四旋翼控制是在2015年,当时用Matlab搭建的第一个仿真模型就是基于PD控制器。虽然现在更复杂的控制算法层出不穷,但PD控制仍然是理解无人机控制原理的最佳切入点。本文将分享如何从零开始构建完整的四旋翼PD控制仿真系统。
四旋翼的六自由度动力学模型包含12个状态变量:
通过牛顿-欧拉方程推导,我们得到如下核心方程:
matlab复制% 姿态动力学方程
I * omega_dot + cross(omega, I*omega) = tau;
% 位置动力学方程
m * acc = R * [0;0;T] - [0;0;m*g];
其中I是惯性矩阵,ω是角速度向量,τ是力矩向量,R是旋转矩阵,T是总升力。这个非线性模型需要在Simulink中搭建,我通常将其分解为四个子系统:姿态动力学、位置动力学、电机模型和传感器模型。
以典型的250mm轴距穿越机为例,我的参数配置如下:
| 参数 | 值 | 单位 |
|---|---|---|
| 质量(m) | 0.65 | kg |
| 轴距(L) | 0.25 | m |
| 升力系数(k) | 1.2e-5 | N/rpm² |
| 力矩系数(b) | 2.5e-7 | Nm/rpm² |
| Ixx | 7.5e-3 | kg·m² |
| Iyy | 7.5e-3 | kg·m² |
| Izz | 1.3e-2 | kg·m² |
这些参数会显著影响控制效果。例如升力系数k的误差超过20%时,高度控制就会出现明显超调。
四旋翼采用内外环控制结构:
matlab复制% 高度控制示例
e_z = z_des - z_actual;
T = m*(g + Kp_z*e_z + Kd_z*(e_z - prev_e_z)/dt);
我习惯先用Ziegler-Nichols法初步整定参数,再通过试错法微调。一个实用的技巧是:先调俯仰/横滚,再调偏航,最后调高度,这样参数耦合影响最小。
经过数十次飞行测试,我总结的PD参数范围如下:
| 控制通道 | Kp范围 | Kd范围 | 备注 |
|---|---|---|---|
| 高度 | 8-12 | 4-6 | 需考虑重力补偿 |
| 横滚 | 1.2-1.8 | 0.15-0.25 | 响应最快但易振荡 |
| 俯仰 | 1.2-1.8 | 0.15-0.25 | 同横滚 |
| 偏航 | 0.8-1.2 | 0.1-0.2 | 响应慢但稳态误差小 |
重要提示:实际调试时要逐步增加参数值,当出现持续振荡时回退10%-15%,这是最佳工作点。
我的标准仿真流程包含以下步骤:
关键Simulink模块包括:
姿态控制器的MATLAB实现:
matlab复制function [tau_phi, tau_theta, tau_psi] = attitude_control(phi_d, theta_d, psi_d, phi, theta, psi, p, q, r, dt)
persistent prev_err_phi prev_err_theta prev_err_psi;
% 初始化持久变量
if isempty(prev_err_phi)
prev_err_phi = 0;
prev_err_theta = 0;
prev_err_psi = 0;
end
% 计算误差
err_phi = phi_d - phi;
err_theta = theta_d - theta;
err_psi = psi_d - psi;
% PD控制
Kp = [1.5; 1.5; 1.0]; % 比例增益
Kd = [0.2; 0.2; 0.15]; % 微分增益
tau_phi = Kp(1)*err_phi + Kd(1)*(err_phi - prev_err_phi)/dt;
tau_theta = Kp(2)*err_theta + Kd(2)*(err_theta - prev_err_theta)/dt;
tau_psi = Kp(3)*err_psi + Kd(3)*(err_psi - prev_err_psi)/dt;
% 更新误差
prev_err_phi = err_phi;
prev_err_theta = err_theta;
prev_err_psi = err_psi;
end
这段代码实现了离散化的PD控制,注意以下几点:
当控制量超出电机物理限幅时,系统会出现非线性特性。我的解决方法:
实测数据显示,陀螺仪噪声会导致微分项异常。应对策略:
matlab复制alpha = 0.2; % 滤波系数
filtered_rate = alpha*current_rate + (1-alpha)*prev_rate;
通过蒙特卡洛仿真发现,PD控制对质量变化最敏感。当质量增加20%时,高度控制超调量会达到35%。因此在实际应用中需要:
虽然PD控制器简单易用,但在实际工程中还需要考虑以下扩展:
matlab复制ff_term = I * omega_d_desired; % 角加速度前馈
我在最近的一个农业无人机项目中,就采用了PD+前馈的控制架构,在5m/s风速下仍能保持±0.3m的定位精度。