针对“四旋翼无人飞行器串级PID控制器的研究”这个主题,在缺少正文细节的情况下,我会基于扎实的经典控制理论与飞行器实践,构思一篇有层次、有干货的工程复现笔记。以下内容将直接以资深无人机控制工程师的视角展开,重点放在“为什么串级PID是四旋翼控制的标准架构”以及“从算法到真机调试的完整链路”。 ## 1. 为什么四旋翼控制绕不开串级PID
先交代一下背景。这些年无人机行业从开源飞控到商业整机,几乎所有的姿态控制层都是串级PID的变形——外环算角度误差、内环算角速度误差,两层PID串联在一起。很多刚接触飞控的朋友会疑惑:单级PID也能把飞机稳住,为什么非要串起来?
答案在于四旋翼的本质是一个欠驱动、强耦合、强非线性的系统。悬停或慢速飞行时单级PID勉强能应付,一旦遇到风扰、急转弯或者重心偏移,单级PID的响应往往会出现超调、振荡甚至发散。串级PID的价值在于把“角度”和“角速度”两个状态分开控制:外环输出的是期望角速度,内环负责快速把实际角速度压到期望值。内环的带宽可以比外环高很多,这样一来,外环看到的被控对象就是一个“响应很快、延迟很小”的角速度回路,控制设计的难度大幅下降。
这篇文章想解决的问题很明确:当我们面对一篇围绕串级PID的期刊复现论文时,如何从数学建模做起,把控制器参数和仿真模型对上,再一步步迁移到真实飞行器上。这里涉及的东西不只是调一组PID系数那么简单,还包括机体坐标系下的动力学建模、执行器混控、传感器噪声处理、滤波器相位延迟,以及一套行之有效的调参顺序。我会按照我自己的复现路径来写,里面会穿插大量踩坑记录,希望对打算做飞控方向的同学或者想深入理解开源飞控底层逻辑的朋友有帮助。
核心关键词串一下:四旋翼、串级PID、角度环、角速度环、前馈补偿、混控矩阵、姿态解算、起控阻尼。这篇文章会把它们串成一个完整的知识链。
2. 从期刊论文到可执行模型的还原过程
2.1 先搭刚体动力学模型,别急着调PID
复现的第一步不是写控制器,而是把被控对象写好。四旋翼的动力学方程在大多数期刊论文里会直接给出,通常包括平动和转动两部分。转动部分的核心是欧拉方程:
[ J \dot{\boldsymbol{\omega}} + \boldsymbol{\omega} \times (J \boldsymbol{\omega}) = \boldsymbol{\tau} ]
其中 (J) 是转动惯量矩阵,(\boldsymbol{\omega}) 是机体角速度,(\boldsymbol{\tau}) 是外力矩。很多复现失败的情况,问题就出在惯量参数上:论文里给了一组数,但没告诉你是怎么测的,或者干脆给的是归一化之后的相对值。拿到一组惯量参数后,我建议先在仿真里做一组开环测试——给一个固定转速差指令,看角速度响应是否和理论计算一致。这一步能快速排查模型写错的问题。
实际建模时还有个容易忽略的细节:螺旋桨的升力和力矩与转速并不是线性关系,一般近似为力的平方关系:(F = k_F \omega^2),力矩 (M = k_M \omega^2)。在仿真模型里,电机响应通常简化为一阶惯性环节,时间常数大约在 20ms 到 50ms 之间。这一点对串级PID的参数整定非常关键,因为内环带宽如果设计得太高,电机延迟会成为限制因素。
2.2 坐标系的定义决定了代码的清晰度
坐标系混乱是复现期刊论文时最隐蔽的坑。四旋翼的转动力学在机体坐标系下表达最方便,但姿态输出通常要用地理坐标系(NED或ENU)来表示欧拉角或四元数。这里建议选定一套约定并写进文档,比如机体坐标系的X轴指向机头,Z轴向下(NED),RzRyRx的旋转顺序,对应的欧拉角依次为偏航、俯仰、横滚。
我复现时走过一次弯路:论文里给出的控制力矩是在机体坐标系下的,但我直接用欧拉角去算反作用力矩,导致在俯仰角很大的情况下仿真发散。后来把四元数引入姿态更新,绕开了欧拉角万向锁的问题,模型的鲁棒性明显提升。建议在仿真和实机中都统一使用四元数做姿态解算,只在给外环误差计算时把期望姿态和实际姿态转成便于比较的形式。
2.3 混控矩阵——串级PID输出到电机转速的桥梁
控制器输出的是三个轴力矩和总拉力,而执行器是四个电机。这个从控制量到电机转速的映射通常叫混控矩阵。标准X型四旋翼的混控关系如下(以NED机体坐标系为例):
[ \begin{bmatrix} T \ \tau_x \ \tau_y \ \tau_z \end{bmatrix}
\begin{bmatrix} k_F & k_F & k_F & k_F \ -k_F l & k_F l & k_F l & -k_F l \ k_F l & k_F l & -k_F l & -k_F l \ k_M & -k_M & k_M & -k_M \end{bmatrix} \begin{bmatrix} \omega_1^2 \ \omega_2^2 \ \omega_3^2 \ \omega_4^2 \end{bmatrix} ]
电机旋转方向交错排列,所以四个通道并不耦合。逆推转速时要注意转速下限和上限,否则进入饱和区后容易造成控制器积分饱和。这个问题在仿真中不一定明显,但在真机上非常致命,后面调试章节会专门讲。
3. 串级PID的结构设计与数学推导
3.1 角度外环:把姿态误差转成期望角速度
串级PID的外环输入是期望姿态(通常来自遥控器或位置控制器的输出),反馈是当前姿态,输出是期望角速度。假定当前横滚角为 (\phi),期望横滚角为 (\phi_d),角度误差为 (e_\phi = \phi_d - \phi),外环PID计算如下:
[ \omega_{xd} = K_{p,\phi} e_\phi + K_{i,\phi} \int e_\phi dt + K_{d,\phi} \frac{d e_\phi}{dt} ]
这里有个容易踩坑的细节:微分项如果直接对角度误差求导,在高频姿态噪声下会把噪声放大到没法看的地步。工程上通常的做法是对测量角度本身做微分,也就是 (-\dot{\phi}),再配合低通滤波。这样才能保证在无风悬停时,内环输入没有持续性抖动。
外环的带宽一般设置在 4~8 rad/s 左右。这个带宽太低会让飞机反应迟钝,太高则会调动内环而导致振荡甚至烧电机。多数论文会给出外环的自然频率和阻尼比目标,复现时要把PID参数和这些指标做对应换算。
3.2 角速度内环:核心的抗扰环节
内环输入是期望角速度(来自外环输出),反馈是实际角速度(来自陀螺仪),输出是期望力矩。内环PID的数学形式:
[ \tau_x = K_{p,\omega} e_\omega + K_{i,\omega} \int e_\omega dt + K_{d,\omega} \frac{d e_\omega}{dt} ]
内环的带宽通常要做到 20~40 rad/s 才够。因为四旋翼的抗风性、机动性几乎全部靠内环保证。期刊论文里常提到“内环优先于外环”的设计原则,实际含义是:先把内环调稳、调快、调准,外环才有效果;内环如果振荡,外环再完美也是白搭。
顺带提一下积分项的设置。内环积分项的主要作用是消除稳态误差,比如飞机重心偏移或桨叶磨损造成的常值扰动力矩。但如果积分系数取太大,起控瞬间容易出现积分饱和,导致飞机猛抬头。工程上通常会给积分项加一个限幅,甚至做积分分离——角度误差超过某个阈值时直接关闭积分。
3.3 从反馈线性化到PID:背后的等效关系
很多论文会把四旋翼的控制器往非线性反馈线性化方向推导,最后落到PID形式。理解的钥匙在于:角速度内环其实是在补偿系统的陀螺力矩项 (\boldsymbol{\omega} \times (J \boldsymbol{\omega})) 和重力力矩。对于悬停或慢速工况,这种交叉耦合项很小,PID能够近似补偿;而大机动飞行时,角速度内环的微分和比例项本身就构成了类似反馈线性化的结构。
所以串级PID并不是一个草根工程妥协,它和基于模型的控制之间存在清晰的对应关系。看懂这一步之后,就不会再纠结“为什么论文里要用PID而不是LQR”,因为两者在不同边界条件下得到的可能是同一控制器。
4. 仿真复现中的典型问题与参数整定策略
4.1 仿真模型的离散化方式决定了调参手感
期刊论文里给的PID公式通常是连续时间形式,比如 (u = K_p e + K_i \int e dt + K_d \dot e)。仿真时要离散化,常见的有前向欧拉、后向欧拉和双线性变换。如果直接写error_int += error * dt这种欧拉积分,在仿真步长较大时会造成相位延迟,串级内外环的稳定性边界会和连续时间分析不一致。
我个人的做法是:内环采样率做到 500Hz 以上,外环采样率 200Hz 以上,离散化统一用一阶保持器近似。控制器代码注意区分控制频率和状态估计频率,不要一把梭把所有计算都丢到同一个定时器里。仿真步长建议固定,不要让仿真器自适应步长去掩盖数值误差。
4.2 按“内环先P后I,外环先P后D”的顺序整定
调参顺序是老生常谈,但确实是最最可靠的路径。具体步骤:
- 把外环P、I、D全部置零,只保留内环的 (K_{p,\omega})。从小值开始加大,观察角速度阶跃响应,直到出现轻微振荡后回调 30%~50%。
- 加入内环 (K_{i,\omega}),消除角速度静差,但给积分限幅。加到这个值不影响阶跃响应的调节时间为止。
- 内环 (K_{d,\omega}) 通常用于补偿电机延迟,但四旋翼机架上陀螺仪噪声明显,微分很容易放大噪声,建议一开始为0,非必要不加。
- 开通外环 (K_{p,\phi}),从很小值开始,观察姿态角度阶跃响应,直到跟随速度让人满意。
- 外环微分 (K_{d,\phi}) 在这里作用很大,因为外环输出的是期望角速度,等效于角度环的阻尼。增大 (K_{d,\phi}) 相当于压低超调、增加稳定性。
- 最后再调外环积分,飞行器中通常只在偏航通道外环加积分,横滚和俯仰的外环积分用得比较少。
这一步的实质是让每一层都先自稳,再闭环。串级结构里如果内外环同时开,出了问题你根本不知道是哪个环引起的。
4.3 论文给出的PID参数为什么直接搬过来常常失控
期刊论文里的控制器参数往往是针对特定机架、特定惯量和特定电机响应时间整定出来的。有些论文会在参数表里给出 (K_p = 0.8, K_i = 0.05, K_d = 0.3) 这种数字,但离开了它的仿真环境,数值毫无意义。关键在于参数的归一化方式不同。
有一种相对通用的做法:将外环PID的控制量归一化到角速度范围,将内环PID控制量归一化到最大力矩。这样至少能保证换到不同尺寸的机架上时,控制增益的物理意义可比。我复现时的策略是:丢弃论文参数的具体数字,只保留控制结构和频域指标(带宽、相位裕度),在自己的模型上按目标动态重算参数。
4.4 仿真中如何引入传感器噪声和滤波延迟
很多复现论文的仿真看上去完美无瑕——姿态曲线光滑得像理论解,但真机上一飞就炸。原因在于仿真没有传感器噪声、没有零点漂移、没有滤波器相位延迟。真实的陀螺仪输出带有高频噪声,使用姿态控制器之前通常要过一个低通滤波器或陷波器。这个滤波器会给控制回路引入额外延迟,延迟过大,系统相位裕度下降,就会振荡。
建议在复现阶段就给仿真加入以下扰动源:
- 陀螺仪高斯白噪声,噪声密度参照真实IMU数据手册;
- 加速度计低频偏移;
- 电机转速响应的时间常数,而非理想瞬时响应;
- 测量与控制之间的固定时间延迟,一般取 1~2 个控制周期。
加入这些之后,你会发现原来在理想仿真里非常漂亮的参数也需要退让——这正是真实的调参过程在仿真里的预演。
5. 实机移植时的关键细节与避坑记录
5.1 从仿真到真机:哪些代码可以复用,哪些必须重写
仿真里用到的串级PID结构、混控矩阵、姿态更新四元数这些核心内容照搬没有问题。但至少有两类模块不能直接复用:一类是传感器数据预处理,仿真中输入的是无偏移的理想数据,真机上要做IMU校准、温度补偿、磁力计融合;另一类是执行器控制,仿真里电机一阶惯性响应很容易模拟,真机上要处理不同油门下的电压跌落和电调响应差异。
另外,仿真的起飞过程往往假设姿态初始为水平零角度,实机上如果放置不平,起控瞬间外环会给出一个很大的期望角速度,这时候必须做起控检测和角速度限制。我见过不少新手第一次飞串级参数就翻车——不是因为PID不稳,而是起控瞬间姿态误差太大,内环积分饱和直接导致侧翻。
5.2 保护逻辑不能后置:限幅、饱和与急停
实机上要重点检查三处限幅:
- 输出力矩限幅,防止电机命令超过最大允许转速;
- 积分限幅,防止启动或换挡时积分饱和导致失控反转;
- 期望角速度率限幅,防止遥控器或姿态指令突变引发机体过载。
急停逻辑建议独立于控制主循环,由专门任务监测故障状态。串级PID系统内部再稳定,也扛不住执行器断连、IMU饱和这类异常状态。把这些保护放在控制器之外,才能保证控制器的研究不被一次以外事故打断。
5.3 机臂扭转和螺旋桨滑流对外环的影响
我实际操作中发现一个值得注意的现象:同一组内环参数下,轴距较小的机架内环带宽可以开得更高,而大轴距机架则容易共振。原因是机臂柔性和螺旋桨气动中心偏移会给内环带来额外的结构模态。这种模态在仿真里很难建模,真机调试时如果内环参数过高,会听到一种高频啸叫或电机转速的抖动声。
解决办法是外环、内环带宽都要留出一定裕度,同时在机架上安装减震球,并确保IMU的安装位置尽量靠近整机质心。很多时候不是PID参数错了,而是安装和减震问题让传感器数据本身就不可靠。
6. 串级PID调参的实战记录:一个从振荡到满意的完整案例
6.1 问题现象与排查链路
某次复现实验,机架轴距 330mm,重量 1.2kg,仿真里表现良好的参数在实际试飞时出现了低频横滚振荡,波形周期大约 0.4 秒。起初我怀疑是内环参数偏大,于是把内环P从 0.15 降到 0.08,结果振荡并没有消失,反而出现了轻微的偏航漂移。
排查链路是这样的:
- 先检查IMU原始数据,确认陀螺仪曲线中没有明显的高频噪声成分;
- 把电机转速命令打印出来,发现横滚通道的输出命令和振荡波形完全不匹配,说明振荡不是控制器直接引起的;
- 检查机架模态,手动拨动机臂时发现了大约 15Hz 左右的结构共振;
- 进一步检查减震球,发现减震过软,变成了“载荷-弹簧”系统,低频增益接近反共振,正好和 0.4 秒周期的振荡频率重合。
这里控制器本身并没有错,问题出在传感器数据的“体感”失真。把减震球换成更硬的型号之后,同一组PID参数立刻恢复稳定。这个案例说明,解析振荡问题时要先区分“控制层问题”和“结构层问题”,不要一上来就动PID参数。
6.2 参数扫描与边界确定
实机调参不可能像仿真一样一次试很多组,我没法做完整全因子扫描,但可以用一种折中的方式快速圈定稳定边界:固定外环参数,只扫描内环 (K_{p,\omega}) 和 (K_{i,\omega}) 的网格;每一组参数悬停 30 秒,记录姿态角和角速度的方差,画成热力图。稳定区域会呈一个“碗状”,最优点通常在带宽临界点附近,但为了保证鲁棒性,我会选择临界点退一个档位的位置,而不是贴着边界用。
这里有一个实操技巧:使用遥控器通道在线调参。飞控允许在飞行时通过遥控器摇杆微调PID参数,能大幅缩短调参周期。每次调整后记录参数和飞行动作的关系,最后统一整理成表格。我通常把内环和外环调参分成两天完成:一天飞到稳定,一天压指标做优化。体力消耗很大,但得到的结论最真实。
6.3 参数自整定算法能否替代人工调参
很多现代开源飞控自带PID自整定功能,基本原理是在姿态角速率环注入一个正弦扫频信号,然后根据系统Bode图自动计算相位裕度和增益裕度,最后映射到PID参数。这个方法在大部分悬停工况下表现很好,但它有两个前提:一是模型接近线性,二是飞行动作较小。
自整定可以作为初始参数生成器,节省大量时间,但它解决不了大机动工况下非线性带来的性能问题。我建议把自整理结果作为起点,再用人工把外环带宽按目标提升 20%~50%。串级PID的好处在于有分层结构,自动整定内环、人工微调外环,两边都能用好。
7. 前进方向与延伸思考
在完成了串级PID的复现和真机验证之后,自然会想进一步改进。我目前比较推荐的方向有三个:
一是加入前馈通道。很多论文会在串级结构中添加角速度前馈:外环输出的期望角速度直接叠加一个由姿态误差微分得到的补偿量。这样可以提升大角度机动的跟踪带宽,而不会影响悬停时的稳定性。
二是把内环模型化,用角速度环模型去配合姿态环设计。通过测量或辨识内环闭环传递函数,可以更精确地设计外环的相位裕度,而不是粗暴试凑。
三是引入扰动观测器或自适应增益。串级PID的抗扰靠的是内环高带宽和高增益,但对周期性扰动(比如单侧风)响应有限。可以在角速度环旁边并联一个扰动估计器,把常值风扰直接前馈补偿掉,让内环专注于动态响应。
这些东西并不难,但每一步都建立在对串级PID结构的透彻理解之上。有人可能会觉得PID已经过时,但在四旋翼这种既有强非线性又有强实时约束的平台上,简单结构加合理工程细节依然是最可靠的选择。这也是我复现那么多论文之后最大的体会:不要把重心放在迷信算法,而要把重心放在理解被控对象和控制系统之间的互动关系。