1. 定高控制为什么总在“飘”?先把PID的底层逻辑讲透
玩无人机的朋友应该都有这种体验:刚把飞机解锁推油门,高度好不容易稳住,结果一阵风过来,飞机像坐电梯一样猛地窜上去,或者突然掉高度,你拼命打油门想救回来,结果飞机开始有节奏地“点头哈腰”,越调越糟。其实这不是你的手法问题,而是你还没真正理解定高模式下PID在干什么。
先说清楚一个概念:定高模式不是“锁死高度”,而是“维持高度”。飞控里的气压计或者视觉/激光传感器一直在测量当前高度,PID控制器拿这个测量值和你的目标高度做差,算出一个“纠正量”,然后把它叠加到油门上。这个纠正量如果不合适,就会出现三种典型毛病:反应太慢(高度一直在缓慢漂移)、反应过头(飞机上下振荡)、或者干脆“神经质”(油门乱跳,电机声音忽高忽低)。说白了,定高调参的核心就是调这三个数字——P、I、D,让纠正的力度和时机刚好合适。
很多新手一上来就盯着调参界面里的P、I、D三个数字猛改,这是最大的误区。先建立正确的心理模型:P是“当下错了多少就纠正多少”,I是“一直错了就持续累积纠正”,D是“纠正的速度太快了就踩刹车”。定高控制里,P管高度偏差的即时响应,I管长时间的高度漂移和风压干扰,D管飞机在目标高度附近来回穿越的趋势。理解了这三句话,你后面调参才有方向,不然就是瞎碰运气。
这篇文章就是写给刚接触无人机飞控、面对调参界面一头雾水的新手。我会从最基础的理论开始,讲清楚定高模式下PID每个参数的实际作用,再给你一份可以直接照着操作的完整调参流程,最后分享我这些年踩过的坑和总结出来的排查套路。内容以常见的开源飞控(比如ArduPilot和Betaflight系)为例,但思路完全通用,不管你是飞四轴、固定翼还是穿越机,看完都能上手。
2. 调参前的准备:先排除“假故障”,再动手拧参数
2.1 硬件安装和传感器状态检查
我见过太多新手花了一下午调PID,最后发现飞机根本没法稳定是因为螺旋桨装反了,或者飞控没固定好,震动数据吓死人。调参之前请务必花十分钟做一遍系统检查,这十分钟能帮你省掉后面至少三小时的无效工作。
第一,电机和螺旋桨。确认每个电机转向正确,螺旋桨的正反桨装对位置,桨叶没有破损变形。你可以用地面站软件的电机测试功能逐个点动,确认转向和顺序没错。第二,飞控安装。飞控一定要用减震棉或者减震柱固定在机架中心附近,并且保持水平——注意是飞控本身水平,不是“看起来水平”,很多机架电池绑带压着飞控,松紧不同都会影响姿态数据。第三,传感器校准。加速度计、陀螺仪、气压计、罗盘,每一项都要在无风、远离铁磁物体的环境下重新校准。
2.2 震动水平必须达标
定高最依赖的就是气压计,而气压计最怕的就是高频震动。如果飞控震动过大,气压计的读数会变得非常嘈杂,高度数据跳来跳去,PID拿到这些“脏数据”根本没法正常工作。所以正式调参前,一定要看震动日志。
以ArduPilot为例,飞控记录里的Vibe数据(振动数据)在水平飞行时一般要求在30以内,悬停时最好控制在15以内。如果你看到震动数值狂飙,先解决减震和电机平衡问题,再回来调PID。Betaflight系就打开陀螺仪示波器看,正常悬停状态下波形应该是窄带低频的,如果波形上叠加了密密麻麻的高频毛刺,说明震动不达标。别急着调参数,先把这些物理层面的问题解决掉,不然你调的每个参数都会失真。
注意:震动不达标的飞机,你调的PID参数会看起来特别奇怪——P怎么调都感觉“软绵绵”,或者D稍微一加就疯狂振荡发热。这其实不是PID的问题,是传感器数据已经被污染了。
2.3 初始参数从哪里来
很多新手纠结初始PID给多少合适,其实大多数飞控固件自带的默认参数在普通250mm~450mm轴距的机架上已经能飞了。你只需要把默认参数恢复一下,然后在此基础上做微调。ArduPilot进“完整参数树”找到PID栏目重置默认即可;Betaflight直接在CLI里输入“defaults”回车。如果你用的是比较冷门的飞控固件,可以参考相近尺寸和推重比机型的开源PID配置,作为起点。
需要强调一下,初始参数的意义不是“直接飞到完美”,而是“能安全起飞并观察到问题”。只要飞机能悬停住、没有剧烈振荡,哪怕高度会上下飘,这个初始参数就合格了,可以开始正式调参了。另外一个容易被忽略的点:调参时一定要在无障碍的室内环境进行,地面有软垫最好,或者去空旷草地外场,心理压力会小很多。
2.4 遥控器、模式的设置确认
调参前把定高模式(Loiter、AltHold)和自稳模式(Stabilize)设定在同一个三段开关上,方便随时切换。测试的时候先在自稳模式下把飞机飞稳,再切到定高模式观察问题——这个习惯能救命。如果定高后姿态控制本身就乱,你很难判断是PID的问题还是定高控制的问题。
同时,确保遥控器的油门通道中立点设置正确,也就是油门摇杆在中位时,飞控收到的油门值在50%附近。因为很多定高调参流程里,油门摇杆“不回中”是导致高度一直改变的直接原因之一,但这个原因检查起来非常快,一分钟就能排除。
3. 定高PID调参实战:从“勉强能飞”到“稳稳悬停”
3.1 理解定高控制链路:不是只调“高度PID”一个环节
绝大多数飞控的定高控制是两层的,不是把PID输出直接作用到电机上。以ArduPilot为例,外环是位置环,负责“保持高度”;内环是速度环,负责“以多少速度靠近目标高度”。你调高度P和I,实际上是在调外环,而内环的速度PID通常默认就够用。但很多新手不知道这个结构,上来就猛调速度环,结果越调越乱。
用生活化类比理解:把定高控制想象成开手动挡汽车上坡。外环就是你盯着坡顶那个标记,判断“我现在差多少米”;内环就是你的脚在油门上,决定“用多大力气加速上去”。外环反应太慢,你会觉得车子慢悠悠怎么也到不了准确位置;内环反应太猛,车子就会一下冲过去又倒回来,反复顿挫。
所以你在调高度PID的时候,重点观察的是“高度恢复的速度和超调量”,而不是电机响应快不快。高度P加大,飞机对高度偏差的响应会更积极,但P太大就会上下振荡;高度I加大,抗风效果更好,但I太大会让飞机对任何高度偏差都反应过度;高度D的作用是在飞机快要到达目标高度时提前“收油”,抑制超调。
3.2 一步一步调:从高度P开始
我的习惯是先调高度P,再调I,最后微调D。具体操作步骤如下:
第一步,先把高度I和D设成0,高度P设成一个保守的值。ArduPilot的AltHold默认P值在1.0~2.0之间,Betaflight系高度保持相关参数类似,你可以先从较低值开始。
第二步,切到定高模式,把油门打到50%附近,让飞机离地1米左右,观察现象。P值太低的表现是:飞机上下缓慢飘动,像在水里漂浮的软木塞,你推一下油门它才动一下,放开后又慢慢往下坠。把P值每次增加0.3~0.5,重新起飞观察,直到飞机对高度变化的响应变得“有劲”了—你拨动油门摇杆让飞机离开目标高度后松手,它能比较快地回到目标高度,没有明显的迟钝感。
第三步,继续加大P直到出现轻微的持续振荡(飞机上下小幅快速抖动,像打冷颤),然后退回到振荡消失的数值,再略微减少一点,留出安全余量。这一步的目的是找到“临界P值”,然后取这个值的70%左右作为最终P值。调参理论里这叫“临界比例度法”,用在定高上非常实用。
3.3 高度I:解决“永远回不到零点”的顽固偏差
当P调好之后,你会发现一个现象:飞机在无风状态下能保持高度了,但只要有轻微的风或者螺旋桨气流干扰,高度就会稳定地偏到一个错误位置。比如你设的悬停高度是1米,但飞机老老实实停在1.3米,风停了也不下来。这就是I项该上场的地方。
I项的本质是一个积分器,它会记住“长期以来一直存在的偏差”,然后主动输出额外修正。调I的时候,我习惯每次增加0.05~0.1(ArduPilot单位的经验值),起飞后人为制造一些干扰——比如用手把飞机轻轻往下压一下再松开,或者开个风扇对着吹。观察飞机能否在这些干扰过后回归原高度。如果回归速度太慢,继续加I;如果飞机开始出现低频率的“呼吸式”上下起伏(通常周期几秒钟,看着像在喘气),说明I过大了,退回去减少一些。
这里有个实操技巧:I不要只看悬停表现,一定要测试“有风干扰后的恢复能力”。很多新手悬停看起来稳就收工了,结果一到外场有风就露馅。定高模式的价值本就是为了对抗干扰,所以我每个I值都要做三次干扰测试,再决定去留。
3.4 高度D:压住超调的最后一环
D项在定高控制里不像P和I那么关键,但它对抑制超调很有帮助。尤其是飞机比较重、惯性大的机架,或者气压计数据本身有延迟的情况,P调得稍微高一点就会产生上下穿越目标高度的振荡,D能有效“刹车”。
D的调整思路同样是从0开始慢慢加,但需要注意的是,D对传感器噪声非常敏感。如果气压计数据不够平滑,D加太多会把噪声放大成实际的电机抖动。判断标准是:加上D之后,悬停时电机声音应该变得更平稳,如果电机声音变得尖锐、混乱,说明D加过头了。
我的经验值范围是D取P的1/20到1/10作为起点,观察飞机在离地后是否有“干脆利落”的刹车感。如果没有明显改善,就不强求加D,很多机型定高用PI就够了。
3.5 验证测试清单
调完一轮PID后,不要急着收工,按照下面的清单做一次完整验证:
- 悬停测试:定高模式下油门放中位,飞机能不能在一分钟内保持高度误差在±0.2米以内。
- 阶跃响应测试:快速推油门让飞机上升0.5米然后松手,观察它回到原高度的过程,有没有超调超过0.3米、有没有来回振荡超过两次。
- 干扰恢复测试:用手轻压飞机(注意安全,螺旋桨拆掉或者人站侧面),看它能否迅速恢复悬停高度。
- 室外风场测试:在二三级的微风天气,看定高模式下飞机有没有明显的慢漂移。
每一项测试都通过,你的定高才算调完了。说实话,这个过程看起来麻烦,但熟练之后二十分钟内就能搞定一轮,剩下的就是根据飞行风格微调了。
4. 常见定高PID问题与排查技巧实录
4.1 高度数据跳变、飞机突然猛升猛降
这个现象我遇到得最多。排查思路是先用飞控日志看气压计数据是否稳定,很多廉价飞控集成的气压计在受到阳光直射或者风直吹时,读数会忽然跳变。解决方法包括给气压计加上遮光海绵(很多飞控板出厂自带,但装的时候容易弄丢)、检查气压计通气孔是否被胶水或者灰尘堵住、避开桨叶气流直吹位置。
还有一种情况是电调响应不一致。比如某个电机响应油门的速度明显慢半拍,飞机为了维持高度就会不断加大油门,最后变成猛冲。这就不属于PID的调节范围了,你得先校准电调行程,确认四个电机的手感一致,再回来审视PID参数。
4.2 飞机定高时一耸一耸的“点头”振荡
这种高频的小幅垂直振荡,第一嫌疑是P值过大,第二嫌疑是D值过大导致的噪声放大,第三才是传感器问题。我一般按顺序处理:先退回上一个稳定的P和D组合,确认振荡消失;然后只加P,找到振荡临界点,取余量;再加D做微调。如果P和D都在合理范围还是振荡,检查气压计是不是受到了桨叶气流冲击。
这里分享一个独家心得:把螺旋桨的尺寸调小一点或者换用桨距更小的桨,也能减少气压计区域的湍流。当然这个属于“旁门左道”,但如果你的机架设计导致气压计正好在螺旋桨正下方,效果很明显。
4.3 定高悬停很稳,但一前进就掉高度
如果你发现飞机在悬停时高度稳得很好,一推前进油门,高度就开始缓慢下降,而且怎么调整油门都补不回来,这通常不是高度PID的问题,而是姿态控制和高度控制之间的耦合问题。飞机前倾飞行时,螺旋桨的升力垂直分量减小了,飞控需要用更大的油门来补偿,但位置控制里的速度反馈可能不够敏锐,导致飞控没意识到“飞机因为前倾而在掉高度”。
解决思路有两个方向:第一,把高度PID的P和I适当增加一点,让高度保持更加“强硬”;第二,检查速度控制相关参数,让飞控对垂直速度的变化有更快的感知。ArduPilot里可以适当增大“垂直速度控制器”的P值。我试过几种做法,第二种往往更有效,因为它在问题刚发生时就从源头纠正了。
4.4 定高模式下飞机漂移不停
有些飞机定高模式下高度是稳了,但水平方向一直往一个方向漂,推杆回中后也不停止。这个问题要分清是定高模式的独特问题还是其他问题。如果你在自稳模式也有漂移倾向,那是姿态水平和加速度计校准的问题,跟PID无关。如果自稳模式正常、切到定高才漂,那大概率是L