[BF学院_卷1] -- 第13讲:Outer Loop 的终点——为什么还要读取 Current Angular Rate(当前角速度)?

第13讲:Outer Loop 的终点——为什么还要读取 Current Angular Rate(当前角速度)?


本讲知识点

  • Outer Loop(外环)已经结束了吗?
  • Desired Angular Rate(目标角速度)为什么不能直接送给电机?
  • 飞控为什么还要读取陀螺仪角速度?
  • Current Angular Rate(当前角速度)在控制链中的职责
  • Rate Error(角速度误差)的来源
  • Outer Loop 与 Inner Loop 的控制职责交接
  • 第一次进入 pidController() 的真正控制流程

本讲对应 Betaflight 源码

文件:

src/main/flight/pid.c

函数:

pidController()

本讲涉及源码:

const float gyroRate = gyro.gyroADCf[axis];

float errorRate = currentPidSetpoint - gyroRate;

本讲重点讲解第一行源码:

const float gyroRate = gyro.gyroADCf[axis];

以及第二行源码为什么必须这样计算。


本讲学习目标

这一讲,我们正式离开 Outer Loop(外环),进入 Inner Loop(内环)的入口。

上一讲结束时,Outer Loop 已经完成了自己的全部职责,并输出了:

Desired Angular Rate(目标角速度)

但是,仅仅知道“飞机应该转多快”还远远不够, 因为飞控仍然不知道 “飞机现在到底转得有多快”。

因此,本讲将建立:

Current Angular Rate(当前角速度)

这个变量,并理解它为什么会成为整个内环控制的起点。


回顾上一讲

上一讲结束时,我们已经得到:

Desired Angular Rate(目标角速度)

它来自:

Angle Error

↓

Desired Angular Rate

也就是说,Outer Loop(外环)已经完成了自己的控制职责。

控制链推进到了:

RC Stick

↓

Target Angle

↓

Current Angle

↓

Angle Error

↓

Desired Angular Rate

很多人在这里都会产生一个疑问:

飞机已经知道自己应该每秒旋转多少度了,为什么还不能直接去控制电机?

答案就是:

因为"目标"永远不是"现实"。

飞机知道"应该转多少",并不代表它真的转了那么多

假设,飞手希望飞机快速向右滚转,经过外环计算以后:

Desired Angular Rate = 300°/s

这意味着:

飞控希望飞机每秒旋转 300°。

但是,这只是“希望值”,并不是“实际值”。

现实中的飞机受到很多因素影响,例如:

  • 电机推力不足;
  • 电池电压下降;
  • 螺旋桨效率变化;
  • 飞行中的空气阻力;
  • 外界风力干扰。

因此,真实世界中的飞机,很可能正在以 220°/s 旋转,也可能 350°/s,甚至根本没有开始旋转。

于是,一个新的问题出现了:

飞控怎么知道,飞机现在到底转了多少?

这正是 Inner Loop(内环)首先要解决的问题。


飞控必须先观察现实世界

任何控制系统,都必须同时拥有两类信息:

第一类:目标值(Target)

第二类:实际值(Current)

如果只有目标,没有实际值,控制器永远不知道自己有没有控制成功。

举一个生活中的例子:

假设汽车定速巡航设定 100 km/h,如果汽车 ECU(电子控制单元)不知道当前速度是多少,它还能控制油门吗?

当然不能,因为:它不知道现在是80?95?100?120?

所以,汽车必须实时读取当前速度,飞控也是完全一样。

Desired Angular Rate(目标角速度)只是应该转多少。

真正决定控制是否成功的,是现在转多少。

于是,飞控开始读取Current Angular Rate(当前角速度)


第一行源码

于是,我们来到 pidController() 中真正进入内环后的第一行核心代码:

const float gyroRate = gyro.gyroADCf[axis];

这行代码非常短,但它完成了一件极其重要的事情:

把现实世界中的飞机旋转速度,带回控制器。

这里的 gyro.gyroADCf 表示陀螺仪实时测得的角速度。

注意,它不是目标角速度,也不是计算出来的角速度。

而是飞机此时此刻,真正正在旋转的角速度。

这是整个 Inner Loop 唯一相信的现实数据。


为什么一定要相信陀螺仪?

因为,只有陀螺仪真正知道飞机现在发生了什么。

例如:

外环希望 300°/s,但是陀螺仪返回 225°/s,飞控立刻知道 飞机转慢了。

如果陀螺仪返回 330°/s,飞控马上知道 飞机转快了。

因此,陀螺仪不是在告诉飞控应该怎么控制,它是在告诉飞控现实已经发生了什么。

直到现在,控制系统终于同时拥有了:

Target

↓

Current

下一步,它们终于可以进行比较。

控制链继续推进:

Desired Angular Rate

↓

Current Angular Rate

↓

Rate Error

而这一步,正是下一讲要建立的:

Rate Error(角速度误差)。

本讲小结

本讲正式完成了控制职责从 Outer Loop(外环)到 Inner Loop(内环)的交接。

Outer Loop 输出的是 Desired Angular Rate(目标角速度),它描述的是飞机"应该转多快";而 Inner Loop 首先读取陀螺仪提供的 Current Angular Rate(当前角速度),获得飞机"现在实际转多快"。

至此,控制器第一次同时拥有了目标值和实际值,为下一步计算角速度误差做好了准备。


下一讲预告

现在,飞控已经同时知道:

应该转多快;

现在转多快。

那么,它将如何判断:

还差多少?

下一讲,我们正式建立:

Rate Error(角速度误差)

这是整个 Rate PID(角速度控制器)真正开始工作的第一步。

posted on 2026-08-03 14:40  longyue  阅读(10)  评论(0)    收藏  举报

导航