











本讲知识点
文件:
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(比例控制项)解决的问题其实非常简单:
误差越大,控制越强。
↓
误差越小,控制越弱。
它的控制思想只有一句话:
还差得越多,就越努力去追。
↓
已经很接近了,就慢慢靠过去。
例如:
还差 200°/s
↓
应该增加很多控制输出。
-------------------------
还差 20°/s
↓
应该增加较少控制输出。
-------------------------
还差 2°/s
↓
应该只增加一点点控制输出。
于是,我们第一次发现:
控制输出并不是固定增加的,而是会随着误差一起变化。
这就是:
Proportional(比例)
名字的来源。
所谓比例控制(Proportional Control),意思就是:
控制输出正比于当前误差。
可以简单理解成:
误差越大
↓
输出越大
误差越小
↓
输出越小
因此:
P Term 并不会关心:
飞机刚才发生了什么;
飞机以后会发生什么。
它只关心一件事情:
这一瞬间,还差多少。
然后立即决定:
应该增加多少控制输出。
所以:
P Term 其实是整个控制器中,反应速度最快的一部分。
于是,我们终于来到 Betaflight 的源码:
pidData[axis].P = pidRuntime.pidCoefficient[axis].Kp * errorRate;
先不要被代码吓到。
它真正表达的控制思想其实只有一句话:
控制输出 = 误差 × 控制力度
也就是:
P Output = Rate Error × Kp
其中, Rate Error 表示:还差多少。
而 Kp 表示:控制器准备多努力一点。
因此, P Output 真正代表的是:控制器准备增加多少控制输出。
假设现在: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 最大的优点就是:简单;直接;反应速度极快。
因为它只需要知道:"现在还差多少", 就能够立刻开始控制飞机。
因此:
Rate Error(角速度误差)
↓
P Term(比例控制)
↓
第一份控制输出产生。
直到这里,我们第一次看到:
误差
↓
开始变成控制输出。
控制链继续推进:
Desired Angular Rate
↓
Current Angular Rate
↓
Rate Error
↓
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 无法完成的控制职责。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。