
光流模块这东西看着是个巴掌大的小板子接上四根线就能用但真正在项目里翻过车的人都知道它能把一个飞得好好的四轴搞成漂移怪。我前后在三类机架上用过七八种光流方案从最早的 PX4Flow 到现在的 PMW3901 系、再到集成测距的融合模组室内的定点悬停、无卫星环境下的航线巡检、以及基于视觉感知的自主降落每一种场景对光流的要求都不一样。标题叫无人机光流模块的选择但真正的难点从来不是买哪个而是先搞清楚你的无人机需不需要光流、需要到什么精度、以及选完之后怎么把它和飞控、测距、IMU 这几路数据拧成一股绳。这篇就按我自己的项目顺序从需求判断、原理拆解、模块横向对比、接线安装、固件配置一直到故障排查把踩过的坑和能直接抄的参数都摊开讲新手可以照着选型老手也能在里面找到几个容易被忽略的细节。1. 选型之前先明确你的无人机到底需不需要光流很多人一上来就问哪个光流模块最好这个问题本身就是错的。光流不是万能的增强插件它是一个有明确适用边界的传感器用错了地方不但没用还会污染状态估计让飞控的卡尔曼滤波器输出更差的结果。所以在打开购物页面之前先花十分钟把下面几个问题想清楚。1.1 光流解决的是没有卫星信号时的水平速度估计卫星定位模块给的是绝对位置而光流给的是水平方向的运动速度注意是速度不是位置。它的本质是用一个朝下的摄像头或者光学传感器看地面纹理在视野里的移动速度再结合对地高度反推出机体的水平速度。所以它天然依赖一个前提——地面得有纹理、得有光、而且飞控得知道当前离地多高。这就意味着三件事。第一光流无法单独工作它必须搭配一个测距模块超声波、激光、ToF 都行才能把角速度换算成线速度。第二光流给出的是相对速度长时间积分会累积漂移必须和 IMU、气压计、磁罗盘一起做多传感器融合最终由 EKF扩展卡尔曼滤波或者 EKF3 这类状态估计器统一输出。第三光流在纹理缺失、光照不足、地面是非刚性表面水面、草地被风吹动的草尖时会直接失效而且失效往往是突然的不是渐变的。我见过最典型的翻车案例是有人拿光流模块装在一台 250 级穿越机上想着在室内做定点结果地面是纯色环氧地坪光流数据全是零飞机一起飞就往前冲他还以为是 PID 没调好折腾了两天。所以第一句话先确认你的飞行场地有没有可用纹理再谈选型。1.2 三类典型使用场景与需求差异我把实际项目里遇到的光流需求大致分成三类它们对模块的要求差别非常大。第一类是室内小型无人机的定点悬停与低速航线比如教室演示、室内编队、仓库盘点机。这类场景高度通常在 0.3 到 2 米速度不超过 2 米每秒对模块的极限性能要求不高但对体积、重量、功耗极其敏感尤其是 250 克以下的机架多 5 克都影响悬停时间。这类场景首选的往往是 PMW3901 方案因为它足够小、足够便宜。第二类是无卫星环境下的工业级巡检或测绘比如隧道、桥梁箱梁内部、大型厂房、地下管廊。这类场景飞行高度可能到 3 到 10 米速度可能到 5 米每秒以上对光流的动态范围、抗干扰能力、以及和飞控的深度融合要求都高得多。这时候 PMW3901 的角速度量程就可能不够了需要考虑图像型的方案或者更高量程的传感器。第三类是光流作为冗余备份主定位还是卫星加 RTK光流只在卫星信号劣化或者被遮挡的短暂窗口里顶上。这类应用对光流本身的绝对精度要求不高但要求它不能在高空误导飞控所以需要设置合理的融合高度上限比如只在 3 米以下才允许光流参与融合。场景理清楚了选型的范围一下子就能收窄一半。1.3 光流不能替代什么有必要泼一盆冷水。光流不能给你绝对位置不能在纯黑环境工作除非是主动红外方案的特定型号且地面反射率合适不能在水面、雪地、镜面地砖这些非漫反射或低纹理表面上工作也不能在高速旋转的机架上稳定输出转向角速度过大会让光流估计失真。另外要澄清一个常见误解光流不等于视觉定位。真正的视觉定位系统比如基于 ORB 特征点的 SLAM、正射拼接用的特征匹配是另一套技术路线它需要更完整的图像处理链路和更强的算力通常跑在机载计算机上而不是飞控上。热词里出现的ORB 算法的无人机正射拼接代码无人机视觉感知属于视觉测绘和感知范畴和飞控用的光流模块不是一回事选型时别被这些词带偏。飞控光流模块追求的是低延迟、高可靠性、低算力占用而不是图像质量。2. 光流定位原理拆解参数背后的物理意义选型看参数表但如果不知道每个参数是怎么来的、在什么条件下会失效那张表就是废纸。这一节把光流从像素到速度的完整链路拆开讲讲完之后你再回头看那些 datasheet会清楚很多。2.1 从像素位移反推速度的完整链路光流传感器的输出通常是一个角速度向量单位是 rad/s分 X、Y 两个轴向。它是怎么算出来的以 PMW3901 这类硬件光流芯片为例内部有一个低分辨率成像阵列大约 30×30 像素连续两帧图像做相关性匹配得到整幅图像在 X、Y 方向上的平均像素位移量。再用这个像素位移除以帧间隔时间得到像素变化率最后通过标定好的像素-角度对应关系换算成角速度。换算的关键桥梁是视场角和分辨率。以 PMW3901 为例标称视场角约 42 度成像阵列 30×30。粗略估算单个像素对应的角度大约是 42 除以 30也就是 1.4 度。这个数字很关键它决定了传感器对微小运动的敏感程度。1.4 度在 1 米高度对应多大的地面位移用三角形关系算位移等于 2 乘以高度乘以 tan半角也就是 2×1×tan(0.7°)≈24 毫米。也就是说飞机在 1 米高度横向移动 24 毫米光流大约输出一个像素的位移。再看量程上限。PMW3901 的最大可测角速度约 7.4 rad/s。在 1 米高度这对应线速度 7.4 米每秒。听起来很充裕但实际工程里我们通常只敢用到量程的 50% 到 70%因为接近饱和时输出会非线性甚至会翻转符号。所以 1 米高度的可靠速度上限大概在 3.7 到 5 米每秒。如果你需要飞 6 米每秒那飞行高度就不能超过 1 米左右否则光流会饱和。注意把最大角速度 × 飞行高度 最大可测线速度这个关系记牢它是判断某个模块能否满足你项目的第一道门槛比任何营销参数都实在。2.2 尺度因子与测距模块的绑定关系光流输出角速度飞控要的是线速度中间必须乘一个高度。这个高度从哪来从测距模块来。所以测距模块的精度直接决定了光流的速度精度。如果你的测距模块在 2 米高度有 ±10 厘米的误差那光流速度就会有约 5% 的系统性偏差。这个偏差在定点悬停时表现为缓慢漂移在航线上表现为位置累积误差。更麻烦的是高度源的切换。室内低空用测距超量程后要切到气压计而气压计和测距之间往往有几十厘米到一米的偏差。如果切换阈值设置不当飞控在切换瞬间会认为高度突变导致光流速度出现一个跳变飞机就会抖一下。我的做法是光流的融合高度上限设置得比测距可靠量程更保守一点比如测距能到 6 米但光流融合上限只设到 4 米让高度源在光流退出融合之后再做切换避免两个变量同时跳。还有一个细节测距模块的安装位置和光流的安装位置如果不在同一点飞机有俯仰或横滚角时两者测的不是同一个地面点。小角度影响不大大角度或者测距离重心很远时误差会明显放大。理想情况是把测距和光流尽量装在重心附近或者至少在固件里把安装偏移量填准确。2.3 特征点法、稠密光流与硬件光流的路线分野从实现路线看光流模块分成三大类理解这个分类比记住具体型号更有用。第一类是硬件光流芯片代表是 PMW3901、PMW3360 这类鼠标芯片改造的方案。芯片内部集成了成像、匹配、输出全流程主控只要通过 SPI 读数就行。优点是体积小、功耗低、延迟低、价格便宜缺点是分辨率低、动态范围有限、算法是黑盒没法调。第二类是图像型光流模块代表是 PX4Flow 这种。它带一个真实的图像传感器比如 MT9V034 全局快门在模块内的 MCU 上跑光流算法输出角速度和图像质量指标。优点是分辨率高、可玩性好、能看到原始图像做调试缺点是算力有限所以帧率偏低典型 30Hz 左右功耗和体积都更大价格也更高。第三类是融合型模组代表是集成 ToF 或激光测距的一体化模块像基于 PMW3901 加 VL53L1X/ToF 的组合甚至直接输出 DroneCAN 或串口协议的对地速度。它的优势是出厂就帮你把光流和测距的空间关系、时序关系对齐好了接线简单参数少。缺点是一旦其中一个环节出问题整个模组都得换而且价格偏贵。从算法层面硬件光流芯片大多用的是块匹配或简化的相关算法图像型模块常用 LKLucas-Kanade稀疏光流。至于 ORB 特征点它更适合做大范围视觉定位和正射拼接用在飞控光流里属于杀鸡用牛刀帧率和延迟都不划算。3. 主流光流模块横向对比与选型决策前面的原理铺垫完了现在进入正题。我把手上用过和测过的模块整理成一张表参数都是实测或官方标称的公开数据差异点我会单独标注。3.1 按技术路线分类的主流模块目前能方便买到的飞控光流方案主流的有这么几档。入门档是PMW3901 裸芯片板比如常见的 3901 小方板通常是 SPI 接口需要飞控有对应驱动。它的价格非常低体积接近指甲盖但没有任何辅助电路接线和参数都要自己搞适合有折腾意愿的玩家。进阶梯队是PMW3901 加测距的官方式组合板比如 Arduino 生态常见的 3901 加 VL53L0X 组合、以及国内常见的集成串口模组。这类板子把光流和测距做在一起直接输出串口协议接线省事代价是测距量程通常只有 1 到 2 米VL53L0X 约 2 米VL53L1X 约 4 米。再往上是DroneCAN 光流模组走 CAN 总线抗干扰好、布线简单、支持多设备挂载代价是需要飞控有 CAN 口并且正确配置另外固件升级和 ID 管理会多一点学习成本。最后是图像型光流PX4Flow 是代表现在还有基于它的若干变种。它在弱纹理和远距离上表现更好一些但价格和体积都不占优且需要外部超声波或激光测距配合。3.2 关键参数实测与对比表下面这张表是我整理的横向对比重点关注量程、最小高度、接口和融合难度。表中的距离和速度是典型值实际表现受光照和地面纹理影响波动可能达到 20% 以上。方案类型典型视场角分辨率最大角速度可靠高度范围接口是否内置测距融合难度适配场景PMW3901 裸板约 42 度30×30约 7.4 rad/s0.08 到 1 米较稳SPI否中室内微型机定点3901 VL53L0X 组合约 42 度30×30约 7.4 rad/s0.1 到 1.5 米串口/I2C是约 2 米低室内小四轴、演示机3901 VL53L1X 组合约 42 度30×30约 7.4 rad/s0.1 到 3 米串口/I2C/CAN是约 4 米低室内外低空巡检DroneCAN 光流模组约 42 度30×30约 7.4 rad/s0.1 到 3 米CAN通常内置中多传感器整机图像型光流可调752×480依算法而定0.3 到 5 米I2C/串口否需外接高弱纹理、远距离表格里最容易被忽视的一列是可靠高度范围。很多模块标称能到几米但实际在 2 米以上的速度估计噪声会明显变大因为同样的地面位移在更高处对应的像素位移更小信噪比下降。所以能用和好用是两回事我在项目里一般把融合高度上限设在标称量程的 60% 左右。3.3 选型决策不同场景怎么选把场景和参数对上决策其实很快。如果你做的是室内 250 克以下的微型机优先选 PMW3901 加 ToF 的组合板重量控制在 3 克以内串口输出飞控参数少调试快。不要在这个量级上去碰图像型方案重量和功耗扛不住。如果你做的是室内外兼顾的 450 级到 1 公斤级机型建议选带 VL53L1X 或等效 4 米量程测距的集成模组光流融合高度上限设到 3 米左右室内外切换时用飞控的高度源优先级把过渡做平滑。如果你做的是工业巡检类速度可能超过 4 米每秒那就要认真核算量程。按前面 70% 可用量程的保守原则PMW3901 在 7.4 rad/s 下1 米高度对应约 5.2 米每秒2 米高度对应约 10.4 米每秒。所以只要飞得够高量程是够的真正的瓶颈反而是高处的信噪比和测距量程。这时候优先解决测距而不是换更贵的光流。如果你需要多路传感器冗余或者整机走 CAN 总线直接上 DroneCAN 模组布线干净多设备管理也规范长远看省心。4. 安装、接口与硬件实操光流模块装了不对参数怎么调都白搭。这一节讲接线、安装位置和干扰处理都是我在实际装配里反复验证过的。4.1 接口与电气连接光流模块常见三种接口SPI、I2C、串口UART部分走 CAN。SPI 的优点是速率高、延迟低PMW3901 裸板基本都是 SPI但飞控上 SPI 接口数量有限而且很多飞控的 SPI 口是给 IMU 用的外接 SPI 需要专门的引脚映射。我遇到过 SPI 时钟线走线太长导致读数不稳定的情况解决办法是把模块尽量靠近飞控线长控制在 10 厘米以内。I2C 的问题是总线容易冲突。同一个 I2C 总线上挂光流、测距、磁罗盘时任何一路拉低总线都可能让另外两路一起丢数据。我的经验是光流尽量单独占一路 I2C 或者干脆用串口别和磁罗盘挤在一起。如果非要用 I2C务必确认上拉电阻阻值和总线速率长距离时降低速率到 100kHz 反而更稳。串口是最省事的接线简单抗干扰比 I2C 好缺点是每个模块占一个串口飞控串口不够的时候就得做取舍。走 CAN 的话一根两芯线挂多设备抗干扰最好但需要配置终端电阻和节点 ID。电源方面绝大多数光流模组是 5V 供电内部自稳压到 3.3V。要注意的是不要把光流和电机电调共用一条细线供电电机启停瞬间的电流冲击很容易让光流复位。我给光流单独走一路从飞控分电板引出的 5V线径不用粗但要走短线。4.2 安装位置与视场角计算安装位置有三个硬性要求朝下、尽量靠近重心、视野不被机架或起落架挡住。朝下是必须的但朝下和垂直于机身不完全等价。如果你的飞机在悬停时有一段固定的前倾角那光流理论上也会跟着倾斜导致 X 和 Y 轴之间出现耦合。严格做法是把安装角度填进固件参数做倾斜补偿。不过对于轻微倾斜5 度以内飞控的融合算法基本能吸收不必过分纠结。视场角计算是很多人忽略的。以 42 度视场角为例在 1 米高度光流在地面上覆盖的圆形区域直径约为 2×1×tan(21°)≈0.77 米。在 0.3 米高度直径只有约 0.23 米。这意味着低空时光流看到的是一小块地面如果这一小块恰好是纯色区域直接失效。所以在低空定点场景里地面的纹理均匀性比在高空更关键。注意起落架的遮挡问题很隐蔽。有些机架的脚架正好在光流视场边缘飞机稍微倾斜时脚架进入视野光流会误判为一个巨大的位移导致飞机突然向反方向冲。装完一定要在不同倾斜角下目视确认视野干净。4.3 减震、遮挡与干扰处理光流对高频振动非常敏感。振动会让相邻两帧图像之间产生额外的伪位移光流输出噪声直接飙升。我的做法是在光流模块和机架之间垫一层薄泡棉1 到 2 毫米厚既不增加多少重量又能把高频振动滤掉一部分。注意不要用太软的胶否则模块在加速度下会晃动反而更糟。电磁干扰主要集中在两个位置靠近电调电源线和靠近图传天线。光流模块尽量远离这两处尤其别把模块贴在电调正上方。我实测过模块离电调电源线 3 厘米以内时数据丢包率明显上升挪到 8 厘米以上就正常了。还有一个容易忽略的点是散热。图像型光流模块和一些集成模组在连续工作十几分钟后会发热个别型号热到一定程度输出会漂。给模块留一点通风空间别用热缩管全包死。5. 飞控固件配置与校准实操硬件装好之后配置才是真正见功夫的地方。下面分别说 PX4 和 ArduPilot 两条路线参数我给的是常用值具体编号以你所用固件版本的参数文档为准。5.1 PX4 侧参数配置PX4 里光流的融合由 EKF2 控制核心参数分三组传感器驱动、光流质量门限、高度源。驱动部分如果是 PMW3901先确认固件里启用了对应驱动位置一般在传感器使能参数里。串口或 I2C 地址要与实际接线一致。# 在 QGC 的 MAVLink 控制台或通过 px4 参数工具设置 # 光流融合总开关 param set EKF2_OF_CTRL 1 # 光流最小质量门限低于该值不融合默认 1实测可调到 0.5 放宽 param set EKF2_OF_QMIN 1 # 光流观测延迟按模块实际处理延迟填PMW3901 系常填 5 到 20 毫秒 param set EKF2_OF_DELAY 10 # 光流速度观测门限单位约 rad/s过大说明数据异常 param set EKF2_OF_GATE 0.5 # 光流可用高度下限与上限 param set SENS_FLOW_MINHGT 0.1 param set SENS_FLOW_MAXHGT 3.0 # 传感器最大角速度PMW3901 填 7.4 param set SENS_FLOW_MAXR 7.4 # 高度源切到测距保证光流有准确尺度 param set EKF2_HGT_MODE 2这几行里最关键的是SENS_FLOW_MAXHGT和EKF2_HGT_MODE。前者决定光流在哪个高度退出融合后者决定高度源。如果高度源还用气压计光流速度会有明显的系统性偏差因为气压计在低空的绝对精度远不如测距。另外要确认SENS_FLOW_ROT的朝向设置。如果你的模块安装时旋转了 90 度或 180 度这个参数必须填对否则光流输出的 X、Y 会和机体坐标错位飞机一定点就画圈。5.2 ArduPilot 侧参数配置ArduPilot 的光流配置更细参数也更多但逻辑清晰先告诉飞控光流是什么类型、装在哪再告诉 EKF3 用光流作为速度源。# 光流类型按你的模块选对应编号具体编号见当前固件参数表 param set FLOW_TYPE 5 # 光流的机体安装偏移相对重心米 param set FLOW_POS_X 0.0 param set FLOW_POS_Y 0.0 param set FLOW_POS_Z 0.05 # 安装朝向模块正前方与机头夹角单位度 param set FLOW_ORIENT_YAW 0 # 光流比例校准单位是千分之一用于修正速度尺度误差 param set FLOW_FXSCALER 0 param set FLOW_FYSCALER 0 # 测距模块类型按你的型号填 param set RNGFND1_TYPE 25 param set RNGFND1_MIN_CM 10 param set RNGFND1_MAX_CM 300 # EKF3 速度源使用光流 param set EK3_SRC1_VELXY 5 # 高度源使用测距 param set EK3_SRC1_POSZ 2FLOW_FXSCALER和FLOW_FYSCALER是重头戏。出厂默认是 0意味着不修正。但实际模块的尺度因子往往有百分之几到十几的偏差表现出来就是飞机悬停时缓慢向一个方向漂。修正方法我在下一节讲。5.3 校准与地面验证流程我的验证流程分四步缺一不可。第一步是静态数据检查。飞机放平不动在地面站看光流输出的 X、Y 角速度正常应该在零附近小幅波动噪声幅度不超过 0.02 rad/s。如果一直在跳或者偏大先查振动和干扰别急着调参数。第二步是手推测试。保持飞机水平沿机体前方匀速推着走观察地面站里光流输出的 X 轴速度和实际推动速度是否方向一致、量级接近。这一步能发现朝向装反和尺度严重偏差的问题。推的时候尽量匀速速度控制在 0.5 米每秒以内。第三步是比例校准。手推测试如果发现输出速度比实际偏大 15%就把FLOW_FXSCALER设成对应负值去修正每次改 50 到 100即 5% 到 10%推几次迭代收敛。这一步急不得改太猛容易过冲。第四步是低空定点试飞。在 0.5 到 1 米高度做定点观察漂移方向和速度。如果飞机持续向一个方向缓慢漂说明还有残余尺度偏差或者测距有固定偏置先查测距再调光流。6. 常见问题排查速查光流的问题表现五花八门但根因其实就那么几类。这张速查表是我自己整理的按现象找原因。6.1 数据链路类问题现象可能原因排查方法地面站完全看不到光流数据接口类型或端口配错、驱动未启用确认参数类型与实际接线一致查串口占用数据间歇性中断供电不稳、I2C 冲突、线缆接触不良单独供电、换串口、重新压接端子数据一直为零地面无纹理或光照不足、镜头被遮换到有纹理地面、增加照明、检查镜头数据方向明显错误安装朝向参数填错、模块旋转未补偿用 FLOW_ORIENT_YAW 或对应参数修正数据链路类问题里最坑的是看起来有数据但全是噪声。这种情况往往是供电纹波或者振动引起的别去调算法先把机械和供电搞定。6.2 定位漂移与跳变类问题漂移分两种一种叫缓慢持续漂移一种叫突然跳变。缓慢持续漂移基本是尺度因子或者测距偏置造成的。判断方法换个飞行高度如果漂移速度随高度线性变化那就是尺度因子问题如果漂移速度不随高度变化那更可能是测距有固定偏置或者 IMU 零偏。突然跳变通常是几个原因光流视场里出现了飞过的物体比如你的手、地面的强反光、测距量程切换、或者光流在接近饱和时输出翻转。排查时重点看跳变发生的时刻有没有对应的高度变化或者姿态突变。还有一种会被误判的情况是磁罗盘干扰导致的航向漂移它会让光流的机体坐标变换出错表现出来像光流漂移。这种情况查光流是查不出来的要看罗盘数据。6.3 场景失效边界我在下面这些场景里明确遇到过光流失效列出来给大家做参考纯色环氧地坪、白色瓷砖、无花纹的塑料地板静止水面和反光极强的地面大面积积雪纹理过于均匀光照低于约 50 勒克斯的暗环境硬件光流对光照有一定要求高度超过模块可靠量程后噪声急剧放大高速横滚或俯仰机动时地面像移过大导致饱和地面被强风扬尘遮挡这些边界不是调参能救的只能靠改变场景或者增加额外的定位手段。工程上正确的做法是让飞控在光流质量下降时自动降低融合权重而不是硬撑。提示很多飞控都支持光流质量指标的阈值判断把质量门限设合理让光流在不可靠时主动退出比让它在边缘勉强工作要安全得多。7. 我踩过的坑与调参心得前面讲的都是方法和参数这一节说几个反直觉的经验都是真金白银换来的。7.1 几个反直觉的经验第一个光流不一定要装得越低越好。低空时地面纹理在视野里的相对尺寸确实更大理论上更利于匹配但低空也意味着测距噪声、地面杂物的干扰、以及起落架遮挡的风险都更大。我最后稳定用的是 0.6 到 1.5 米这个区间比贴着地面飞效果更好。第二个调光流之前先调测距。太多人一上来就改光流参数结果测距的固定偏置一直是错的光流怎么调都漂。测距正确了光流往往不用怎么调就稳了。第三个比例校准的迭代方向要想清楚。如果光流输出的速度比实际大说明尺度因子偏大要往小修正。有人调反了方向越调越差还以为是模块坏了。每次改完记得重新推一次别凭感觉。7.2 参数调优的顺序我把调优顺序固定下来避免来回折腾机械安装与减震确认视野干净供电与接口稳定确认数据不丢包测距模块校准确认高度准确光流静态噪声检查确认噪声在合理范围朝向与偏移参数用手推测试确认方向正确比例因子校准迭代到速度误差小于 5%融合高度上限与质量门限设置低空定点试飞观察漂移逐步提高飞行速度和高度观察失效边界这个顺序不能颠倒。我见过有人跳过前三步直接调融合门限结果把噪声大的数据强行融合进去飞机比不开光流还飘。说到底光流模块的选择从来不是选一块最好的板子而是选一个和你场景、机架、飞控、算法链路都匹配的组合。便宜的 PMW3901 系列在它该用的场景里表现非常好贵一倍的融合模组如果你不会配也是白花钱。我个人在室内小型项目里最常用的还是集成测距的 PMW3901 串口模组接线快、参数少、翻车概率低到了需要长距离和高速的工业场景我会先算量程和信噪比再决定是加高测距还是换图像型方案。真正决定成败的是安装位置、减震、测距精度和参数校准这四件看起来最不起眼的事。