
很多第一次接触无人机飞控的朋友都会问同一个问题四轴飞行器四个电机呼呼一转怎么就能稳稳悬停在空中哪怕一阵风吹过来它也能自己调整姿态恢复平衡。这里面最核心的东西就是我今天想聊的PID控制。PID全称是Proportional-Integral-Derivative比例-积分-微分控制。它不只在无人机里无处不在从恒温加热棒、小车循迹到工业机械臂凡是需要“自动稳住”的系统几乎都离不开它。这篇文章会从物理直觉出发把PID拆开揉碎讲清楚再结合飞控实际架构带你看懂无人机姿态环的串级PID调参逻辑最后分享一些实操中踩过的坑和排查思路。如果你是刚入手无人机开发、或者想从原理层面理解飞控为什么这么设计这篇文章就是给你准备的。我会尽量用大白话把控制理论里那些看起来很玄的概念讲透保证不堆公式吓人但也绝不敷衍了事。1. 先搞清楚无人机悬停时到底发生了什么1.1 一个不稳定的物理系统四旋翼天生就是歪的我们拿最常见的X型四轴无人机说事。四个电机分布在四个角上通过螺旋桨旋转产生向上的升力。看起来对称但实际上这个系统天然就不稳定。你想象一下把无人机放到空中如果机身稍微往右倾斜一点右边和前边的升力分量就会发生变化飞机会继续往右滑同时姿态角度会越偏越大。没有外部干预的话无人机几秒钟内就会翻掉。这就是“开环不稳定”的概念。简单说你给电机一个固定油门无人机根本不可能自己保持水平。它不像固定翼飞机那样有气动稳定性的天然加持多旋翼完全靠主动控制才能活着。所以飞控的核心任务就变成一个时刻测量姿态偏差然后算出一组电机转速修正量把这个偏差拉回零。这个“测量→计算→执行”的循环就是控制回路PID是回路里负责“计算”的角色。1.2 控制回路的基本骨架感知、决策、执行任何自动控制系统都有三个基本环节。传感器负责感知当前状态飞行控板就是MCU负责做决策电调和电机负责执行。在无人机里传感器主要是IMU惯性测量单元内部集成了陀螺仪和加速度计。陀螺仪测量三轴角速度加速度计测量三轴加速度。飞控通过融合这两路数据解算出当前无人机的横滚角Roll、俯仰角Pitch、偏航角Yaw以及三个轴上的角速度。每个控制周期也就是常见飞控的250Hz、500Hz甚至1kHz执行一次以下流程读取当前姿态角度和目标角度比如遥控器给的横滚指令或者悬停时的0度计算误差 目标值 - 当前值把误差送入PID控制器输出结果叠加到电机基础油门值上电机执行转速变化无人机产生力矩姿态改变这一圈走完误差应该变小。然后下一个周期重复如此高频运转无人机就“看起来”稳住了。2. PID控制器到底在算什么2.1 三个字母的直觉理解P是现在I是过去D是未来关于PID网上已经有无数比喻。我自己的理解是把它当三个角色来配合。P是比例项管现在。把当前误差乘以一个系数Kp。误差大输出就大误差小输出就小。你歪了10度我给你一个比较大的修正力矩你只歪了1度我给一个很小的修正力矩。这个逻辑很直觉但只有P的问题在于系统会来回震荡。好比你快迟到时开车看到离路口还远就猛踩油门看到快到了又猛踩刹车最后就是一顿一顿的。D是微分项管未来。它看的是误差的变化趋势也就是误差的变化速度。误差在快速增大D就输出一个反向力去抑制它的增长误差在快速减小D也会提前踩一脚“刹车”防止冲过头。D的作用像阻尼器专门对付P带来的超调与震荡。没有D的时候无人机就像没有液压减震的弹簧车P越大越容易抖。I是积分项管过去。它把所有历史误差累加起来只要误差长期不是零积分值就会越来越大最终补上一个额外输出把这个残留误差干掉。典型场景就是无人机长时间悬停因为重心偏心或者螺旋桨效率不一致总有那么一个固定角度偏差需要额外力矩去顶住。P和D看着误差不算大就懒得出力I会在背后慢慢累积力量直到那个固定偏差被完全抵消。2.2 PID公式的工程化写法位置式与增量式教科书里PID的标准公式长这样u(t) Kp * e(t) Ki * ∫e(t)dt Kd * de(t)/dt但在飞控代码里不能直接用积分和微分符号要离散化。工程上有两种常见实现位置式PID和增量式PID。位置式PID直接计算输出量// 位置式PIDC语言伪代码 float pid_update(pid_t *pid, float target, float current) { float error target - current; pid-integral error * dt; // 误差积分 float derivative (error - pid-last_error) / dt; // 误差微分 pid-last_error error; return pid-Kp * error pid-Ki * pid-integral pid-Kd * derivative; }增量式PID则是只输出“这一次比上一次多出多少修正”// 增量式PID输出的是增量 float pid_increment_update(pid_t *pid, float target, float current) { float error target - current; float d_error error - pid-last_error; float dd_error d_error - (pid-last_error - pid-last_last_error); float increment pid-Kp * d_error pid-Ki * error pid-Kd * dd_error; pid-last_last_error pid-last_error; pid-last_error error; return increment; }两种方式在飞控里都有用到。位置式直观、参数意义明确适合姿态控制器这种需要输出绝对修正量的场合。增量式适合电机控制、舵机控制这类对绝对输出有记忆的场景因为增量式天然不带静态误差输出是逐步叠加的动作更平滑也便于做输出限幅和异常保护。你去看很多开源飞控代码外层角度环用位置式内层角速度环也用位置式但底层电调若做闭环调速就常用增量式。2.3 三个参数的相互作用为什么不能单独调任何一个很多人刚接触PID时以为Kp、Ki、Kd是三个独立旋钮分别调到位就行。其实它们是互相拉扯的。Kp大了系统更跟手但震荡风险大Kd能把Kp造成的震荡压下去但Kd太大又会放大噪声电机狂抖还发热Ki能把稳态误差吃掉但积分过头就会超调甚至出现积分饱和。最经典的调法就是“先P后I再D”每一轮都在前一参数的基础上叠加。你先给一个小的Kp看响应和震荡慢慢往大加直到系统开始出现等幅震荡再退一点此时加入Kd把震荡抑制住最后加Ki消除残差。这个顺序在绝大多数工程系统上都适用无人机尤其如此。3. 为什么飞控里用的是串级PID而不是单环PID3.1 单级PID的问题控制对象太慢来不及纠正如果你只用一个PID直接去控制角度假设目标横滚角是0度当前是10度PID输出一个修正力矩给电机。问题在于这个修正力矩产生的“角加速度”要先积分成“角速度”再积分才变成“角度”。两级积分下来系统延迟很大。而且外界的风扰直接作用在角速度上单级角度PID根本来不及反应等你发现角度偏了再去纠正飞机早就被吹跑了。所以工程上没人用单级PID控制角度。大家不约而同选择了串级结构里面有一个角速度环外面套一个角度环。3.2 内环角速度环真正干苦力活的人角速度环的输入是陀螺仪直接测到的三轴角速度目标值是期望角速度。它输出的是电机修正量。为什么角速度环更快因为陀螺仪测角速度几乎没有延迟而且角速度到电机力矩之间只有一阶积分关系响应非常直接。风吹过来时机身先产生一个角速度扰动内环立刻感知到并输出反向力矩抗风性因此大幅提升。3.3 外环角度环负责定方向和给指令角度环的输入是目标角度比如遥控拨杆给25度横滚角指令输出是期望角速度喂给内环。外环不需要跑得特别快但它的比例关系很关键角度偏差越大给内环的期望角速度越大。很多飞控里外环只用P控制器就够了因为内环本身已经有不错的积分能力外环再上I很容易造成角度超调。3.4 内外环时间间隔与调参逻辑串级PID的调试顺序必须是先内环后外环这个几乎不能乱来。你先给内环一组参数让无人机在遥控给角速度指令时能干脆利落地响应再松开手看角度保持最后调外环。你可以先暂定外环P为某个值去调内环P、I、D内环稳了之后再回头调外环P。关于时间间隔实际参数上看内环控制频率应该比外环高一倍以上。比如PX4姿态速率环跑250Hz角度环跑100Hz这在数值上就是内外环时间间隔的体现。内环高频率是保证阻尼生效的前提外环低频率足够让角度信息平滑传导过高反而增加相位滞后。4. 实操从零开始调一套飞控PID参数4.1 准备工作实验台固定避免炸机炸自己调PID最怕飞机突然震荡或者翻机。我强烈建议在把飞机解锁起飞之前先把机身用支架固定住只留一个轴的旋转自由度。最简单的方式是用一根碳管从机身中心穿过两端架在两个台钳上让无人机只能绕某一轴旋转。这样你就可以安全地测试Pitch轴或者Roll轴的响应观察机体有没有高频抖动能不能快速回中触摸电机温度是不是过高。很多飞控像Betaflight、ArduPilot都支持在配置界面里调参数并实时保存不用每次重新编译固件。4.2 内环角速度环调参先试基础的Kp从内环Kp开始。把I和D先设成0。把固定好的飞机解锁推动俯仰/横滚摇杆看它回中的速度和过程。Kp太小推杆后机身慢悠悠回去像没吃饭一样可能还会歪着不回来有一点静态误差。Kp适中回正干脆干脆利落停住没有余震。Kp过大回正后机身来回震荡甚至发出噪音像痉挛一样此时要立刻减小。我的经验值是以70%左右的最大值作为初调在震荡临界点附近找感觉。因为后面加D会把震荡压住所以Kp可以比单纯只用P时给得稍大一点。4.3 内环角速度环加D抑制高频抖动加入Kd后你会观察到原本Kp带来的等幅震荡被显著衰减。D的另一个好处是提高系统阻尼但代价是放大传感器噪声。尤其在低成本的陀螺仪上Kd稍微给大电调就会发出滋滋的高频音电机空转时尤其明显。如果出现这种情况说明Kd太大噪声被放大了可以往回退30%左右。判断D合适的标准快速打杆然后松手机头能迅速停下不摆尾、不点头、不震荡。如果停下来的时候带一点轻微回弹多数说明D还偏小。4.4 内环加上I消除定速漂移内环I的作用在角速度环里主要是消除恒定外部扰动造成的角速度静态误差。比如重心偏了、螺旋桨老化效率不对称都会让飞机往某一个方向缓慢漂移。你给一点点I值就能把这股恒定偏航力矩顶住。注意I值宁可小不可大。I太大会造成低速振荡就是看起来飞机在轻微“呼吸”一鼓一鼓的。这种问题在飞行中不容易发现固定台上更容易察觉。4.5 外环角度环姿态回中与跟手感内环稳定之后再把角度环P从零往大加。外环P决定“无人机偏了多少角度就命令内环以多大的角速度去纠正”。P太小飞机漂了很慢才纠正手感模糊P太大推杆时机身响应过于激进甚至出现人机耦合就是飞机动作比你的手指还快反而很难控制。到这里一套基础的姿态PID就调完了。4.6 完整调参记录参考下面是一个典型的250mm穿越机调参记录差不多能帮你建立数值感觉参数项初始试探值稳定值说明内环Roll/Pitch Kp0.060.085过高时机身抖动内环Roll/Pitch Ki0.010.03用于消漂移内环Roll/Pitch Kd0.0040.006抑制回弹与震荡外环角度P3.55.2手感跟手内环Yaw Kp0.120.20Yaw的惯性大内环Yaw Ki0.0050.02处理偏航漂移不同机型、重量、螺旋桨尺寸都会导致参数差很远。但调参思路完全一样先P再D最后I先内后外。这套方法论在各家飞控上通用。5. 常见问题与排查技巧实录5.1 无人机上电后电机狂抖、发热严重多半是Kd太大或者KpKd组合过度放大了高频噪声。尤其是低成本陀螺仪配合大Kd几乎必然抽风。解决方式先降Kd再降Kp确保基础回中不出震荡再一点点加回去。5.2 悬停时飞机朝固定方向缓慢漂移这就是外环/内环积分不足的表现。先检查飞控安装有没有水平校准再确认重心确实居中。如果都正常就按0.01步进增加对应轴的Ki值直到漂移明显变缓。5.3 风吹过来飞机晃一下但恢复太慢外环P太低。这个情况下飞控能稳定但对抗外界扰动的主动回正力度不够。可以适度增大外环角度P再顺带检查内环角速度增益是否偏低。很多抗风性不佳的飞机本质是内环Kp没有给够。5.4 打杆反应迟钝推杆后要等一下才动作常见于外环P过高或内环D过大造成系统响应钝化。也有一种情况是遥控通道上设置了过大的摇杆曲线平滑。先用排除法把遥控曲线设为默认再检查参数。5.5 悬停时飞机“呼吸”式上下波动低速振荡内环或外环I过大积分饱和和松弛交替出现。把Ki按30%~50%往下降再观察。如果呼吸频率较高同时伴随轻微声音可能是控制频率不够高尝试把采样率从250Hz提到500Hz。5.6 常见问题速查表现象首要怀疑参数调整方向高频抖动Kd减小低频震荡、来回翻滚感Kp减小固定漂移Ki增大推杆过冲回弹Kd增大响应迟钝Kp / 外环P增大悬停缓慢呼吸Ki减小电机发热明显Kd减小6. PID之后往更先进的控制方法走PID虽然不是最炫酷的控制算法但它足够可靠、足够直观、算力开销极低所以霸榜飞控几十年。但如果你只是学会调PID还不够可以继续往下一层走几步理解延伸。串级PID之上现代无人机飞控还会加入前馈控制。当你快速打杆时角度环的输出是完全由误差驱动的响应很难做到极致跟手。加入角度目标值的微分前馈可以在误差产生之前提前发出角速度指令手感会立竿见影地提升。这也是很多飞控中“遥控器前馈”RC Rate / Feed Forward参数的原理。LQR线性二次型调节器是另一条路。通过状态空间把所有姿态状态放在一起用一个权重矩阵去加权每个状态的代价求得最优反馈增益矩阵K。相比手调PID的一层层费劲LQR参数设计理论上更系统化但对模型精度要求高算力开销也更大。小型无人机上有人跑LQR控制姿态性能确实更平滑但实际工程中调试门槛并不低。自适应与智能控制比如模糊PID、基于强化学习的PID整定更多适用于模型不确定、参数时变的场景。比如载荷变化很大的货运无人机传统固定PID没法在不同负载下都保持最佳性能自适应方案就能在线调整增益。我想说的是PID是这一切的基础。你把它玩明白后面学LQR、滑模、自适应控制甚至仿真实训平台里的强化学习都会顺畅很多。因为你已经理解了“反馈”的本质误差驱动修正控制改变世界。7. 一些个人体会玩飞控这几年最大的感悟是PID调参不是数学题更像是和飞机“交流”的技艺。你给的Kp、Ki、Kd其实就是你告诉飞机“要大胆”“要记得”“要克制”的三句话。参数调顺的飞机手感是浑然一体的推杆它就去松杆它就停横滚干净利落悬停稳得像钉在半空。那种感觉很难用语言描述但飞一次就懂。最后分享一个小技巧调参前先给所有电机做一次全面的校准和动平衡再把机架减震处理好。很多所谓PID调不好的问题其实是振动噪声从源头混进了IMU的数据里参数怎么调都白搭。我见过太多新手把时间耗在反复改参数上却没想到先给飞控贴一层减震棉。数据干净了PID的Kd才能真正发挥作用。先让硬件可靠再谈调参手法这是我认为最值得记住的一条经验。