飞控基础

🚁 第4课:PID控制器

📚 本课目标

理解PID控制原理,掌握无人机姿态PID设计、实现与调参。

1. PID控制原理

u(t) = Kp·e(t) + Ki·∫e(τ)dτ + Kd·de/dt

分量作用优点缺点
P 比例误差越大输出越大响应快稳态误差
I 积分累积误差消除偏移消除稳态误差超调/积分饱和
D 微分预测趋势阻尼振荡减少超调噪声敏感

2. 离散PID实现

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

3. 积分饱和与抗饱和

积分饱和(Integrator Windup)是飞控常见问题!执行器达极限时积分持续累积导致超调。

抗饱和方法:1.积分限幅 2.条件积分 3.Back-calculation

4. 微分滤波

Dfiltered = α·Draw + (1-α)·Dprev

5. 仿真验证

目标角度: 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%)
P-only有稳态误差,PI消除,PID最优,调优PID超调<1% ✅验证通过

6. 调参指南

Ziegler-Nichols方法

  1. 只用P,增大Kp到持续振荡→临界增益Ku
  2. 测量振荡周期Tu
  3. Kp=0.6Ku, Ki=2Kp/Tu, Kd=Kp·Tu/8

手动调参:P → D → I

7. 小结

✅ PID是姿态控制基础算法

✅ 积分限幅和微分滤波是工程关键

✅ 调参顺序P→D→I

🤔 练习

1. 加风力扰动对比PID参数。2. 微分滤波前后控制量对比。3. Z-N方法调参。

🏆 成就解锁:PID初成

掌握PID原理、实现与调参

8. 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

9. 自动调参算法

# 继电器反馈自动调参(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
控制频率400Hz1kHz1kHz+
传感器融合互补滤波EKFEKF/VIO
续航时间20-30min30-45min视载荷而定

10. PID在飞控中的完整实现

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
串级PIDO(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  # 协方差下降

开源飞控架构对比

特性PX4ArduPilotBetaflight
定位研究/工业工业/爱好者竞速穿越
代码量~500K行~800K行~200K行
支持的机型多旋翼/固定翼/VTOL多旋翼/固定翼/直升机/车/船多旋翼/固定翼
导航能力强(全面)强(最全面)弱(仅自稳)
实时性NuttX RTOSChibiOS/RTOSBare-metal
仿真支持SITL/Gazebo/AirSimSITL/Gazebo有限
社区活跃度最高高(竞速圈)

安全关键系统设计

无人机系统属于安全关键(Safety-Critical)系统,设计时必须遵循以下原则:

实战案例与行业应用

典型应用场景

本课所学技术在以下场景中直接应用:

系统集成经验

将本课模块集成到完整系统时的注意事项: