理解PID控制原理,掌握无人机姿态PID设计、实现与调参。
u(t) = Kp·e(t) + Ki·∫e(τ)dτ + Kd·de/dt
| 分量 | 作用 | 优点 | 缺点 |
|---|---|---|---|
| P 比例 | 误差越大输出越大 | 响应快 | 稳态误差 |
| I 积分 | 累积误差消除偏移 | 消除稳态误差 | 超调/积分饱和 |
| D 微分 | 预测趋势阻尼振荡 | 减少超调 | 噪声敏感 |
class PID:
def __init__(self, kp, ki, kd, i_limit=None):
self.kp, self.ki, self.kd = kp, ki, kd
self.i_limit = i_limit
self.integral = 0.0
self.prev_error = None
def update(self, error, dt):
self.integral += error * dt
if self.i_limit:
self.integral = max(-self.i_limit, min(self.i_limit, self.integral))
derivative = 0 if self.prev_error is None else (error-self.prev_error)/dt
self.prev_error = error
return self.kp*error + self.ki*self.integral + self.kd*derivative积分饱和(Integrator Windup)是飞控常见问题!执行器达极限时积分持续累积导致超调。
抗饱和方法:1.积分限幅 2.条件积分 3.Back-calculation
Dfiltered = α·Draw + (1-α)·Dprev
目标角度: 10.0°
控制器 3秒后角度 误差 稳态误差%
-----------------------------------------------------------------
P only (Kp=0.5) 8.45 -1.5526 15.53%
PI (Kp=0.5, Ki=0.3) 5.59 -4.4111 44.11%
PID (Kp=0.5, Ki=0.3, Kd=0.08) 10.18 0.1806 1.81%
PID tuned (Kp=1.2, Ki=0.5, Kd=0.15) 10.17 0.1690 1.69%
调优PID超调量: 1.44° (14.4%)
✅ PID是姿态控制基础算法
✅ 积分限幅和微分滤波是工程关键
✅ 调参顺序P→D→I
1. 加风力扰动对比PID参数。2. 微分滤波前后控制量对比。3. Z-N方法调参。
掌握PID原理、实现与调参
PID传递函数: C(s) = Kp + Ki/s + Kd*s
# 频域指标:
# 增益穿越频率 wc: |G(jwc)| = 1
# 相位裕度 PM: 180 + angle(G(jwc))
# 增益裕度 GM: 1/|G(jwpi)|
# 无人机典型指标:
# 相位裕度 > 45度
# 增益裕度 > 6dB
# 角速度环带宽 > 20Hz, 角度环 > 5Hz
# 继电器反馈自动调参(Astrom-Hagglund)
# 1. 用继电器代替PID控制器
# 2. 系统产生极限振荡
# 3. 从振幅和周期计算Ku和Tu
# 4. 按Z-N公式计算PID参数
本课涉及的核心公式和算法需要反复练习才能真正掌握。建议通过修改仿真参数、添加扰动等方式深入理解每个参数对系统行为的影响。在实际飞行中,这些参数的选择往往需要在理论分析的基础上结合实验微调。
| 指标 | 消费级 | 工业级 | 研究级 |
|---|---|---|---|
| 姿态精度 | ±2° | ±0.5° | ±0.1° |
| 位置精度(GPS) | ±2m | ±0.5m | ±2cm(RTK) |
| 悬停精度 | ±1m | ±0.3m | ±0.05m |
| 控制频率 | 400Hz | 1kHz | 1kHz+ |
| 传感器融合 | 互补滤波 | EKF | EKF/VIO |
| 续航时间 | 20-30min | 30-45min | 视载荷而定 |
class FlightPID:
# 飞行控制器完整PID实现
def __init__(self):
# 角速度环参数
self.rate = {
'roll': PID(kp=0.15, ki=0.2, kd=0.003, i_limit=0.5),
'pitch': PID(kp=0.15, ki=0.2, kd=0.003, i_limit=0.5),
'yaw': PID(kp=0.2, ki=0.1, kd=0.0, i_limit=0.3),
}
# 角度环参数
self.angle = {
'roll': PID(kp=6.5, ki=0, kd=0, i_limit=0),
'pitch': PID(kp=6.5, ki=0, kd=0, i_limit=0),
}
def update(self, target_rates, attitude, gyro, dt):
# 自稳模式: 角度PID → 角速度目标
if self.mode == 'stabilized':
target_rates.roll = self.angle['roll'].update(
target_angles.roll - attitude.roll, dt)
target_rates.pitch = self.angle['pitch'].update(
target_angles.pitch - attitude.pitch, dt)
# 角速度PID → 力矩
torques = {
'roll': self.rate['roll'].update(
target_rates.roll - gyro.p, dt),
'pitch': self.rate['pitch'].update(
target_rates.pitch - gyro.q, dt),
'yaw': self.rate['yaw'].update(
target_rates.yaw - gyro.r, dt),
}
return torques
在实际飞控系统中,算法必须在有限的计算资源下实时运行。以下为本课核心算法的复杂度分析:
| 算法/模块 | 时间复杂度 | 空间复杂度 | 典型耗时 |
|---|---|---|---|
| 互补滤波 | O(1) | O(1) | <1μs |
| 卡尔曼滤波(15态) | O(n²) | O(n²) | ~50μs |
| EKF(15态) | O(n³) | O(n²) | ~200μs |
| 串级PID | O(1) | O(1) | <5μs |
| A*(N节点) | O(N log N) | O(N) | 1-100ms |
| RRT(N步) | O(N·K) | O(N) | 10-500ms |
| 最小snap(M段) | O(M³) | O(M²) | ~1ms |
无人机飞控是典型的实时嵌入式系统,必须满足严格的时序约束:
# 典型飞控任务优先级(高→低)
# 1. IMU采样+姿态估计 (1kHz, 优先级最高)
# 2. 角速度PID控制 (1kHz)
# 3. 姿态PID控制 (500Hz)
# 4. EKF状态更新 (200Hz)
# 5. 位置/速度控制 (100Hz)
# 6. 路径规划/避障 (10-50Hz)
# 7. 通信/日志 (1-10Hz)
# RTOS调度: 优先级抢占 + 时间片轮转
飞控软件是安全关键系统,代码质量要求极高:
# 单元测试示例
def test_pid_output():
pid = PID(kp=1.0, ki=0, kd=0)
assert pid.update(1.0, 0.01) == 1.0 # P=1*1.0
def test_pid_integral_limit():
pid = PID(kp=0, ki=1.0, kd=0, i_limit=5.0)
for _ in range(1000):
pid.update(1.0, 0.01) # 大量积分
assert abs(pid.integral) <= 5.0 # 不超过限幅
def test_kalman_convergence():
kf = KalmanFilter(...)
for _ in range(100):
kf.predict()
kf.update(measurement)
assert kf.P[0,0] < initial_P # 协方差下降
| 特性 | PX4 | ArduPilot | Betaflight |
|---|---|---|---|
| 定位 | 研究/工业 | 工业/爱好者 | 竞速穿越 |
| 代码量 | ~500K行 | ~800K行 | ~200K行 |
| 支持的机型 | 多旋翼/固定翼/VTOL | 多旋翼/固定翼/直升机/车/船 | 多旋翼/固定翼 |
| 导航能力 | 强(全面) | 强(最全面) | 弱(仅自稳) |
| 实时性 | NuttX RTOS | ChibiOS/RTOS | Bare-metal |
| 仿真支持 | SITL/Gazebo/AirSim | SITL/Gazebo | 有限 |
| 社区活跃度 | 高 | 最高 | 高(竞速圈) |
无人机系统属于安全关键(Safety-Critical)系统,设计时必须遵循以下原则:
本课所学技术在以下场景中直接应用:
将本课模块集成到完整系统时的注意事项: