1. PID基础概念:什么是PID控制?比例、积分、微分的作用与物理意义

大家好,我是你们的老朋友。今天咱们来聊聊飞控里最核心的东西——PID控制。

说实话,我入行那会儿,第一次接触PID也是一头雾水。什么比例、积分、微分,听着像天书。后来在项目里摔了几架飞机,烧了几个电调,才慢慢摸透了它的脾气。

说白了,PID就是一个“纠错”的算法。你告诉飞机“我要悬停在10米高度”,飞机一看当前高度是8米,差了2米。怎么办?它得想办法把这2米的误差给消掉。PID就是干这个活的。

PID控制核心知识体系 PID控制器 比例控制 (P) 当前误差 × 比例系数 积分控制 (I) 历史误差累加 × 积分系数 微分控制 (D) 误差变化率 × 微分系数 物理意义 “现在”的偏差 快速响应,消除当前误差 物理意义 “过去”的累积 消除静差,对抗持续扰动 物理意义 “未来”的趋势 抑制超调,增加系统阻尼

1.1 比例控制(P)—— 最直接的纠错

比例控制,就是“有多大错,使多大劲”。

举个例子:你用手托着一杯水,水杯偏左了,你就往右推。偏得越多,推的力气越大。这就是比例控制。

在飞控里,比例系数 Kp 决定了纠错的力度。Kp 越大,飞机对偏差的反应越猛。

核心公式: P_out = Kp × error

其中 error = 目标值 - 当前值

我记得有一次调一架四轴,Kp 给得太小了。飞机晃晃悠悠的,像喝醉了酒。风一吹就飘走,半天回不来。后来我把 Kp 翻了一倍,飞机立马“精神”了,一偏就回正。

实战技巧: 调 P 的时候,先把 I 和 D 设为0。慢慢加大 Kp,直到飞机出现轻微的高频抖动,然后退回20%。这个点就是 P 的甜区。

1.2 积分控制(I)—— 解决“老顽固”问题

比例控制有个毛病——它搞不定持续的偏差。

你想想看,如果飞机重心偏了,或者一直有侧风。比例控制只能根据当前误差出力,但误差一直存在,它就一直在那“较劲”。结果就是飞机永远回不到目标位置,差那么一点点。

这就是所谓的“静差”。

积分控制就是来解决这个问题的。它会把过去的误差全部加起来,算一笔“总账”。只要误差一直存在,积分项就会越来越大,直到把飞机推回目标位置。

核心公式: I_out = Ki × ∫ error dt

说白了,就是把误差随时间累积起来。

我在做植保无人机项目时遇到过一个问题:飞机满载农药时,总是往一边偏。调了半天 P,没用。后来加了点 I,飞机稳稳当当的。嗯,这就是积分的作用——对抗持续的外部扰动。

注意: 积分不是越大越好。Ki 太大,会出现“积分饱和”。飞机起飞时误差很大,积分疯狂累积,等飞机到了目标位置,积分还没消化完,结果冲过头了。这叫“超调”。

我曾经吃过这个亏,一架飞机直接翻了。后来加了积分限幅和抗饱和处理,才解决。

1.3 微分控制(D)—— 提前踩刹车

比例和积分都在“事后”纠错。微分不一样,它看的是“趋势”。

误差变化得快,说明飞机正在快速偏离目标。微分项会提前出力,阻止这个趋势。

打个比方:你开车快到路口了,看到红灯。比例控制是到了线前才猛踩刹车。微分控制是远远看到红灯就开始减速。哪个更稳?当然是后者。

核心公式: D_out = Kd × (derror / dt)

误差变化越快,微分出力越大。

微分在飞控里特别重要。它能抑制超调,让飞机更“稳”。但微分对噪声很敏感。传感器一抖,微分项就跟着乱跳。

避坑指南: 我曾经在室内用光流传感器做定位,数据噪声很大。一加微分,飞机就开始高频抖动。后来我加了低通滤波器,把传感器噪声滤掉,微分才正常工作。

所以,加 D 之前,先确认你的传感器信号够干净。

1.4 三个参数如何配合?

PID 三个参数不是孤立的。它们像一支球队,各司其职:

参数 主要作用 调大后的效果 调小后的效果
Kp 快速响应,消除当前误差 反应快,但容易抖动 反应慢,飞机“肉”
Ki 消除静差,对抗持续扰动 静差消失,但可能超调 有静差,抗风差
Kd 抑制超调,增加阻尼 飞机很“硬”,但噪声放大 超调大,容易震荡

我个人习惯的调参顺序是:先 P,再 D,最后 I

为什么?P 先把飞机稳住,D 把震荡压下去,最后用 I 把静差吃掉。这个顺序我用了十年,基本没翻过车。

1.5 一个简单的代码示例

下面是一个位置环 PID 的伪代码。实际飞控里会复杂一些,但核心逻辑就是这样:

// PID 结构体
typedef struct {
    float Kp, Ki, Kd;       // 三个系数
    float integral;         // 积分累加
    float prev_error;       // 上一次误差(用于微分)
    float output;           // 输出
} PID_Controller;

// PID 计算函数
float PID_Update(PID_Controller *pid, float target, float current) {
    float error = target - current;
    
    // 比例项
    float p_out = pid->Kp * error;
    
    // 积分项(带限幅)
    pid->integral += error;
    if (pid->integral > INTEGRAL_LIMIT) pid->integral = INTEGRAL_LIMIT;
    if (pid->integral < -INTEGRAL_LIMIT) pid->integral = -INTEGRAL_LIMIT;
    float i_out = pid->Ki * pid->integral;
    
    // 微分项
    float derivative = error - pid->prev_error;
    float d_out = pid->Kd * derivative;
    
    // 保存当前误差供下次使用
    pid->prev_error = error;
    
    // 总输出
    pid->output = p_out + i_out + d_out;
    return pid->output;
}

小提示: 注意代码里的积分限幅。这个细节很多人会忽略,但它是防止积分饱和的关键。我在实际项目中吃过亏,所以现在写代码都会加上。

1.6 总结一下

PID 控制,说白了就是三个字:快、准、稳

  • P(比例) 负责“快”——快速响应偏差
  • I(积分) 负责“准”——消除静差
  • D(微分) 负责“稳”——抑制震荡

这三个参数调好了,你的飞机就能像老司机开车一样,又稳又准。调不好嘛...嗯,我当年炸机的视频还在硬盘里存着呢。

下一节我们会聊怎么在实际飞控里调试这些参数。到时候我会分享一些我踩过的坑,保证让你少走弯路。


专注资料整理