惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
IT之家
IT之家
博客园 - Franky
Stack Overflow Blog
Stack Overflow Blog
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
H
Help Net Security
V
V2EX
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
博客园 - 叶小钗
J
Java Code Geeks
博客园 - 【当耐特】
月光博客
月光博客
爱范儿
爱范儿
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件

博客园 - longyue

[BF学院_卷1] -- 第30讲:mixTable() 总结 —— Mixer 完整控制模型 [BF学院_卷1] -- 第29讲:applyMixToMotors() —— 最终 Motor Output 生成 [BF学院_卷1] -- 第28讲:applyMixerAdjustment() —— 为什么 Mixer 需要重新分配控制权限 [BF学院_卷1] -- 第27讲:PID Output 如何进入 Mixer —— 从控制需求到 motorMix [BF学院_卷1] -- 第26讲:calculateThrottleAndCurrentMotorEndpoints() —— Mixer 如何确定油门基础范围 [BF学院_卷1] -- 第25讲:mixTable() 总览 —— Mixer 在控制循环中的位置 [BF学院_卷1] -- 第24讲:mixer_init.c —— 飞控启动时如何准备 Mixer [BF学院_卷1] -- 第23讲:Mixer 数学模型 —— motorMixer_t 如何形成 Motor Output [BF学院_卷1] -- 第22讲:Betaflight 如何描述 Mixer —— mixer.h 数据结构 [BF学院_卷1] -- 第21讲:四旋翼为什么可以通过电机控制姿态 —— Mixer 背后的物理基础 [BF学院_卷1] -- 第20讲:从 PID Output 到 Motor Command(电机指令)——为什么飞控需要 Mixer [BF学院_卷1] -- 第19讲:PID Controller(PID控制器)——飞控到底如何理解误差并控制飞机? [BF学院_卷1] -- 第18讲:PID Controller 的最后一环——为什么飞控还需要 Feedforward(前馈控制)? [BF学院_卷1] -- 第17讲:D Term(微分控制项)——飞控如何提前感知运动变化? [BF学院_卷1] -- 第16讲:I Term(积分控制项)——飞机为什么总是差一点? [BF学院_卷1] -- 第14讲:Rate Error(角速度误差)——PID 真正控制的到底是什么? [BF学院_卷1] -- 第13讲:Outer Loop 的终点——为什么还要读取 Current Angular Rate(当前角速度)? [BF学院_卷1] -- 第十二讲:Yaw Compensation(偏航补偿) [BF学院_卷1] -- 第12讲脚本 [BF学院_卷1] -- 第十一讲:Current Angular Rate(当前角速度)——飞控怎样知道飞机现在转得有多快? [BF学院_卷1] -- 第十讲:Angle Error(姿态角误差)如何变成 Desired Angular Rate(目标角速度) [BF学院_卷1] -- 第九讲:Current Angle(当前姿态角)遇见 Target Angle(目标姿态角) [BF学院_卷1] -- 第八讲:飞手打杆以后,飞控首先得到什么? [BF学院_卷1] -- 第七讲:为什么 Pitch Flip 只在 180° 看起来正确 [BF学院_卷1] -- 第7讲脚本 [BF学院_卷1] -- 第6讲:为什么 Pitch Flip 会骗人 [BF学院_卷1] -- 第6讲脚本 [BF学院_卷1] -- 第五讲:第一次修正——Pitch Flip 为什么看起来有效 [BF学院_卷1] -- 第5讲脚本 - longyue [BF学院_卷1] -- 第4讲:为什么"绕飞机自己转"不等于"朝世界转" - longyue
[BF学院_卷1] -- 第15讲:P Term(比例控制项)——飞控是如何...
longyue · 2026-08-03 · via 博客园 - longyue

第15讲:P Term(比例控制项)——飞控是如何利用误差开始控制飞机的?


本讲知识点

  • 为什么 Rate Error(角速度误差)不能直接控制电机?
  • P Term(比例控制项)为什么会出现?
  • P Term 在控制链中的控制职责是什么?
  • P Term 为什么能够利用误差开始控制飞机?
  • P Gain(比例增益)究竟在控制什么?
  • P Term 的优点与局限性是什么?

本讲对应 Betaflight 源码

文件:

src/main/flight/pid.c

函数:

pidController()

本讲涉及源码:

pidData[axis].P = pidRuntime.pidCoefficient[axis].Kp * errorRate;

本讲重点讲解:

Kp × errorRate

究竟是如何把:

Rate Error(角速度误差)

转换成第一份控制输出。


本讲学习目标

上一讲,我们已经建立了:

Desired Angular Rate(目标角速度)

↓

Current Angular Rate(当前角速度)

↓

Rate Error(角速度误差)

至此,PID Controller(PID控制器)终于拿到了:

Target

↓

Current

↓

Error

但是,它仍然不知道应该如何利用这个误差去控制飞机。

因此,本讲我们将正式进入 PID Controller(PID控制器)的第一部分:

P Term(比例控制项)

去看看飞控究竟是如何利用误差开始控制飞机的。


回顾上一讲

上一讲结束时,我们已经得到 Rate Error(角速度误差)。

