1. PID基础概念:什么是PID控制?比例、积分、微分的作用与物理意义
大家好,我是你们的老朋友。今天咱们来聊聊飞控里最核心的东西——PID控制。
说实话,我入行那会儿,第一次接触PID也是一头雾水。什么比例、积分、微分,听着像天书。后来在项目里摔了几架飞机,烧了几个电调,才慢慢摸透了它的脾气。
说白了,PID就是一个“纠错”的算法。你告诉飞机“我要悬停在10米高度”,飞机一看当前高度是8米,差了2米。怎么办?它得想办法把这2米的误差给消掉。PID就是干这个活的。
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(微分) 负责“稳”——抑制震荡
这三个参数调好了,你的飞机就能像老司机开车一样,又稳又准。调不好嘛...嗯,我当年炸机的视频还在硬盘里存着呢。
下一节我们会聊怎么在实际飞控里调试这些参数。到时候我会分享一些我踩过的坑,保证让你少走弯路。