PX4多旋翼位置控制MPC参数详解:从原理到实战调参

PX4多旋翼位置控制MPC参数详解:从原理到实战调参 玩多旋翼的飞手应该都有这种经历装好一架飞机解锁推油飞机起来了但一松杆就飘或者定位时来回画圈甚至稍微来点风就“抽风”。很多人第一反应是陀螺仪、加速度计没校准或者电调油门行程有问题。但如果你排查完这些飞机还是不对劲那大概率问题出在PX4飞控参数里的Multicopter Position Control也就是多旋翼位置控制这一整块参数上。这块参数在PX4里基本都以MPC_开头它们决定了飞机在GPS或光流定位模式下如何“理解”你想让它去哪、以及怎么去。换句话说姿态环只负责让飞机机身稳位置环才决定飞机在空间里怎么移动。这篇东西我打算把PX4位置控制的原理、MPC_参数组里的核心项、以及我自己做仿真和真机调参时踩过的坑一次性讲清楚。如果你正在搭PX4开发环境、跑Gazebo仿真或者新飞机定点模式飞得很难受这篇应该能帮你省下好几个晚上的排查时间。1. 位置控制到底在干什么从外环到内环的控制链路1.1 串级PID为什么不用一个环解决很多人第一次接触PX4位置控制时会问一个问题我明明只需要飞机飞到某个坐标为什么搞出这么多环和参数原因很简单单环控制解决不了“又准又稳”这个问题。假如你直接根据位置误差输出油门和姿态角那飞机接近目标点时速度往往已经很大结果就是冲过头、来回振荡而且一旦遇到风或者负载变化纯位置环根本来不及修正。PX4的做法是典型的串级PID结构位置环在外面速度环在里面姿态环在最里面。位置环的输出不是油门而是期望速度速度环拿到期望速度后输出期望加速度加速度再换算成期望姿态角和总油门交给姿态控制器去执行。这种设计的好处是每一层只负责自己那一件事带宽从内到外递减外层即使参数稍微保守一点内环也能及时把扰动消化掉。实际在PX4源码里这个逻辑在src/modules/mc_pos_control/PositionControl.cpp里实现核心就是两个函数positionControl()处理位置到速度velocityControl()处理速度到加速度。整条链路跑在50Hz左右姿态环那层通常是250Hz到400Hz。理解这个频率差很重要因为你会发现位置控制参数不能调得太激进内环跟不上外环再激进也没用。1.2 从期望速度到位姿指令的推导我再把一个关键推导说透方便你后面看日志时知道每一步在干什么。位置环的输入是期望位置和当前位置的差经过比例增益MPC_XY_P后得到期望水平速度。但不是单纯乘完就行PX4还会对这个速度做限制并且叠加一个前馈速度项用来补偿目标点本身在移动的情况。这个前馈在航线任务里特别有用否则飞机每到一个航点都得先减速再加速飞出来就是一顿一顿的。速度环拿到期望速度后同样做比例控制再加上积分和微分输出期望加速度。水平加速度不能直接给电机它要换算成机体倾斜角因为水平方向的加速靠的是倾斜机身分解推力所以PX4会根据期望加速度算出期望横滚角和俯仰角再把角度指令发给姿态控制器。垂向通道就简单一些期望加速度换算成总油门变化量叠加在悬停油门MPC_THR_HOVER上。这里有个容易被忽略的约束参数MPC_TILTMAX_AIR。它决定了飞机在空中允许的最大倾斜角直接影响期望加速度上限。比如这个值设成30度那水平加速度最多也就能到0.5g左右你再怎么调速度环P飞机也不可能更快地水平加速这也是很多人“调了半天没效果”的原因之一——真正卡住你的是约束参数不是PID。2. 核心参数逐个拆解位置环与速度环的关键项2.1 位置外环MPC_XY_P与MPC_Z_P先看水平位置环。MPC_XY_P是水平位置比例增益单位是1/sPX4默认大概在1.5左右。你可以把它理解成“位置误差多大对应多快的期望速度”位置偏差1米期望速度大约就是1.5米每秒。这个值设太小飞机会显得迟钝离目标点很远就开始减速漂到目标点附近慢慢悠悠地磨设太大飞机会很“冲”接近目标点时速度依然很快容易超调然后来回穿越目标点看上去就是画圈或“蛇形走位”。我在SITL仿真里测过一组对比MPC_XY_P从1.5改到3.0位置阶跃响应的超调从差不多没有直接涨到15%以上回到稳态的时间也变长了。所以如果你只是想改善定点精度先加一点P比如到1.8到2.0别一口气翻倍。MPC_Z_P是垂直位置比例增益默认1.0左右。垂向通道的调试逻辑跟水平类似但因为垂向有旋翼下洗、地面效应、气压计漂移这些干扰实际中我很少把它调得比默认大很多。如果你发现飞机定高时上下缓漂先检查气压计和悬停油门MPC_Z_P顶多加到1.2到1.5就够了。2.2 速度内环MPC_XY_V_P、MPC_XY_V_I、MPC_XY_V_D速度环才是位置控制里真正干活的部分它的性能几乎决定了飞机好不好飞。MPC_XY_V_P是水平速度比例增益默认约2.8。这个值控制“速度误差对应多大加速度”速度误差1米每秒期望加速度约2.8米每二次方秒折合重力加速度的0.28倍也就是大概16度的倾斜角。如果这个值偏小飞机对速度变化不敏感松杆后滑行距离长偏大会出现高频抖动尤其在急停时飞机会前后点头甚至振荡。MPC_XY_V_I是速度积分增益默认值很小大概0.05到0.1。积分的作用是消除稳态误差比如持续侧风时如果只有P控制飞机会一直保持一个漂移速度来对抗风力有了积分项才能慢慢逼近目标位置。这里要特别强调速度环积分不要给大。我见过有人为了抗风把MPC_XY_V_I从默认调到0.5结果就是飞机在狂风天里疯狂振荡因为积分项和位置环的P项在互相打架形成低频极限环。抗风首要应该靠位置环P和速度环P积分只是补零头。MPC_XY_V_D是水平速度微分增益默认0.2左右。微分项用于抑制速度变化率说白了就是给系统加阻尼。在真机上我建议微分项先保持默认不要急着加只有当你发现速度响应有振荡趋势、但又不方便降P的时候才小幅增加D。因为D对噪声极其敏感尤其在GPS速度噪声大的环境里D反而会把噪声放大成抖动。垂向也有一组对应参数MPC_Z_V_P默认约4.0MPC_Z_V_I默认约1.0MPC_Z_V_D默认接近0。垂向速度环P可以比水平大一些原因是垂向通道动力学简单、没有倾斜角换算这个过程但同样不要给过大的积分尤其是用气压计定高时气压计本身就慢积分大了容易触发低频振荡。2.3 与自动调参、前馈相关的边界一个常见的误区是认为QGroundControl里的自动调参AutoTune能连位置控制一起调好。实测下来不是这样PX4自动调参调的是姿态内环rate controller最多覆盖到速度环的一部分位置环的比例增益它基本不会帮你优化。所以想调好位置控制还是得自己动手。另外一个容易忽略的增益是MPC_XY_V_ACC这个参数在位置控制里作为“速度环前馈加速度”的开关或权重出现不同固件版本略有差异。当你把它打开或者增大后飞机会更积极地响应速度设定值的变化航线跟线性能会明显提升但如果内外环没匹配好也更容易超调。我的习惯是先把P、I、D调到悬停稳再开前馈一点点加。3. 约束类参数巡航速度、最大速度、加速度与Jerk3.1 MPC_XY_CRUISE与MPC_XY_VEL_MAX这两个参数很多人分不清。MPC_XY_CRUISE是巡航速度默认5m/s它表示飞机在执行航线时“心里预期”的飞行速度MPC_XY_VEL_MAX是最大水平速度默认12m/s左右它才是无论如何都不能超过的硬上限。为什么要有两个速度因为在位置控制里当位置误差比较大的时候期望速度不能直接拉到最大否则飞机一上来就全速冲刺到终点根本刹不住。PX4的做法是目标在较远距离时期望速度被限制在巡航速度附近只有当你给了更高的速度设定值比如任务里明确要求飞快点它才会突破MPC_XY_CRUISE往MPC_XY_VEL_MAX走。实际调参建议如果你是在小区或者狭小环境飞把MPC_XY_CRUISE降到2到3m/s手感会从容很多急停距离也短如果是测绘或者航点巡检保持默认甚至调到6到7m/s否则飞任务的时候你会嫌它“肉”。3.2 MPC_ACC_HOR_MAX与MPC_JERK_MAX这两个是位置控制里最“玄学”也最影响手感的东西。MPC_ACC_HOR_MAX是最大水平加速度默认约10m/s²差不多1g。它直接决定飞机倾斜角需求因为水平加速度等于重力加速度乘以倾斜角正切值忽略小角度近似时其实用正切更准确。1g对应45度倾斜已经在大多数多旋翼的姿态极限附近了。如果你用大六轴做巡检建议把最大水平加速度降到4到6m/s²一是省电二是机架和云台吃得消如果是竞速或花飞可以保持默认或者略高。MPC_JERK_MAX是最大加加速度jerk也就是加速度的变化率默认约8m/s³。这个参数初看不如PID直观但它在轨迹平滑上起了大作用。因为真实电机和桨叶不可能瞬间改变加速度如果期望加速度信号是阶跃式的飞机会猛点头。Jerk限制做得越大期望轨迹变化越锐利飞机响应越快但机身冲击也越大Jerk限制越小轨迹越平滑但飞机看起来会有点“发黏”。我发现很多新手调位置控制只盯着P和D死活不收敛最后发现是MPC_JERK_MAX设置过大加速度指令变化太陡机身结构响应不过来形成高频振动。真机上建议从默认值往下调比如4到6先让轨迹平滑下来再考虑提升响应速度。对于大型机架这个值甚至可以压到2因为大桨叶和大惯量对冲击更敏感。3.3 垂向运动限制MPC_Z_VEL_MAX_DN/UP、MPC_LAND_SPEED垂向运动限制经常被忽略但降落手感拉胯十有八九跟它有关。MPC_Z_VEL_MAX_DN是最大下降速度默认约1.5m/sMPC_Z_VEL_MAX_UP是最大上升速度默认约3到4m/s。上升可以快一点但下降必须慢。因为下降时飞机处在自己的下洗气流里气动干扰很严重下降太快飞机容易“掉高度失控”。我在真机上测试如果MPC_Z_VEL_MAX_DN设到2.5以上下降最后阶段很难稳住尤其在小机架上。MPC_LAND_SPEED是着陆检测阶段的下降速度默认约0.7m/s。这个值决定了飞机在识别到接近地面后以多快的速度完成触地。设太大会砸地设太小又会在离地几十厘米处悬停犹豫很久。我一般习惯是0.5到0.7之间配合停机坪或者软草地都很稳。垂向还有一组加速度限制MPC_ACC_UP_MAX和MPC_ACC_DOWN_MAX默认分别在2到3m/s²量级。如果你挂载了比较重的载荷建议把上升加速度降一点否则大油门拉升时负载的惯性会把机架“拉变形”姿态环也跟着遭殃。3.4 悬停油门MPC_THR_HOVER的作用严格来说MPC_THR_HOVER属于整机推力层的参数但它在位置控制里至关重要因为速度环输出的加速度会直接叠加在悬停油门附近做增量控制。如果这个值不准位置环等于在一个错误的基准点上做调节表现就是所有PID都调好了飞机却始终忽高忽低或者打杆响应左右不对称。获取悬停油门最佳方式是在无风环境下切增稳或手动模式悬停稳定后读取油门输出平均值写回MPC_THR_HOVER。不要直接拿默认值0.5去用不同机架桨叶效率差很多。我用SITL仿真时发现如果故意把MPC_THR_HOVER设偏10%垂直方向的速度跟踪误差肉眼可见所以这个参数在调位置控制前最好先校准掉。4. 调参与实战从仿真到真机的完整流程4.1 先学会读日志哪些曲线决定调参方向调参不能靠感觉得看数据。PX4的日志可以通过QGroundControl的Analyze View打开推荐用Flight Review网页版上传分析自动生成关键曲线。位置控制调参重点看四条曲线期望位置pos_sp与实际位置pos的差、期望速度vel_sp与实际速度vel的差、期望加速度acc_sp与实际加速度的差、以及横滚俯仰角度指令是否超限。我自己的判断套路是这样位置有超调但速度没有振荡多半是位置环P偏大速度曲线上下抖但加速度设定值很平多半是GPS速度噪声被位置环直接放大这时候要降MPC_XY_P或者增大速度环D如果速度设定值自己就在高频变化那就是加速度或Jerk限制太松先查MPC_JERK_MAX。有一个细节真机日志里GPS速度噪声本身就很大你看到的vel曲线毛刺是传感器噪声不代表飞机真在抖。真正要看的是姿态角指令vehicle_attitude_setpoint里的roll、pitch是否平顺。如果角度指令毛刺多说明噪声已经穿透到控制链路里了。4.2 一套可复制的调参顺序我踩过很多次坑之后总结了一套流程不管在Gazebo仿真还是真机上都能用顺序很重要乱了容易越调越糊涂。第一步先校准悬停油门MPC_THR_HOVER。手动模式稳定悬停读取油门均值写回参数。这一步不做后面垂直方向永远调不好。第二步调垂向速度环。观察定高模式下给定一个上升/下降指令速度响应是否快速且无超调。主要通过MPC_Z_V_P调整MPC_Z_V_I保持默认或稍减。第三步调水平速度环。在定点模式下打水平杆给一个阶跃速度指令看速度响应是否有明显延迟或超调。先调P再加一点D最后用I补稳态误差。这个阶段目标是打杆响应直接、松杆后能迅速停住而不来回晃。第四步调位置环P。在定点模式下重设一个目标点看位置响应是否平稳到达。位置环P的调整幅度要小每次加0.1到0.2观察整条链路的稳定性。第五步最后调整约束参数。根据机型和场景设定MPC_XY_CRUISE、MPC_ACC_HOR_MAX、MPC_JERK_MAX。约束参数会影响前四步调的PID的实际表现所以要放在最后定否则你前面调的P可能因为Jerk限制太紧或太松而显得无效。这里我特别想强调一下仿真的价值。跑PX4的Gazebo SITL熟悉这一套流程唯一缺点是没有真实风扰和电机延迟PID参数不能直接抄到真机上但调参思路和注意事项是完全共通的。我在仿真里再怎么乱调也不会炸机而且日志分析手法和真机一模一样。新手完全可以直接在Ubuntu里搭一套PX4仿真环境把每个参数改一下、飞一下、看一下曲线很快就能建立起“参数变化导致响应变化”的直觉。4.3 常见问题速查表我把实测中遇到过的问题和对应的排查参数整理成了一张表方便你按图索骥。注意表里的处理方向是“从哪入手”不是说改完就一定好还要结合日志判断。现象优先排查参数调整方向定点时来回画圈、低速振荡MPC_XY_P、MPC_XY_V_I位置环P适当减小速度环积分减小急停时前后点头、高频抖动MPC_XY_V_D、MPC_JERK_MAX增大微分或减小Jerk上限持续侧风下稳不住位置MPC_XY_V_I、MPC_XY_V_P小幅增加速度环I再增P航线直接“飞过站”MPC_XY_CRUISE、MPC_ACC_HOR_MAX降低巡航速度提高最大加速度降落时砸地MPC_LAND_SPEED、MPC_Z_VEL_MAX_DN降低下降速度上限定高上下缓漂MPC_THR_HOVER、MPC_Z_V_P先校准悬停油门再微调P整体跟手但很“肉”MPC_JERK_MAX、MPC_ACC_HOR_MAX适当提高约束上限速度环一给I就振荡MPC_XY_V_I、机体频率降I联系姿态内环参数重新检查从这张表也能看出来位置控制的问题很少是单一参数导致的。比如“定点画圈”可能同时涉及位置环P、速度环积分和巡航速度。所以我的建议是每改一次只调一个参数飞完看日志再动下一个不要一次改三四个参数然后说“好像更差了”却不知道是谁的锅。最后再分享一个小技巧。很多人不知道在QGroundControl的MAVLink Console里可以直接用param set命令修改MPC_参数修改后立刻起飞测试不需要全机重启。我通常的做法是先把一组可能的值都规划好飞到空中后在地面站里逐个切换参数并观察响应这样一轮能测好几个值比每改一次就降落插线刷固件高效得多。当然这里要提醒一句空中改参数要确定自己知道在干什么尤其是约束类参数改小了可能造成功效不足改大了可能姿态过于激进务必留好安全裕度。