它描述的是飞机应该转多快 与 飞机现在实际转多快 之间还差多少。

控制链已经推进到了:

Desired Angular Rate

↓

Current Angular Rate

↓

Rate Error

但是,误差仅仅只是一个数字,它还不会自己去控制飞机。

因此,一个新的问题出现了:飞控应该如何利用这个误差开始控制飞机?

这正是 P Term(比例控制项)要解决的问题。


为什么误差不能直接控制电机?

很多人第一次学习 PID 时都会产生一个疑问:

既然已经知道误差是多少,为什么不能直接把误差送给电机?

例如:

Rate Error = 200°/s

能不能直接告诉电机:

还有200°/s没转到,赶快多转一点。

答案当然是不行。因为误差不是控制量, 它只是告诉控制器还差多少。

但它并不会告诉控制器:

应该增加多少控制输出?

应该增加多快?

应该增加多少比例?

换句话说:Error(误差)只是问题本身,它不是解决问题的方法。

控制器真正需要回答的是:

如果误差变大,应该增加多少控制输出?

↓

如果误差变小,应该减少多少控制输出?

因此,我们需要一种新的控制规则。


P Term 到底解决了什么问题?

P Term(比例控制项)解决的问题其实非常简单:

误差越大,控制越强。

↓

误差越小,控制越弱。

它的控制思想只有一句话:

还差得越多,就越努力去追。

↓

已经很接近了,就慢慢靠过去。

例如:

还差 200°/s

↓

应该增加很多控制输出。

-------------------------

还差 20°/s

↓

应该增加较少控制输出。

-------------------------

还差 2°/s

↓

应该只增加一点点控制输出。

于是,我们第一次发现:

控制输出并不是固定增加的,而是会随着误差一起变化。

这就是:

Proportional(比例)

名字的来源。


什么叫做比例控制?

所谓比例控制(Proportional Control),意思就是:

控制输出正比于当前误差。

可以简单理解成:

误差越大

↓

输出越大


误差越小

↓

输出越小

因此:

P Term 并不会关心:

飞机刚才发生了什么;

飞机以后会发生什么。

它只关心一件事情:

这一瞬间,还差多少。

然后立即决定:

应该增加多少控制输出。

所以:

P Term 其实是整个控制器中,反应速度最快的一部分。

第一行 P Term 源码

于是,我们终于来到 Betaflight 的源码:

pidData[axis].P = pidRuntime.pidCoefficient[axis].Kp * errorRate;

先不要被代码吓到。

它真正表达的控制思想其实只有一句话:

控制输出 = 误差 × 控制力度

也就是:

P Output = Rate Error × Kp

其中, Rate Error 表示:还差多少。

而 Kp 表示:控制器准备多努力一点。

因此, P Output 真正代表的是:控制器准备增加多少控制输出。


Kp(比例增益)到底在控制什么?

假设现在:Rate Error = 100°/s

如果:Kp = 1, 那么:P Output = 100

如果:Kp = 2, 那么:P Output = 200

如果:Kp = 0.5, 那么:P Output = 50

我们会发现:

Error(误差)决定还差多少。

Kp(比例增益)决定控制器准备多努力。

因此:

Kp 并不是 控制飞机转多快,

它控制的是:面对同样的误差,控制器到底准备增加多少控制输出。


P Term 的优点是什么?

P Term 最大的优点就是:简单;直接;反应速度极快。

因为它只需要知道:"现在还差多少", 就能够立刻开始控制飞机。

因此:

Rate Error(角速度误差)

↓

P Term(比例控制)

↓

第一份控制输出产生。

直到这里,我们第一次看到:

误差

↓

开始变成控制输出。

控制链继续推进:

Desired Angular Rate

↓

Current Angular Rate

↓

Rate Error

↓

P Term

P Term 有什么局限性?

虽然 P Term 非常优秀,但它也存在自己的问题。

因为它只知道现在还差多少, 它不知道过去发生了什么;以后又会发生什么。

因此,仅仅依靠 P Term,控制器并不能解决所有问题。

这也是为什么 PID 不会只有 P, 后面的 I 以及 D 都会有自己需要解决的问题。

但至少直到这一讲结束时:

控制器终于第一次开始利用误差控制飞机了。

本讲小结

本讲,我们正式进入了 PID Controller(PID控制器)的第一部分:P Term(比例控制项)。

P Term 的职责,就是把 Rate Error(角速度误差)转换成第一份控制输出,并遵循“误差越大,控制越强;误差越小,控制越弱”的比例控制思想。与此同时,我们也认识了 Kp(比例增益)的作用,它决定了控制器面对同样误差时,究竟准备增加多少控制力度。

至此,控制链已经正式推进到了:

Rate Error

↓

P Term

下一讲预告

P Term(比例控制项)虽然能够开始控制飞机,但它并不能解决所有控制问题。

为什么飞机已经非常接近目标值,却仍然可能始终差一点点?

下一讲,我们将继续观察 P Term 的控制局限性,看看为什么飞控还需要:

I Term(积分控制项)。

去解决 P Term 无法完成的控制职责。