1. 四旋翼无人机控制基础与PD控制器设计
四旋翼无人机作为典型的欠驱动系统,其控制问题一直是研究热点。我曾在多个实际项目中验证过,PD控制器虽然结构简单,但在姿态控制场景下表现优异。以AscTec Pelican这类商业级无人机为例,其核心控制逻辑往往就建立在PD控制框架上。
1.1 动力学模型关键参数解析
四旋翼的刚体动力学模型中,有几个参数对控制性能影响显著:
-
转动惯量矩阵:Ixx=8.1e-3 kg·m²,Iyy=8.1e-3 kg·m²,Izz=14.2e-3 kg·m²。这三个值的不对称性导致偏航轴(Z轴)的控制响应会明显慢于横滚/俯仰轴。在实际调参时,我通常会将偏航环的微分增益提高20%-30%来补偿这种惯性差异。
-
推力系数:b=54.2e-6 N·s²。这个看似微小的数值直接决定了电机转速与升力的转换关系。通过实验测得,在标准大气压下,单个电机转速达到12000 RPM时才能产生约4.8N的升力,这解释了为什么四旋翼需要高转速电机。
-
桨距系数:d=1.1e-6 N·m·s²。该参数与反扭矩直接相关,在偏航控制中起关键作用。根据我的实测数据,当两个电机正转、两个反转时,d值的微小偏差会导致明显的偏航漂移,这也是为什么商业飞控都要做精确的电机配对校准。
1.2 PD控制器的离散化实现
在嵌入式系统中,我们需要将连续的PD控制律离散化。以横滚角控制为例,其离散化实现通常采用后向差分法:
matlab复制% 离散PD控制器实现示例
function [u, prev_error] = discrete_pd_controller(error, prev_error, Kp, Kd, dt)
derivative = (error - prev_error) / dt;
u = Kp * error + Kd * derivative;
prev_error = error; % 更新误差记录
end
实际工程中需要注意:微分项会放大高频噪声,我通常会添加一个低通滤波器(截止频率约50Hz)来抑制传感器噪声的影响。滤波器的相位延迟需要在调参时予以补偿。
2. 双环控制架构的工程实现细节
2.1 内环姿态控制实现
姿态环需要处理来自IMU的原始数据。以横滚角控制为例,完整的信号处理流程包括:
- 传感器融合:将陀螺仪(高频但易漂移)与加速度计(低频但稳定)的数据通过互补滤波器融合。我的经验参数是取陀螺仪权重0.98,加速度计0.02:
matlab复制% 互补滤波器实现
function angle = complementary_filter(gyro_rate, accel_angle, dt, alpha)
angle = alpha * (angle + gyro_rate * dt) + (1-alpha) * accel_angle;
end
- 误差计算:注意角度归一化到[-π, π]范围,避免跨π跳变导致的控制异常。我常用以下处理方式:
matlab复制function normalized_error = angle_error(desired, actual)
error = desired - actual;
normalized_error = mod(error + pi, 2*pi) - pi; % 归一化到[-π, π]
end
- 控制量分配:将控制力矩转换为电机转速指令时,需要考虑电机非线性。我的做法是建立推力-转速查找表,实测某款电机的推力曲线如下:
| 转速(RPM) | 推力(N) |
|---|---|
| 5000 | 0.85 |
| 8000 | 2.18 |
| 10000 | 3.41 |
| 12000 | 4.92 |
2.2 外环位置控制设计要点
位置环输出的是姿态指令,这里有几个关键经验:
-
指令限幅:位置环输出的姿态指令必须限制在合理范围内(通常±30°),否则会导致内环失稳。我在一个农业喷洒项目中就曾因未做限幅,导致无人机在强风条件下翻覆。
-
高度控制特殊处理:高度通道需要单独处理,因为其动力学特性与水平位置不同。建议采用以下改进PD结构:
matlab复制% 高度控制器带加速度前馈
function thrust = altitude_controller(z_des, z_actual, dz_des, dz_actual, ddz_des, Kp, Kd)
error = z_des - z_actual;
derror = dz_des - dz_actual;
thrust = m*(g + ddz_des + Kp*error + Kd*derror); % 质量归一化
end
- 坐标系转换:将位置误差从惯性系转换到机体系时,需要正确的旋转矩阵。常见的错误是忽略偏航角ψ的影响:
matlab复制% 位置误差转换(二维简化版)
function body_error = inertial_to_body(error_inertial, yaw)
R = [cos(yaw) sin(yaw); -sin(yaw) cos(yaw)];
body_error = R * error_inertial';
end
3. MATLAB仿真中的关键技巧
3.1 动力学模型实现建议
在Simulink中搭建模型时,我推荐采用以下结构:
-
执行器子系统:包含电机动态模型,通常用一阶延迟近似:
matlab复制% 电机动态模型 function omega = motor_dynamics(u_cmd, omega_prev, tau, dt) omega = omega_prev + (u_cmd - omega_prev) * dt / tau; % tau为时间常数 end实测表明,普通无刷电机的时间常数τ约在0.05-0.1s之间。
-
环境扰动模型:加入风扰模型能提高仿真真实性。我常用Dryden风谱模型生成湍流:
matlab复制% 简化的离散风扰生成
function wind = dryden_wind(prev_wind, dt, intensity)
wind = prev_wind * 0.9 + randn() * intensity * sqrt(dt);
end
3.2 参数整定实战方法
基于数百次调参经验,我总结出以下PD参数整定流程:
-
先调P再调D:先将D设为0,逐步增大P直到出现持续振荡,然后取该P值的60%作为基准。
-
微分增益调节:缓慢增加D直到振荡消失,此时再适当增加10%作为余量。
-
典型参数范围参考:
- 姿态环:Kp=15-40,Kd=3-8
- 位置环:Kp=1.5-4,Kd=2-5
重要提示:不同尺寸的无人机参数差异很大。对于250mm轴距的穿越机,Kp可能需要提高到80-120才能获得足够的响应速度。
4. 实际工程中的问题排查
4.1 常见故障模式分析
根据我的现场调试记录,PD控制器常见问题包括:
-
高频振荡:表现为电机发出尖锐噪声,通常是D增益过大导致。可通过频谱分析仪观察振荡频率,若在100Hz以上,需要降低D增益或增加滤波器。
-
响应迟缓:P增益不足的表现。但要注意,单纯增大P可能导致超调,此时应同步调整D增益。
-
稳态误差:特别是高度通道的漂移。这不是PD控制器能完全解决的问题,需要考虑增加积分项或改用ADRC控制。
4.2 传感器噪声处理方案
实测数据显示,廉价的MEMS陀螺仪噪声可达0.5°/√Hz。我的降噪方案包括:
-
硬件层面:在IMU电源处添加LC滤波电路,噪声可降低30-40%。
-
软件层面:采用自适应卡尔曼滤波,其性能优于固定参数的互补滤波。一个简化的实现:
matlab复制% 简化的卡尔曼滤波实现
function [angle, bias] = kalman_filter(gyro_rate, accel_angle, dt, prev_angle, prev_bias, Q, R)
% 预测
angle = prev_angle + (gyro_rate - prev_bias) * dt;
P = Q; % 简化协方差更新
% 更新
y = accel_angle - angle;
K = P / (P + R);
angle = angle + K * y;
bias = prev_bias + K * y / dt;
P = (1 - K) * P;
end
5. 进阶改进方向
5.1 自适应PD控制实现
在载荷变化的场景下,我采用增益调度策略:
matlab复制% 基于质量估计的自适应PD
function [Kp_adj, Kd_adj] = adaptive_gains(Kp_nom, Kd_nom, mass_est, mass_nom)
ratio = mass_est / mass_nom;
Kp_adj = Kp_nom / ratio;
Kd_adj = Kd_nom / sqrt(ratio); % 阻尼比保持不变
end
5.2 与现代控制方法结合
在实际项目中,我尝试过将PD与LQR结合:用PD做内环快速响应,LQR做外环最优控制。这种混合架构在物流无人机上实现了±0.3m的定位精度。
一个可参考的LQR权重矩阵设置:
matlab复制Q = diag([10, 10, 20, 1, 1, 1]); % 位置权重>速度权重
R = diag([0.1, 0.1, 0.1]); % 控制量权重
在调试四旋翼控制系统的这些年里,我发现没有"放之四海而皆准"的最佳参数。每次更换桨叶型号或者调整电池位置,都需要重新验证控制性能。建议在每次硬件改动后,先进行开环频率响应测试,再基于新的伯德图来调整PD参数。