第1章:串级PID控制——角度环与角速度环的串级结构设计

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

说实话,我刚入行那会儿,也觉得单级PID挺香的。结构简单,调参也快。但后来在项目里栽过跟头,才明白为什么工业级飞控几乎清一色用串级。嗯,今天就把我这些年踩过的坑、总结的经验,一股脑倒给你们。

1.1 为什么非要用串级?

先问个问题:你让无人机悬停,遥控器给个10度的俯仰角指令。单级PID会怎么做?它直接算出一个控制量,扔给电机。但问题是——无人机本身的角速度变化非常快,而角度变化相对慢。单级PID相当于让一个慢系统直接去控制一个快系统,结果就是:

  • 响应慢:角度误差大时,控制量才大,但角速度已经冲过头了
  • 容易震荡:我见过不少新手调单级,P给大一点就抖,给小了又跟不紧
  • 抗扰差:一阵风吹来,角度还没变,角速度先变了,单级PID根本来不及反应

核心结论:单级PID适合控制对象惯性大的系统,而四旋翼的角速度响应极快(毫秒级),必须用串级把快慢分开管。

1.2 串级结构长什么样?

说白了,串级PID就是两个PID串在一起干活:

  • 外环(角度环):输入是期望角度,输出是期望角速度
  • 内环(角速度环):输入是期望角速度,输出是电机控制量

我习惯把外环叫“指挥官”,内环叫“执行者”。指挥官说“我要往左转30度”,执行者就负责“好嘞,我以每秒100度的速度转过去”。

下面这张图是我手绘的串级结构,你们感受一下:

期望角度 角度环PID (外环) 角速度环PID (内环) 电机 角度反馈 角速度反馈 外环(角度环) 内环(角速度环)

你看,外环的输出直接喂给内环当输入。内环跑得飞快(通常1kHz以上),外环可以慢一些(200-400Hz)。这样分工明确,各司其职。

1.3 内外环带宽分配原则

带宽这个词,说白了就是“系统能响应多快的信号”。内环带宽必须比外环大,这是铁律。

我一般遵循一个经验法则:内环带宽是外环的5-10倍。举个例子:

  • 外环角度环:带宽 5-10 Hz
  • 内环角速度环:带宽 40-80 Hz

为什么会这样?你想想看,外环要等内环先稳定下来,才能正确判断角度误差。如果内环慢吞吞的,外环就会误判——明明角速度还没到位,外环以为已经到位了,继续加大控制量,结果就超调了。

我的调参习惯:先锁死外环(P给很小),单独调内环。内环调稳了,再放开外环。这样一步步来,不容易炸机。

1.4 串级PID vs 单级PID

咱们直接上对比表,一目了然:

对比项 单级PID 串级PID
结构 一个PID直接控制 外环+内环两级控制
响应速度 较慢,受限于角度变化 快,内环直接处理角速度
抗扰能力 弱,风扰直接体现在角度上 强,风扰先被内环抑制
调参难度 简单,3个参数 稍复杂,6个参数(内外环各3个)
适用场景 慢速飞行、玩具级 高速飞行、航拍、工业级

我记得有一次做植保机项目,单级PID在无风环境下表现还行。但田间地头风一刮,飞机就开始晃,药都洒不均匀。换成串级后,同样条件下稳得像块石头。从那以后,我对串级就死心塌地了。

1.5 实际调参经验

调参这事儿,说难不难,说简单也不简单。我总结了一套“三步走”流程:

  1. 先调内环:把外环P设成0.1(几乎不起作用),只调内环的P。从小到大加,直到飞机出现轻微抖动,然后退回80%。
  2. 再加内环D:D能抑制抖动,但加多了会让系统变“肉”。我一般加到P的1/10左右。
  3. 最后调外环:外环P从0.5开始加,观察角度跟踪效果。如果出现超调,适当加一点外环D。

避坑指南:我曾经犯过一个低级错误——内外环都用积分项。结果积分饱和,飞机起飞就翻。后来我学乖了:内环一般不用I,或者I给极小值。外环的I用来消除静差,但也不能太大。

给你们看一段我常用的串级PID代码框架(简化版):

// 外环:角度环
float angle_error = target_angle - current_angle;
float target_rate = angle_Kp * angle_error 
                  + angle_Ki * angle_integral 
                  + angle_Kd * angle_derivative;

// 内环:角速度环
float rate_error = target_rate - current_rate;
float motor_output = rate_Kp * rate_error 
                   + rate_Ki * rate_integral 
                   + rate_Kd * rate_derivative;

// 限幅保护
motor_output = constrain(motor_output, -1000, 1000);

注意看,外环的输出target_rate直接作为内环的输入。这就是串级的精髓——把角度控制问题,转化成了角速度跟踪问题。

1.6 小结

串级PID不是什么高深理论,它就是工程上的一种“分而治之”的思路。把快变量(角速度)和慢变量(角度)分开控制,各用各的PID,互不干扰。

我个人觉得,学串级PID最好的方式就是动手调。找个开源飞控(比如PX4或ArduPilot),把参数导出来,一个一个改,看反应。炸几次机不要紧,关键是理解每个参数在干什么。

好了,今天就聊到这儿。记住:内环要快、外环要稳,带宽差5倍以上。下次咱们接着聊具体的参数整定方法。


公众号:蓝海资料掘金营,微信deep3321