十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

四旋翼无人机PID控制与串级PID调参实战

四旋翼无人机PID控制与串级PID调参实战 第一次在户外把无人机切到定高模式悬停时大多数人会感叹一句它天生就会飞。其实那个稳如老狗的悬停背后是飞控以毫秒为周期在反复犯错和纠错——姿态歪了立刻修正风一推马上顶回去。真正等我把电机全停、或者把姿态环关掉让飞机“自然”保持平衡绝大多数四旋翼会在零点几秒到两三秒内滚向一侧然后摔得四分五裂。要弄懂无人机控制理论绕不开PID这个名字。这篇内容是我整理无人机控制理论系列里的第10讲核心就一个词PID。我会从四旋翼为什么必须靠主动控制才能稳住讲起把比例、积分、微分三个环节的物理直觉讲透再说清楚为什么工程上不用单级PID而要用串级PID最后给一条能真实落地的调参路径以及一堆只有动手踩过才会知道的坑。适合准备入手飞控开发、正在用STM32做无人机或者想把PID调参从“凭感觉”变成“按逻辑”的朋友参考。1. 悬停的魔法背后一个“天生不想老实待着”的物理系统1.1 四旋翼为什么是所有飞行器里最难自稳的一种固定翼飞机有气动外形机翼上反角、后掠角天然提供横滚和偏航的回中力矩很多固定翼甚至不需要任何反馈控制光靠气动配平就能平飞很远。直升机虽然有复杂的挥舞铰和摆振铰但主旋翼系统也能提供一定的自稳趋势。四旋翼呢没有机翼没有尾桨四个旋翼只产生向上的推力机身本身没有任何气动回复力矩。你把它往右推一个角度它就保持那个角度往右加速漂移不会自己回来。所以“悬停”这种看似静态的状态本质上是一个持续动态平衡的过程。飞机每一毫秒都在受到重力、推力、空气阻力和各种随机扰动飞控的工作就是让这些力的合力恰好保持在期望方向。这也是无人机控制理论里第一个要建立的观念不是姿态稳定了位置才稳定而是每时每刻都需要主动地把姿态按在期望值上。1.2 四个输入管六个自由度欠驱动意味着什么四旋翼有六个自由度三个位置分量x/y/z三个姿态角横滚/俯仰/偏航但只有四个电机输入这在控制论里叫欠驱动系统。这意味着你不能独立控制所有自由度而必须通过姿态去间接控制位置。想往东飞不能直接朝东推而是要先横滚一个角度让推力向量出现水平分量产生侧向加速度然后再回到水平。这一层关系也决定了位置控制永远建立在姿态控制之上姿态环路是整个飞控里最底层的“地基”。既然是欠驱动四个电机之间就必须有混控策略。横滚动作依靠左右两侧电机转速差实现俯仰依靠前后电机差偏航依靠对角线电机组的反扭矩差。每一路电机输出都同时承载着油门、横滚、俯仰、偏航四个通道的贡献。所以PID算出来的不是“某个电机该转多快”而是“这个轴的修正量”修正量要叠加到基础油门后再分发到四个电机上。1.3 失控的时间窗口到底有多短有人可能觉得“我的飞机就算失控也会先晃两下吧”实测下来的窗口其实很短。以一台轴距250mm、总重500g左右的四旋翼为例悬停时的角加速度随便就能达到每秒几百度。在简化模型里没有反馈控制的情况下一个姿态偏差持续0.3秒就足以产生肉眼可见的明显倾斜和横向位移持续到0.5秒以上基本就从“姿态歪了”滑向“姿态不可恢复”。所以飞控的控制周期不能是几十毫秒量级必须是毫秒甚至亚毫秒量级。常见的做法是陀螺仪角速率环跑1kHz也就是1毫秒一次角度环跑250到500Hz位置环更慢100Hz都够用。理解了这个时间尺度再回头看PID参数很多数字就没有那么“拍脑袋”了。提示不同飞行器的“失控窗口”不同。机架越大、转动惯量越大窗口越长穿越机这类小惯量机型窗口极短。这也是为什么穿越机的PID必须激进、而大疆类航拍机可以用相对平缓参数的原因之一。1.4 这一讲学完你应该能做什么能解释四旋翼为什么需要主动控制而不是“天生会飞”能说出PID三项各自的物理含义和对应场景能画出串级PID内外环的结构说明频率配比逻辑能独立完成一次真机调参的完整流程并看懂基本日志波形。2. 比例、积分、微分PID三个字母分别扛住了哪些扰动2.1 比例项姿态越偏纠正越猛比例项的公式很简单输出等于Kp乘以误差。误差是期望值和测量值的差值Kp是比例系数。把它类比成弹簧拉得越远弹回来的力越大。在四旋翼飞控里角度环的误差单位是度输出是目标角速率度每秒角速率环的误差单位是度每秒输出是电机修正量。假如只有比例项会出现一个很典型的问题回中速度太快时会冲过头然后反方向再追形成持续减幅振荡。Kp小了回中乏力、抗风差Kp大了振荡剧烈。比例项解决的是“当前偏差有多大”它只看当下不看趋势。这也是为什么单独一个P永远做不出手感干脆的飞行器。PID项主要作用参数过大的现象参数过小的现象比例项 Kp根据当前误差输出纠正量回中过冲、低频震荡回中迟钝、抗风差微分项 Kd根据误差变化趋势施加阻尼高频抖振、噪声放大过冲明显、收敛慢积分项 Ki累积历史误差消除稳态误差积分饱和、周期抽动悬停带角度、持续漂移2.2 微分项预测趋势给系统装减震微分项的输出等于Kd乘以误差变化率。误差变化率可以理解成“偏差正在变大还是变小变化有多快”。回到弹簧的比喻Kd相当给弹簧装了一个阻尼器——不是给当前位置回中而是给“回中速度”踩刹车。误差在快速减小的时候微分项输出为负抵消掉一部分比例项防止过冲当一阵风突然把飞机吹歪误差在快速增大时微分项抢先输出相当于提前预判让纠正动作比单纯P更早。这正是“先看趋势而不是只看位置”的含义。在角速率环里误差的微分本质是对陀螺仪测量值再求导近似得到角加速度而角加速度直接由电机差矩产生所以微分项能对执行器的动态特性做补偿等效于提前告诉电机“我快要转快了你先刹住”。但微分项有个天生毛病放大噪声。陀螺仪数据里多少都有振动和高频毛刺对着误差求导噪声会被放大好几个数量级。参数稍大PID输出就会跟着抖动飞机还没飞起来就开始“筛糠”。所以工程上通常会给D项加低通滤波或者把D放在测量值上而不是误差上避免设定值跳变造成D项冲击。2.3 积分项收拾比例和微分管不掉的“老偏”比例和微分配合得再好也会在一个场景下露馅持续存在的外部偏差。比如飞机重心装偏了或者水平悬停时遇到持续的侧风比例项每毫秒都在输出纠正但总有一部分误差消不掉飞机就始终带着一个固定角度飘。这就是稳态误差。积分项累加的是误差的历史总和。形象点说它像个记账本把之前没消掉的误差一笔笔记下来然后不停地给执行器叠加额外输出直到误差变成0。有了I项飞机才能做到即使在不对称重心和持续风力下也能回到水平。积分项的最大副作用是积分饱和。如果某个方向卡住或者大幅度打杆误差持续很大积分项飞快累积到一个非常大的值等误差方向变回来时这个巨额积分输出会让飞机猛地冲过头产生明显过冲甚至振荡。解决思路一般有几个限制积分输出上限、误差超过阈值时冻结积分、或者用back-calculation做抗积分饱和。调参时绝大多数“翻车”其实不是P或D的问题而是I给得太大、没有限幅。2.4 增量式和位置式PID飞控里该用哪种位置式PID直接输出绝对控制量公式是U(k) Kp·e(k) Ki·Σe(i) Kd·[e(k) - e(k-1)]增量式PID输出的是控制量的增量ΔU(k) Kp·[e(k) - e(k-1)] Ki·e(k) Kd·[e(k) - 2e(k-1) e(k-2)]飞控里两者都有应用。姿态环我倾向于直接用位置式因为姿态修正量本身绝对值不大可解释性强调起来直观增量式的最大优势是输出变化平滑、对累积误差不敏感在电机调速、云台控制、温控这类次级回路里更稳切换设定值也不会有“跳输出”的突兀感。新手自己写飞控代码建议姿态环用位置式电机转速或云台俯仰这类次级回路用增量式。3. 单级PID的局限与串级PID为什么飞控里总有两个环3.1 只用角度单环飞机会在哪里散架假设只做一个PID控制器输入是期望角度和当前角度的误差输出直接控制电机。从原理上它也能让飞机朝期望角度转但问题出在一个非常重要的物理事实电机和螺旋桨有惯性从PID输出到实际产生角加速度中间有延迟。更麻烦的是角度误差本身提供不了“飞机现在转得多快”的信息。同样的一个角度误差飞机可能正在快速转动也可能已经稳定不动了。单级PID在看到误差为零时以为任务完成了但实际上飞机正在以很高的角速度穿过目标姿态结果就是严重超调。这个现象在控制理论上叫相位滞后角速度信号比角度信号超前一个积分环节。你用角度误差直接驱动执行器相当于少看了一个状态量系统的相位裕度天然不够要么振荡要么反应迟钝。所以工程上的做法是不再让执行器直接吃“角度误差”让它先吃“角速率误差”。3.2 内环管“转多快”外环管“歪多少”串级PID在四旋翼上的标准结构是外环角度环输入期望角度和当前角度输出目标角速率。这一环关心“姿态歪了多少”它产生一句指令——“我需要以每秒多少度的速度回到期望姿态”。外环通常只用一个比例项把角度误差换算成角速率指令顶多加点微分辅助不需要太强的积分。内环角速率环输入目标角速率和陀螺仪测到的当前角速率输出电机修正量。这一环关心“现在转动得快不快”它才是真正直接推电机的控制器。内环P项决定了对旋转速度偏差的响应强度D项负责阻尼I项负责把持续外力矩干扰积分掉。合起来看效果就是外环慢悠悠地判断姿态该往哪走内环快速、用尽全力地让角速率达到外环要求。外环不用关心电机怎么实现内环也不用理会姿态最终停在哪个角度各管一段简单但极其有效。这也是“无人机串级PID”“内外环的作用与时间间隔”这类搜索高频词的答案核心。注意串级PID能够成立靠的是“时间尺度分离”不是“两个环叠在一起就行”。如果内环比外环快不了多少两个环会互相打架表现出来就是一阵一阵的低频振荡。3.3 内外环频率怎么配时间尺度分离原则工程上推荐的配比是内环角速率环跑1kHz外环角度环取250到500Hz位置环再往下放到50到100Hz。频率差至少2到4倍最好在4倍以上。自己写STM32控制循环时我习惯用计数器分频的方式1kHz主循环里做定时器中断每4次中断执行一次外环每10次或20次执行一次位置环逻辑清晰也不会被重复创建的任务拖着跑。如果用FreeRTOS这类操作系统注意不要让控制循环被调度器随意打断。姿态环建议挂在最高优先级的中断或任务里位置环可以稍低但所有实时控制相关任务都不应该被日志打印、串口转发这些IO操作阻塞。4. 从控制框图到实际飞行传感器、执行器和延迟的三角关系4.1 姿态数据是怎么来的IMU融合与滤波PID计算需要两个姿态类反馈角度和角速率。角速率直接由陀螺仪给出这个数据在动态下很准但陀螺仪会温漂纯积分出来的角度会慢慢跑偏加速度计在静态下能算出重力方向对应的角度但它对振动极其敏感机体一抖输出噪声就大而且直线加减速时还会被惯性加速度污染。所以必须做传感器融合。常用方案有互补滤波、Mahony和Madgwick。互补滤波的思路朴素陀螺仪积分出的角度有低频漂移就用加速度计算出的角度做高频修正相当于高通给陀螺、低通给加速度计。Mahony和Madgwick本质上是基于梯度下降或互补思路的姿态解算代码量不大在嵌入式上跑得很好主流开源飞控里都有现成实现。新手自己做飞控最容易忽略的是数据对齐。IMU读取、低通滤波、进入PID环路每一步的延迟都会叠加。如果滤波器截止频率设得很低比如100Hz以下相位延迟会非常大PID计算的不是“此刻”的姿态而是“几毫秒前”的姿态参数必然怎么调都不稳。这就是为什么很多飞控会用陷波器单点滤除桨频振动而不是一味用低通去压——低通把整个高频都砍掉相位损失太大。4.2 控制频率定多高才够延迟预算的计算控制链路的完整延迟包括IMU采样时间、滤波时间、控制计算时间、指令传输到电调的时间、电机和螺旋桨的机械响应时间。加起来就是从“姿态变化发生”到“执行器真正出力”的总延迟。算一笔简单账陀螺仪SPI读取按1kHz采样滤波后引入约1到2ms群延迟控制计算本身在STM32 F4上不到0.1msDShot信号从飞控到电调按几百微秒算电机机械响应是最大头微型无刷电机从转速指令变化到实际升力改变典型在5到20ms量级取决于电机尺寸、螺旋桨惯量和电调响应。整条链路加起来10ms以上延迟是常事。PID参数本质上是在补偿这个延迟。延迟越大相位裕度越小你越不敢把Kp调大一调大就振。所以你会看到一个普遍规律机架越大、螺旋桨越重、动力响应越慢PID参数就越保守穿越机用高kV小桨反应极快所以能承受很大的P值。直接抄别人的PID参数几乎必翻车因为参数是和整条物理链路绑定在一起的。4.3 电机和电调混控输出的最后一环串级PID内环输出的修正量要交给混控器叠加到四个电机的油门值上。这里有两个经常被忽略、但直接影响控制效果的环节。第一是电调协议。老式PWM电调刷新率低只有50到500Hz信号更新慢控制环跑再快也是白搭。现代飞控大多用DShot或Oneshot这类数字协议DShot 300/600意味着每次信号更新间隔只有1.66ms或0.83ms。如果控制目标是1kHz内环至少不能让电调协议成为瓶颈。自己在STM32上写驱动时建议直接上DShotPWM作为保底方案。第二是油门到升力的非线性。电机输出的升力大致和油门PWM的平方成正比同一个PWM增量在低油门和高油门时的升力变化不同。所以调参经验里常提到“给油门曲线做中值补偿”或者把PID输出做线性化映射。对入门阶段来说知道这个非线性存在、不要因为高低油门手感差异大就怀疑PID参数就行。4.4 先在仿真里看振荡再上真机调参前我非常推荐先在仿真里把系统跑通至少建立“参数—响应”的直觉。Simulink、Gazebo配PX4固件或者自己用Python写一套简化的四旋翼动力学模型都可以。把四旋翼简化成积分环节和二阶环节的组合给不同P/I/D值能立刻看到欠阻尼振荡、过阻尼和理想回中之间的差别。这个“先看波形”的过程能帮你从数学而不是手感去理解PID。真机上电测试时建议用螺丝刀或台钳把机架固定住做锁定测试。油门不要推太高观察在手动输入下各轴修正量是否正常、有没有高频啸叫。锁定测试会产生很强的气流一定要卸桨或者保持安全距离这是常识但我在线下交流时见过不止一次有人抱着带桨机架做测试风险极大。5. 手把手调出一组能用的PID参数5.1 调参前的设备和安全检查我每次调参前的固定流程是这样的卸桨或者去空旷无人的室外场地二者至少占一样确认电池电量充足但不要用刚充满的满压电电压高低会影响动力响应检查螺旋桨是否破损、有没有明显动平衡问题把飞行模式切到手动或自稳模式关闭GPS、定高这类附加回路避免干扰判断准备好数传链路或SD卡日志确保能实时看波形、改参数。安全这条永远排在第一位。螺旋桨高速旋转时划伤能力极强调参测试一定要养成“先想清楚下一步动作、再动手推油门”的习惯。5.2 从内环P开始寻找振荡临界点通用整定顺序就是“从内到外”先内环角速率环再外环角度环最后位置或速度环。以小型四旋翼、内环1kHz、外环250Hz为例我常用的流程是第一步把外环P、I、D全部设成极小值让外环基本不参与内环I和D也设成极小值只留内环P。逐步增大内环P每次加20%到30%然后给飞机一个小扰动比如小角度打杆或用手轻轻推一下机身观察响应。一开始飞机会响应迟钝、偏转后慢慢回中P继续加大回中变快但会出现明显的欠阻尼振荡也就是飞机“抖”或“点头”的临界状态。记录下这个P值回退到它的50%到60%作为内环P初值。第二步把D项加回来从很小值开始逐步增加每加一次都观察高频振荡有没有变大。D的作用是给内环增加阻尼适当加大会让之前的振荡明显收敛、回中变干脆。但D太大陀螺仪噪声会被放大成高频抖振听起来像电机在频繁摆速。记住这个特征D大了是“细碎高频抖”P大了是“整体低频晃”。第三步I项放最后。内环I解决持续外力矩比如重心偏离、螺旋桨气流导致的恒定角速率误差。把飞机悬停起来观察有没有滚转或俯仰方向缓慢漂移如果有缓慢增加I项直到漂移被抑制。每加一次I都要检查悬停时有没有出现周期性的“一抽一抽”低频振荡那是积分饱和或I过大拉出的极限环。5.3 快速初值的估算Ziegler-Nichols的实际用法Ziegler-Nichols临界振荡法可以用在内环先只加P找到等幅持续振荡时的Kp记作Ku同时记下振荡周期Tu然后套经典公式Kp等于0.6倍KuKi等于2倍Kp除以TuKd等于Kp乘以Tu除以8。但这个公式在无人机上通常偏激进尤其是Kd。我的用法是把它当“上限参考”而不是“最终值”算出来的Kp再往下压20%到30%做起步值Kd直接减半起步。Z-N方法的真正价值在于给了一个靠谱起点而不是一上来就盲猜。实际操作中很多老飞手是根据机架尺寸和动力响应经验直接给初值的比如250级别穿越机内环P常在0.04到0.08之间但注意不同固件的归一化单位不一样。自己写STM32代码时如果角度用度、角速率用度每秒、输出是0到1000的PWM修正量P可能就是个零点几到几的小数。单位不同导致数字差异巨大抄参数前先搞清楚量纲否则会怀疑人生。5.4 外环与积分项的精细调整内环收敛后开始调外环角度环。外环输入是目标角度输出是目标角速率本质就是一个位置式P控制器。外环P太小打杆时机身反应肉、回正慢P太大打杆瞬间会出现明显的“点头”或“顿挫”因为内环在拼命追一个剧烈的角速率指令。外环一般不需要加I内环I已经扛掉了大部分常值力矩外环I加多了反而容易在转弯机动时产生积分过冲。外环D也不常用真要用也是很小的值作用是给外环角速率指令加一点平滑。调完姿态环再往上层走有定高或GPS模式的话依次调垂向速度环和水平位置环。这个阶段如果发现姿态环单独悬停很稳切到定高或返航后却各种荡绝大多数问题出在上层环路甚至传感器比如气压计受桨流干扰这时候不要急着继续加PID先查数据源。5.5 用日志和手感判断最终状态判断一组参数是否合格我看三个维度手动模式小角度打杆回中干脆一两次轻微过冲后即收敛没有持续振荡悬停稳定性飞机保持在直径0.5米左右的范围内缓慢漂移没有周期性抽动油门修正幅度稳定日志波形角度环误差曲线没有明显高频毛刺角速率环指令和实际值之间没有持续追赶的“追尾”现象。有条件一定要开日志。参数看起来差别很小的两组数在波形上往往能看出一个已经贴地飞行、另一个还在周期振荡。养成看日志的习惯比什么调参玄学都可靠。6. 那些参数之外的问题我的翻车经历和进阶方向6.1 积分饱和、振动灌入、频率不足——典型翻车现场我自己踩过几个很典型的坑拿出来说可能比参数本身更有价值。第一个坑是积分限幅没做结果满油门救机时飞机像弹簧一样反向弹出去。当时在自稳模式下测试大幅度打杆纠正后扳回中位飞机没有停住反而朝反方向猛甩了一下。翻日志发现内环I在打杆期间累积到了限幅值上限杆回中后积分还在维持巨大输出等误差反向才慢慢吐出来表现就是猛甩。解决方法是把I的限幅收紧并对I项做条件积分误差大于阈值时停止累积。第二个坑是陷波器没加D项把螺旋桨振动直接灌进电机。具体表现是飞机在空中轻微“噤颤”内环输出波形有明显高频正弦叠加。后来对陀螺仪数据做FFT发现峰值正好落在螺旋桨转速对应频率附近加了对应该频点的陷波滤波器后同样的D值立刻变干净。这说明之前抖振不是D给大了是D算的“转速变化”里混着振动噪声。第三个坑是控制频率不够。早期用I2C读取MPU6050采样率勉强跑到400Hz还想让外环和内环共用这个频率结果怎么调参数都稳不住飞行时像喝多了。后来改用SPI加中断采样把IMU数据率提到1kHz同样的PID参数竟然直接可用。这个经历让我彻底记住先把硬件链路和频率预算做对再谈调参。6.2 PID之外从经典控制到现代控制PID在四旋翼上够用且好用但它不是终点。想进阶的话有几个方向值得关注。模糊PID是在PID外面加一个模糊推理层根据误差大小和误差变化率动态调整Kp、Ki、Kd实质是把调参经验编码成规则。在环境变化大的作业无人机上有应用案例但调试复杂度高而且要慎防规则库设计不当导致非预期行为。LQR线性二次型调节器把四旋翼的线性化状态空间模型写出来用代价函数求解最优状态反馈增益。它的一次性处理多状态耦合能力更强数学上更系统缺点是对模型精度依赖高模型一偏鲁棒性反而不如PID。自适应控制和强化学习PID目前大多还停留在研究与Demo阶段。对入门者来说先把PID物理想透、调一遍真机、看懂日志已经是很大进步。等你能准确说出“这个现象是D太小还是P太大”的时候经典控制的素养就到位了。6.3 给自学者的路线参考结合很多新手问“无人机学习路线”时的困惑我给出一个比较务实的顺序第一层动力学基础。回答“四旋翼为什么能飞、为什么需要主动控制”本篇第一部分基本覆盖。第二层传感器与数据处理。IMU、姿态解算、互补滤波或Mahony至少能看懂源码。第三层控制回路。先单级PID再串级PID在仿真里跑通再上真机调一次完整参数。第四层工程化。配一个STM32最小系统、MPU6000和四个电调写一个能悬停的最小飞控。这个工程量不小做完之后你对整个系统的理解会完全不一样。第五层上层应用。定高、GPS定位、避障、路径规划、视觉感知、编队飞行这些全建在姿态环之上姿态环不稳上面全白搭。我见过不少爱好者倒在第二层和第三层之间——真机还没飞稳就想上视觉和编队最后把姿态问题误判为算法问题反复折腾。控制理论入门的耐心比天赋重要得多。最后分享一个小习惯我每次调参前都会把上一版参数和波形截图存好。参数和机架是绑定的换一次螺旋桨都可能推倒重来但保存下来的波形对比会让你少走很多弯路。等哪天你盯着日志能一眼看出“这个尖峰是机械振动还是控制振荡”的时候就说明你已经真正理解无人机是怎么保持稳定的了。
返回列表