ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

室内无人机悬停实战:光流PMW3901+激光VL53L1X与PX4配置指南

室内无人机悬停实战:光流PMW3901+激光VL53L1X与PX4配置指南 1. 室内悬停的核心逻辑为什么光流激光是客厅里的伪GPS先说一个直观的现象。绝大多数飞友第一次把无人机从室外挪进客厅面对的是一台盲飞的机器——GPS信号没有气压计勉强能给高度但你不敢指望它遥控器一松飞机就在一米范围内画圈飘。你以为是飞控坏了其实不是是飞控根本不知道自己在哪里。室外能稳定悬停依赖的是GPS/RTK给出的绝对位置信息飞控闭环里的位置环和速度环才有了参照系。室内GPS信号一来穿透损耗大二来多径反射严重飞控收到的位置数据跳来跳去位置环直接瘫痪。你要在室内实现悬停本质上就是必须换一种方式回答同一个问题飞机现在在哪个位置往哪个方向飘了多远。PMW3901光流传感器解决的就是这个我动了多少的问题。它本质上是一颗鼠标传感器的继承者内部有小型摄像头以很高的频率拍摄地面图像通过特征点匹配算出两帧图像之间的像素位移。把这个像素位移结合离地高度就能换算成飞机相对地面的水平位移和速度。VL53L1X激光测距传感器解决的是我离地多高的问题它用红外激光飞行时间测距不远不近正好覆盖室内天花板到地板之间的典型距离。没有高度光流就不知道一个像素位移到底对应地面上的多少厘米所以这两颗传感器必须配合一个管水平一个管垂直。这里要纠正一个常见误解光流测的不是绝对位置而是相对移动量。飞控拿到的是一个增量信息要靠内部的状态估计器通常是扩展卡尔曼滤波不断积分、融合、修正才能得到一个相对可靠的本地位置估计。所以光流传感器本身只是一半另一半是飞控上跑的姿态估计和位置估计算法。Pixhawk和PX4生态里对应的方案就是LPELocal Position Estimator本地位置估计器这个后面专门讲。理解了这层逻辑你就能明白整个改装项目的技术链条PMW3901光流输出水平面的像素位移速率VL53L1X输出厘米级精度的高度飞控把两者融合成三维位置估计位置环根据目标位置和实际位置偏差输出速度指令姿态环最终稳住四个电机链条上的任何一环出问题悬停都会失败。这也是为什么很多人买齐硬件却飞不起来——不是硬件坏了而是链路里的某个环节没有配对。2. 硬件选型与连线这几个坑在采购阶段就踩过一遍2.1 PMW3901模块怎么选别只看价格市面上的PMW3901光流模块很多但接口方式却千差万别。常见的有SPI接口和UART串口接口有些还集成了I2C输出。买之前一定要确认你手里的飞控支持哪种连接方式。如果你和我一样用老款Pixhawk 2.4.8注意它的主控是STM32F103系列资源相对有限而且老款飞控的I2C接口速率只有100kHz有些光流模块默认的I2C速率是400kHz接上去要么识别不到要么数据疯狂跳变。所以我的建议是优先选择通过SPI或UART连接的光流模块这类模块在PX4生态里驱动成熟不太依赖I2C速率。另一个坑是阉割版模块。有些商家卖的所谓PMW3901模块实际是去掉红外LED的简化版本室内光线稍暗就无法工作。正品PMW3901自带红外补光在较暗环境也能通过照射地面纹理来成像。购买时看模块上有没有两个醒目的红外LED灯珠没有就要谨慎。如果你预算充裕也可以考虑原厂PX4Flow光流模块它自带一个超声波传感器处理器也更强大但价格贵不少而且停产多年二手市场水深。从实用和性价比角度PMW3901VL53L1X的组合是当前最合理的室内悬停硬件方案。2.2 VL53L1X不是随便接根线就能跑VL53L1X是ST公司的激光测距传感器测距范围在4厘米到4米左右正好覆盖客厅悬停的典型高度。相比前一代VL53L0X它的测距上限更高抗环境光能力也更强是我推荐的版本。但VL53L1X有个特点它在交付时默认地址和许多I2C设备一样是0x29如果你的飞控I2C总线上还有其他设备可能产生地址冲突。你可以在QGroundControlQGC里查看距离传感器数据有没有正常出来。如果数据一直为零先排查I2C地址冲突很多集成模块出厂时已经改好了地址但也有野鸡模块需要自己用板载焊盘配置地址买之前问清楚商家。接线方面这类光流模组一般共用一个连接器输出VCC接5V或3.3V要看模块要求尤其要留意PMW3901的供电是3.3V如果你直接给它接5V板载稳压没做好就烧了。VL53L1X是3.3V供电I2C上拉电阻通常模块上已经有不需要额外加。2.3 Pixhawk接口分配老飞控和新飞控差别很大以Pixhawk 2.4.8为例常见的接法是这样的光流模块的SPI或UART输出接到飞控的AUX口或专门的I2C/SPI排针。VL53L1X的I2C SCL/SDA接到飞控的I2C排针。所有模块共地这一点非常关键飞控和传感器之间不共地会出现随机数据错误。如果你是Pixhawk 4或更新一代的飞控I2C有独立的总线速率也更宽松接法上会省心很多。但无论哪种飞控接线前一定要看模块的安装方向。PMW3901有一个镜头方向标记安装时必须朝向机身正下方增加任何倾斜角都会导致测量误差。飞控和传感器之间的减震也很重要我后面专门讲。3. PX4固件准备从刷固件到切换LPE估计器3.1 固件版本选择老飞控别追新这里先说一个很容易踩的坑Pixhawk 2.4.8这类老飞控从PX4固件v1.14开始逐渐失去了官方支持的完整周期很多新特性不再向F103平台移植。如果你用的是Pixhawk 2.4.8我建议刷v1.12.3或更新的稳定版中还在支持的版本。别贪新不然编译固件时就会发现不少驱动和组件在新版本里已经不再支持老型号了。新飞控用户当然可以直接上最新稳定版。拿到飞控后先在QGC里连接到飞控点击固件升级选择对应固件类型等它刷完。刷完固件后做四件事加速度计校准、陀螺仪校准、磁罗盘校准、遥控器校准。这四件事如果没做完后面所有测试都免谈。3.2 切换到LPE估计器位置估计才有参考系PX4默认使用的是EKF2扩展卡尔曼滤波器估计器它融合GPS、加速计、陀螺仪、磁力计、气压计、空速等传感器。但在室内纯光流场景下EKF2的支持路径相对曲折很多参数要逐个手动配置而且它基于GPS松耦合的逻辑在完全没有GPS的情况下反而不好调。LPE本地位置估计器则是PX4中专门面向室内定位、视觉定位、光流定位场景的估计器。它能够把光流传感器的水平位移信息、激光测距的高度信息、IMU的姿态信息融合成完整的本地位置估计。在QGC的参数表里找到这个参数参数值说明SYS_MC_EST_GROUP21为EKF22为LPE改完这个参数后飞控需要重启重启后在状态页面会看到估计器切换为LPE。如果参数表里找不到这个值说明固件可能不是标准版本请重新刷对应机架的标准固件。3.3 使能距离传感器和光流驱动在QGC里确认设备被看见重启后前往QGC的传感器或参数页面确认光流和距离传感器是否已经被PX4识别。对于VL53L1XPX4的驱动会在I2C总线上自动探测设备探测成功后在MAVLink控制台或者QGC的MAVLink Inspector里能看到距离传感器的数据流。一个非常实用的验证手段把飞机拿在手里左右平移和上下移动观察QGC里的传感器数据。如果移动飞机时距离数据有变化光流数据也有非零输出说明硬件链路基本通了。这一步千万不要跳过因为很多人到了试飞现场才发现传感器根本没被识别白白炸鸡。我在这步上吃过亏所以强调三遍也不为过确认数据再起飞。4. 参数配置一次到位从传感器阈值到融合权重4.1 光流传感器核心参数光流传感器在PX4里有几个关键参数它们决定了什么样的光流数据是可信的。我把常用配置整理成一张表方便照着抄参数名推荐值含义与设置要点SENS_FLOW_MINHGT0.3米低于这个高度光流数据不参与融合SENS_FLOW_MAXHGT4.0米高于这个高度光流信噪比太低不参与融合SENS_FLOW_ROT由安装方向决定光流模块相对机头的旋转角度多数情况是NoRotationSENS_FLOW_MAXR0.7机体的旋转角速度阈值超过该阈值时忽略光流SENS_FLOW_ROT是最容易被忽略的一个。光流传感器安装时镜头上一般有方向白点这个白点的朝向需要跟飞控设定的方向一致。如果装歪了180度飞控就会把向右当成向左悬停时飞机会持续往一个方向加速越修越偏最后只能手动切救。所以装好模块后先拍照记录安装方向再对应设置旋转角度。4.2 LPE估计器融合参数切换到LPE之后和光流直接相关的参数主要涉及光流数据在位置估计里的权重以及传感器安装高度偏移。以下是常用项的参考值参数名推荐值含义与设置要点LPE_FLW_XY0.6~1.0光流水平位置融合权重数值越大越信光流LPE_FLW_OFF_Z传感器离重心高度光流模块相对飞机重心的垂直偏移用米表示LPE_LDR_OFF_Z传感器离重心高度激光测距模块相对飞机重心的垂直偏移LPE_LDR_Z1是否融合激光测距作为高度源LPE_FLW_OFF_Z和LPE_LDR_OFF_Z这两个偏移参数很多人不知道怎么填。理论上传感器的安装位置如果和飞机重心高度有差值飞机做俯仰或滚转动作时传感器测出来的位移会混入姿态分量造成估计误差。实际测量时不需要太精确用尺子量一下传感器距离飞控板中心的垂直距离填进去即可差个一厘米两厘米影响不大。高度源方面VL53L1X激光测距比气压计的短期稳定性好得多尤其在室内开空调或者飞行器自身气流扰动的情况下气压计会飘得让人抓狂。我建议在LPE高度源配置里让激光测距作为主要高度参考气压计作为备份。4.3 位置控制环参数别用默认值硬飞传感器数据融合好了还需要关注位置控制环的参数。在QGC参数表里找MPC_开头的参数重点看这几个参数名参考起点说明MPC_XY_P1.0水平位置比例增益MPC_XY_VEL_P1.8水平速度环比例增益MPC_XY_VEL_I0.2水平速度环积分增益MPC_Z_P1.0垂直位置比例增益MPC_Z_VEL_P4.0垂直速度环比例增益这里给的是经验起始值具体需要根据机架尺寸和重量的不同做调整。机身越大、转动惯量越大位置环P值可以适当调低小机架调高。好的调法是从较小的值开始逐步增加P值直到出现震荡的临界点再回调10%到20%这样能得到一个稳定的响应。很多人忽略积分项的作用。室内光流悬停中如果飞机因为重心偏移或者室内气流产生缓慢漂移积分项负责把这种稳态误差消除掉。所以MPC_XY_VEL_I不能设成0否则飞机会偏移回不到目标点。5. 传感器安装细节方向、重心、减震一个都不能少5.1 为什么减震决定光流数据的生死PMW3901内部的小摄像头通过地面图像的差异来计算位移如果传感器本身被机架的振动带着高频抖动图像上的地面就会像地震一样乱晃光流解算出的速度数据会叠加大量噪声飞控无从判断飞机到底是真在动还是振动外衣。我第一次安装时把光流模块用双面胶直接贴在飞控板上结果悬停测试时飞机像跳舞一样高频点头QGC里光流速度值的噪声明显大得离谱。后来我换成专用的海绵双面胶把光流模块和减震板隔离再用扎带固定情况立刻好转。如果你是自组机架强烈建议给光流模块做一个独立的减震安装平台。别用太软的减震球太软会导致低频晃动太硬则滤波效果差。用中等硬度的硅胶减震球悬停测试时观察QGC里的光流数据噪声小、变化平滑就是合适的减震刚度。5.2 安装位置对光流灵敏度的影响第二个关键点光流模块一定要尽量安装在飞机的重心投影附近。因为LPE融合算法默认光流传感器测得的位移就是飞机重心的位移如果传感器离重心太远飞机做滚转或俯仰动作时传感器会跟着画出更大的弧线引入额外的视差位移飞控会误判成水平漂移明明没动也会输出修正通道。实际安装时把光流模块放在机身中心线靠前一点的位置同时确保VL53L1X的激光发射方向没有被起落架或脚架遮挡这是最稳妥的方案。另外我还要泼一瓢冷水如果你客厅的大理石地板是纯色亮面的PMW3901对这类低纹理表面的辨别能力会很差。光流算法本质上靠的是特征点一个纯色地板几乎没有特征可抓。实用解法有两种一种是在地面铺一层有花纹的瑜伽垫或报纸另一种是给脚架加一个低矮的碳板人为制造地面纹理变化。我在木地板和浅色地毯上都测试过个人经验是带有图案的木纹地板表现最好纯亮面瓷砖最差。6. 从手动到自主悬停的四步递进试飞每步都要验证6.1 试飞前的安全准备室内试飞尤其是第一次测试光流悬停一定要做好这几件事拆掉螺旋桨先做地面推油门测试。确认电机转向正确、电调行程校准完成。给机架加装桨保护罩客厅空间小碰墙炸机不是玩笑。找一块足够空旷的场地至少4米乘4米的无遮挡区域天花板高度2米以上。遥控器上把位置模式和定高模式分配到手边的两个开关位置随时准备切模式接管。起飞前再次确认光流数据不为零距离传感器能稳定输出高度。很多新手觉得拆桨测试麻烦但这一步真的能救机器。不装桨地面推油门时可以安全地观察飞控输出、传感器反馈和姿态响应就算逻辑出问题最多听到电机尖叫不会撞碎。6.2 第一步手动模式起飞验证基础姿态接通电池等待飞控完成自检和传感器初始化。遥控器解锁后切换到手动模式自稳模式轻推油门让飞机离地约30厘米。这时候飞控不会自动维持位置你要用摇杆主动修同时注意QGC里的姿态数据是否正常。手动模式下重点做两件事一是确认飞机没有任何方向的顽固偏移二是做一个小幅度的前倾后倾动作观察QGC里光流数据会随着姿态变化出现对应的速度分量。如果你发现光流数据在静止水平状态下大幅度波动检查减震如果倾侧时光流数值饱和不变检查SENS_FLOW_MAXR阈值设置。6.3 第二步切定高模式验证高度稳定性手动模式手感基本正常后切换到定高模式。此时飞控会接管油门通过高度估计维持离地高度不漂移。定高模式里你重点观察两个东西一是飞机在垂直方向上是否缓慢呼吸般上下浮动二是QGC里激光测距高度和气压计高度是否一致。如果高度上下浮动超过10厘米先检查激光测距数据本身。VL53L1X对于垂直于地面方向的黑面吸光材料测量不稳定如果你家地垫是纯黑色传感器可能测到的是一个跳变的数值。此时可以给传感器加一个小小偏置角或者在地面垫浅色纸张。气压计和激光高度如果差距过大说明气压计受气流干扰严重检查飞控的泡沫海绵是不是覆盖了气压计而没有留出通风孔这个孔被堵住的话高度源会非常不可靠。6.4 第三步切位置模式开始不同方向小悬停定高模式稳定后把遥控器拨到位置模式。此时LPE的位置环开始介入飞机应该能在一个较小的半径内稳定。第一次切入位置模式手上不要离开摇杆一旦发现飞机快速向某个方向加速立刻切回定高或手动切到定高后如果继续漂移再切回手动。第一次位置模式下的正常表现应该是飞机会有一个轻微的漂移然后缓缓回到目标点。如果飞机像被风吹跑一样越来越快大概率是光流模块方向设置错误检查SENS_FLOW_ROT如果飞机在原地以一秒周期来回摆动大概率是位置环P值太大降低MPC_XY_P如果飞机悬停了十几秒才开始缓慢往某个方向飘多半是积分项强度不够适当提高MPC_XY_VEL_I。我在客厅里做的第一次位置模式测试飞机大概在半径20厘米范围里晃了十几秒才收敛参数调整后到半径10厘米以内。这个表现对于没有光学动捕的普通室内环境来说已经很不错了。6.5 第四步小幅度指令巡航确认闭环响应最后一步是测试位置模式下的指令响应。在室内不要做大幅度横滚和俯仰只给前后左右小幅度的杆量指令观察飞机是否跟随摇杆移动松开摇杆后是否迅速停住并回到目标位置。这一步骤验证的是整个闭环的响应带宽。如果飞机动作迟滞调大MPC_XY_P如果动作过冲调小MPC_XY_P并检查光流数据是否正常如果刹车时有明显振荡说明速度环阻尼不足调大MPC_XY_VEL_P。整个调参过程要耐心每次只改一个参数逐次逼近。7. 踩坑实录与排查链路我在客厅里遇到的五个典型故障7.1 故障一QGC里光流数据恒为零排查链路是这样的拔插传感器连接器确认供电指示灯亮起。检查接线尤其是SCK、MOSI、MISO、CS四根SPI线的顺序很多模块的排针间距和引脚定义一眼看不出必须对照商家图纸。确认模块镜头朝下离地距离大于SENS_FLOW_MINHGT设定值。在QGC的MAVLink Inspector里看光流消息是否持续发布如果完全没有任何消息检查驱动是否使能。我在排查时发现很多模块商家给的引脚图是俯视图和实物背板的顺序是镜像的接反两根线后SPI通信就直接断了。7.2 故障二高度数据频繁跳变VL53L1X在客厅里跳变最常见的原因是检测到了附近障碍物比如地板上离传感器很近的线缆、膝盖、脚等激光测距的视场角大概二十多度如果你的传感器安装位置偏低且镜片前方有杂物就会误测。用QGC实时曲线观察测距值如果跳变节奏和你身体的移动一致把杂物移开即可。7.3 故障三切换位置模式后飞机飘逸加速这个问题十有八九是光流方向配错。可以做一个简单测试在手动模式下把飞机往前推一下观察QGC里光流输出的Y轴或X轴速度方向。正确的方向应该和飞机实际运动方向一致。如果相反翻转SENS_FLOW_ROT为180度。记得我曾经在飞行现场把模块拆下来反装来验证但其实把参数从NoRotation改成ROTATION_YAW_180就能解决根本不用动硬件。7.4 故障四悬停振幅大、周期短这种高频瓢动通常来自两个方向一是位置环P值过大二是光流数据噪声振动太大。我的排查经验是先把MPC_XY_P缩小到默认值的60%试飞如果振幅显著下降说明控制增益偏高如果没变化回到QGC看光流原始数据在静止状态下噪声标准差若超过某个明显值那就是减震问题。7.5 故障五高度正常但飞控报测距传感器错误LPE估计器对传感器数据的有效性判断有自己的逻辑。如果VL53L1X输出值经常超过SENS_FLOW_MAXHGT或低于MINHGT比如飞机稍微飘到沙发上方传感器测到的距离会瞬间变化飞控某段时间内拒用高度源就会报错。这不是设备坏了是传感器的使用边界问题。解决办法是尽量在开阔区域试飞另外可以把LPE高度的融合阈值调宽松在参数里适当增大高度有效范围。8. 一些不太会被写进教程的细节经验到这里光流激光室内悬停的完整链路已经走通了。最后分享几个我踩过很多次才总结出的补充经验。第一PMW3901和VL53L1X这颗组合方案本质上是在一个非常狭窄的传感器输入范围内工作。它不会像GPS那样几百米范围内都能定位它只对你的客厅地面局部区域有效。不要指望飞机高高飞到天花板附近或者倾斜大角度飞行时还能保持完美悬停——传感器有其物理边界飞控算法再强也超越不了硬件限制。第二如果你决定自己从PX4源码编译固件而不是用QGC刷现成版本记住一个关键点编译前一定要把目标飞控平台选对并且初始化子模块。很多入门者在这一步卡住报错信息里写着子模块缺失原因通常是克隆PX4源码时没有用--recursive参数。如果已经克隆完了直接在源码目录执行命令初始化子模块再重新编译即可。具体的编译环境和流程PX4官方文档讲得很清楚我不在此重复。第三也是我心里最想说的一点室内悬停只是一个起点。光流激光组合本质上打通的是没有GPS时飞控如何自定位这条技术路径。你接下来可以在这个基础上加视觉避障、探索模式、室内航线飞行甚至把它作为一个室内测试平台来验证自研的传感器融合算法。我的建议是先把悬停这步做到炉火纯青再去考虑更复杂的功能因为很多上层功能的稳定性都取决于底层定位这关过不过得硬。最终我个人体会是这套方案的调试难度不算大但非常考验人的细心程度。传感器方向、减震、参数、接线任何一个细节不对最后都会变成悬停失败的表象。按本文这个顺序一步步来不要跳步你的客厅悬停应该比我第一次做的时候顺利得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进