三年前在一个钢结构厂房里做巡检演示,飞机在起飞点上方稳得像钉住一样,往前飞了七八米,位置就开始慢慢往右后方爬,最后撞在钢梁上。那天返厂查日志,才发现问题根本不在飞控调参,而在这台无人机上那颗几十块钱的光流模块——它测出来的速度整体偏了大概 15%,高度越低偏得越明显。光流模块这东西看着简单,一个镜头加一颗传感器,实际选型和标定里的门道比大多数人想的多得多。下面这篇就是把这几年在室内定位、低空补盲这些场景里踩过的坑、算过的账、换过的模块,按选型逻辑完整讲一遍。不管你是刚拿到 Pixhawk 想做室内定点的新手,还是已经在为批量装机做 BOM 选型的老手,应该都能找到能直接抄的部分。
1. 先搞清楚你的机型到底缺的是位置还是速度
光流模块经常被当成"室内 GPS"来宣传,这个说法对了一半,也害了一半人。买回来装上去,发现飞机还是飘,就觉得模块是垃圾。真相是:光流模块绝大多数情况下只提供速度观测,它不提供位置,位置是飞控的扩展卡尔曼滤波器(EKF)用速度积分出来的。理解这一点,后面所有的选型和调参逻辑才立得住。
1.1 GPS 失效之后漂移的数学本质
GPS 在室外能给出绝对位置,误差是米级但不会随时间累积。一旦进了室内或者被遮挡,位置信息源消失,系统只能靠惯性测量单元(IMU)做航位推算:加速度积分成速度,速度再积分成位置。加速度计本身的零偏看着很小,比如 0.02 m/s²,但积分两次之后误差是按时间平方增长的——飞 10 秒就是 1 米量级的位置漂移,飞 30 秒能漂出十几米。这就是为什么纯 IMU 悬停的飞机在室内撑不过半分钟。
光流的价值就在于,它提供了一个外部参考来切断这个平方增长。它测的是"机体系下相对地面的运动速度",飞控把它塞进 EKF 的速度观测通道,滤波器每一帧都用这个观测去修正内部的速度估计,漂移就从平方增长退化成随机游走。你会看到飞机还是会慢慢移动,但不会指数级失控,而且是往一个方向缓慢爬,用手拨一下能回来。
1.2 光流给 EKF 的到底是什么量
光流模块的原始输出其实是图像帧之间的像素位移。它自己并不知道你飞多高,所以它没法直接告诉你"我现在 1.2 m/s"。飞控拿到像素位移之后要做两步换算:第一步,用模块的焦距参数把像素位移换算成角速度(单位 rad/s);第二步,乘以对地高度,得到线速度。公式长这样:
v = ω × hω 是光流测出的角速度,h 是对地高度。这个式子看着简单,但它决定了光流系统的精度上限——高度误差会一比一地传递到速度上。高度偏 10%,速度就偏 10%。我在厂房那次遇到的问题,根源就在这里:气压计在厂房里受空调气流影响,对地高度的估计本身就有 15% 左右的偏差,光流测出来的速度自然跟着错。
所以你在选光流模块的时候,真正要一起考虑的其实是"高度源"。市面上那些一体式的光流+激光测距模块卖得贵,贵的就是这个组合带来的确定性和走线便利。
1.3 哪些场景装了光流也没用
提前劝退几种情况,能帮你省下不少钱和调试时间:
- 无纹理地面。纯色环氧地坪、白色瓷砖、镜面不锈钢,光流算法找不到可跟踪的特征点,输出质量会掉到 0 或者干脆是噪声。这种情况下要么铺一块带图案的地毯,要么换成视觉惯性里程计(VIO)方案。
- 水面和玻璃。水面是动态的,玻璃是透明的,光流的假设前提(地面相对静止、有稳定纹理)全部不成立。
- 高速飞行。光流的速度上限是按角速度算的,飞得越低,能测的最大线速度越小,下面第 2 章会具体算。
- 室外地面上空。光照过曝、地面对比度低、有阴影移动,室外用光流做低空补盲是可以的,但别指望它在正午的柏油路上稳定工作。
- 需要绝对位置的场景。光流只能抑制漂移,不能给你一个"起飞点坐标"。航点任务、多机协同这类需求,光流解决不了,得靠超宽带(UWB)或者动捕。
如果你要的是后者,光流模块选得再好也是白搭。
2. 光流模块的技术指标怎么读
参数表上的数字就那么几个,但每一个对应的实际意义差别很大。这一章把关键指标拆开,配上计算过程,让你看规格书的时候知道哪个数字会卡住你的应用。
2.1 尺度因子:焦距的像素表示决定一切
光流模块的镜头可以用两个参数描述:视场角(FOV)和像素阵列尺寸。这两个参数一起决定了"焦距的像素表示",也就是一个像素位移对应多大的角度变化。
拿最常见的 PMW3901 举例:30×30 像素,标称视场角约 42°。按对角 42° 算,半角 21°,那么焦距的像素表示大约是:
f_px = (30 / 2) / tan(21°) ≈ 15 / 0.3839 ≈ 39 像素换算成每像素对应角度,大约是 42° / 30 ≈ 1.4°。意思是传感器每识别到一个像素的位移,就认为机体转了约 1.4 度。这个数字直接决定了两件事:一是最小可分辨的角速度(噪声底),二是飞控里焦距参数该填多少。
这里有个非常容易被忽略的坑:42° 到底是水平、垂直还是对角线?厂商规格书经常不写清楚。如果你按对角线算,实际是水平的,焦距参数就会差十几个百分点,速度估计整体缩放错误——正好对应我开头那次 15% 的偏差。所以厂商给的默认焦距参数只能作为初值,一定要自己标一遍,第 5 章会给具体方法。
2.2 最大角速度与分辨率:PMW3901 和 PX4Flow 的代差
PMW3901 这类小传感器,规格书上写的最大跟踪速度是 7.4 rad/s,听起来非常宽裕。但你要把它换算成线速度:
| 对地高度 | 最大可测线速度(7.4 rad/s) |
|---|---|
| 0.3 m | 2.2 m/s |
| 1 m | 7.4 m/s |
| 3 m | 22 m/s |
| 10 m | 74 m/s |
表格很清楚:光流的硬限制是角速度,不是线速度。飞得越低,能承受的最大速度越小。室内贴地 30 cm 飞穿越,理论极限也就 2.2 m/s,一旦超了,光流输出会饱和变成一堆质量很差的点,滤波器把它当噪声处理,飞机就开始飘。很多人在室内低空冲刺之后"光流突然失效"就是这个原因,不是模块坏了。
反过来看分辨率。30×30 的阵列在细节上是很粗糙的。在 1 m 高度,一个像素对应地面上的位移大约是:
1 m × tan(1.4°) ≈ 2.4 cm也就是说,传感器读出 1 个像素的量化噪声,等效到地面上就是 2.4 cm 的位置抖动。这个数量级直接决定了光流的速度估计噪声底。相比之下,PX4Flow 那颗 752×480 的全局快门传感器信噪比就好得多,代价是体积、重量和价格都上去了。
2.3 全局快门和卷帘快门:振动平台上的生死线
这一条经常被无视,但在多旋翼上是实打实的生死线。
卷帘快门逐行曝光,机体的高频振动会让不同行之间的曝光时刻错开,画面产生"果冻效应"形变。光流算法假设两帧之间是刚性平移,画面一形变,算出来的位移就带上了假分量。结果是:飞机越抖,光流报出来的"速度"越离谱,滤波器把这个假速度当真实观测,于是飞机开始自己往一个方向跑,形成正反馈。
全局快门所有像素同时曝光,从原理上就不吃这个亏。这也是为什么 PX4Flow 用 MT9V034、为什么工业级的视觉定位模块基本都上全局快门。反过来,市面上大部分便宜的 PMW3901 模块是卷帘的,装在 5 寸以上、桨叶没做动平衡的机架上就容易出问题。
实操建议很直接:如果你的机架大于 5 寸,或者做过动平衡之后仍有明显振动,优先考虑全局快门模块,或者至少把光流模块用软质减振垫隔开,别直接硬螺丝拧在碳板上。
2.4 照度、纹理和被测面:三个规格书上不写的隐性参数
这三个参数决定了光流在实际场景里能不能用,但规格书上往往只有一行小字。
照度方面,PMW3901 一类的模块依赖环境光成像,暗环境下的对比度会急剧下降。室内正常照明没问题,傍晚的厂房、地下车库这种场景就要打折扣。选型时可以看一下模块有没有板载补光 LED,有补光的模块在暗环境里要稳得多,代价是功耗和发热。
纹理方面,前面说过纯色地面不行,但还有一个更隐蔽的情况:周期性纹理会造成误匹配。比如铺满同规格瓷砖的地面、带规则网格的防静电地板,相邻区域的图案长得一模一样,块匹配算法很容易匹配到隔壁一格上去,输出一个方向正确、幅度完全错误的速度。这种情况的表现是飞机沿某个轴向冲得特别快。我遇到过一次,在一间铺 60×60 地砖的会议室里,飞机往前飞得很稳,横移的时候速度估计会突然翻倍,最后是换了更大搜索窗口的模块才解决。
被测面的反光也不能忽略。抛光地面上如果有窗户的反光斑,那个亮斑在图像里是跟着飞机移动还是固定不动,算法会搞混,输出直接是噪声。
3. 主流模块横评:从几十块到几百块差在哪
市面上能买到的光流模块,按结构大致分四类。价格差距不小,但贵的部分不全是智商税,关键看你的场景用不用得上那些溢价。
3.1 PMW3901 阵营:小、便宜、够用
这是目前最主流的方案,核心就是那颗 PMW3901 光学追踪传感器加一颗小镜头。围绕它衍生出一堆模块,差别主要在接口和是否集成测距:
- Matek 3901-L0X / ThoneFlow 这类 UART 模块。光流加上一颗 VL53L0X 激光测距,串口输出,重量两三克,价格百元以内。ArduPilot 和 PX4 都有现成驱动,插上就能认,是新手最省事的起点。缺点是 VL53L0X 量程只有 2 m 左右,室内够用,室外飞高就不行了。
- HereFlow / ARK Flow 这类 DroneCAN 一体模块。光流加 VL53L1X,量程到 4 m 左右,走 CAN 总线,一根线搞定供电和通信,抗干扰比 I2C 好得多,还支持多节点挂同一总线。重量十克以内,价格两三百到四百。中大型机、走线讲究的机型值得上。
- 纯光流 SPI 小板。只有传感器,SPI 直连飞控,最轻最便宜,但要占用飞控 SPI 口,走线长了对时序有影响,一般用在微型机上。
PMW3901 阵营的共性是:室内 0.1 m 到 3 m 高度范围内表现稳定,成本低,生态成熟。缺点是卷帘快门、分辨率低、对振动和光照敏感。
3.2 PX4Flow:全局快门时代的遗留强者
PX4Flow 是一个自带处理器的模块,板载 STM32 做块匹配,用的是 MT9V034 全局快门传感器,752×480 分辨率,还集成了一颗超声测距和一个陀螺。它把原始图像处理这一层做在了模块内部,飞控只负责收结果。
优点很突出:全局快门,抗振好;分辨率高,噪声底低;自带超声,超过 2 m 也能用;驱动在老固件里是原生支持。缺点同样明显:重(二十多克)、体积大、I2C 速率受限、超声在户外有噪声、功耗高,而且原厂基本停产,现在只能买二手或者国产替代版本。
我的判断是:新项目没必要专门去找它,除非你手上已经有,或者你的场景是"振动大、速度高、买新模块不划算"的老机改造。
3.3 鼠标传感器衍生品和玩具级模块
还有一类是用老式鼠标传感器做的模块,比如 ADNS-3080 方案,还有各种几十块钱的串口"光流小方块"。这类模块的特点是便宜、能出数据,但质量参差。
它们的问题通常出在几个地方:一是没有质量(quality)字段,飞控没法判断数据可信度,坏数据也照单全收;二是出厂固件里的尺度参数不透明,标定起来麻烦;三是刷新率和延迟不透明,做速度观测的时间戳对不齐,滤波器会持续报创新过大。
如果你只是想让飞机在室内"不那么快飘走",这类模块能用。但如果要拿它做定点悬停、自动航线,建议直接跳过,省下的钱不够补调试的时间。
3.4 一体式还是分离式,四种接口怎么选
| 接口 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| SPI | 延迟最低,速率高 | 占用飞控 SPI,走线短,多设备 CS 冲突 | 微型机、板载集成 |
| I2C | 走线简单,几个引脚 | 速率低,长线易受干扰,地址冲突 | 小机型、短距离 |
| UART | 通用,几乎所有飞控都有富余串口 | 需要配置波特率和协议,线序易接反 | 中型机、快速上手 |
| DroneCAN | 抗干扰强,一线通,多节点 | 需要飞控支持 CAN,模块价格高 | 中大型机、工业场景 |
我个人的偏好顺序是:DroneCAN > UART > SPI > I2C。I2C 排最后不是因为不好用,而是它在光流这个场景里最容易出玄学问题——线长超过 20 cm 就开始丢包,而且丢包的表现是"偶尔掉一下数据",看日志很难定位。如果你非要用 I2C 模块,把上拉电阻和线长当成正经事来做,别用那种软趴趴的杜邦线。
4. 高度源才是光流的半条命
选型讨论里最常被跳过的一环。前面公式 v = ω × h 已经说明了,高度误差会一比一传递到速度上。这一章专门讲高度源怎么选、怎么配。
4.1 激光、超声、气压计各自的适用边界
- 气压计。便宜、无方向性、室内室外都能用,但分辨率差(室内几米高度差对应的气压变化极小),而且受气流影响大。空调出风口、开关门、飞机自身的螺旋桨下洗都会干扰它。室内低空场景下,气压计给出的对地高度误差经常在 20% 以上,直接拖累光流。
- 超声波。室内近距离精度好,成本低。缺点是量程短(一般 2 m 以内可靠),波束角大,遇到倾斜地面或者软质地面(地毯、草地)反射差,户外受风影响严重。而且多个超声同时工作会互相干扰。
- 激光测距(ToF)。精度好、波束窄、响应快,是目前室内低空高度源的最优解。VL53L0X 量程约 2 m,VL53L1X 约 4 m,TFmini 这类可以到 6~12 m。缺点是受地面反射率影响,黑色地面量程会缩水,强阳光下室外基本没法用,玻璃和水面会给出错误读数。
我的实际做法是:室内 3 m 以下场景用激光,同时保留气压计作为备份和异常切换;超过 3 m 的场景用长量程激光,并且把气压计和激光做互补滤波。单靠任何一个都不够稳。
4.2 高度误差如何原封不动污染速度
举个具体例子说明这件事有多要紧。假设飞机真实高度 1.0 m,真实速度 1.0 m/s,光流测出的角速度是准确的 1.0 rad/s。如果高度源报的是 0.85 m,飞控算出来的速度就是 0.85 m/s,偏小 15%。EKF 内部的速度估计会向这个错误观测收敛,位置积分就慢下来。表现出来就是:飞机实际在往前走,但系统以为走得慢,于是继续推杆,最后一头扎出去。
更麻烦的是这个误差不是恒定的。激光在地毯上量程缩水、气压计随温度漂移,误差会随时间变化,滤波器就一直在追着一个移动的错误目标。这就是为什么很多人的光流系统"一开始挺好,飞一会儿就飘"。
一个实用的检查方法:把飞机举到 1 m 高度,用手在水平方向匀速平移大概 1 m 的距离,看地面站里 EKF 报出来的水平位移是不是接近 1 m。如果明显偏小或偏大,高度源的问题很可能是主因,先别去动光流的焦距参数。
4.3 多高度源切换时的跳变处理
用了多个高度源,就要处理切换逻辑。踩过的坑里最典型的一种:起飞时光流用的是激光测距的高度,飞到 4 m 超出激光量程,系统自动切到气压计,而气压计此刻给出的高度是 3.2 m——瞬间跳变 0.8 m。这个跳变会被当成真实的垂直速度,同时所有基于高度的水平速度估计全部错一遍。
处理办法各有不同,但思路是一致的:给每个高度源设定明确的有效区间,切换时做渐变过渡而不是硬切,并且在切换瞬间降低高度观测的权重。具体到参数,ArduPilot 侧要关注测距的量程参数和 EKF 的高度源选择,PX4 侧要关注测距的最小最大量程和高度模式设置,把它们的有效区间设置得比实际能力小一点,留出余量,宁可早点切也不要切在真实极限上。
5. 参数配置与标定:ArduPilot 和 PX4 两条线
模块买对了、装好了,接下来是把参数调对。这一章给两条主流固件的具体配置思路,参数值请以你所用固件版本的参数表为准,不同版本会有出入。
5.1 ArduPilot 侧的关键参数
首先要让飞控认识这个模块。光流类型参数(FLOW_TYPE)要选对型号,选错了会完全收不到数据或者收到乱码。串口型的模块还要把对应串口的协议设成光流协议(协议号为 18,改之前用参数表确认一下你的版本是不是这个号),波特率按模块规格设置,UART 模块一般是 115200。
然后是 EKF 的源选择,这是室内定点的核心配置:
| 参数 | 建议值含义 | 说明 |
|---|---|---|
| EK3_SRC1_POSXY | 0(无) | 室内没有绝对水平位置源 |
| EK3_SRC1_VELXY | 5(光流) | 水平速度全部来自光流 |
| EK3_SRC1_POSZ | 2(测距) | 垂直位置来自激光测距 |
| EK3_SRC1_VELZ | 0(无) | 垂直速度由位置推导 |
| EK3_SRC1_YAW | 1(罗盘) | 室内如果没有磁干扰用罗盘 |
如果室内磁干扰严重(钢结构厂房、电机附近),可以把 YAW 源换成外部视觉或者干脆用初始航向,避免罗盘在光流系统里拖后腿。
还有一个参数值得单独提:测距仪的朝向参数要设成向下(数值 25),并且把最小最大量程设置成和实际能力匹配的值。很多人卡在这里,测距仪数据在日志里能看到,但 EKF 不用,就是因为朝向或者量程没配对。
5.2 PX4 侧的关键参数
PX4 的参数组织方式和 ArduPilot 不太一样,光流相关的分两组:一组是传感器层的,一组是 EKF 层的。
传感器层主要是光流的安装朝向(绕不同轴的旋转)、最小和最大有效高度。最小高度这一项特别重要——PMW3901 在 8 cm 以内的图像是糊的,如果最小高度设成 0,飞控在起飞擦地阶段就会收到一堆垃圾数据。常见做法是下限设 0.05 到 0.1 m。
EKF 层关注这几个:光流控制开关、最小质量阈值、观测噪声下限和上限、创新门限。质量阈值这一项决定了"多差的数据才被丢弃",如果你的模块有质量字段,把它设成能过滤掉差数据但不至于把好数据也扔了的值,需要看日志里的质量分布来定,没有万能值。观测噪声先按模块标称算,再根据日志里创新序列的分布微调。
5.3 手转和平移两种标定法
标定的目的是把焦距参数(FLOW_FX / FLOW_FY 或对应参数)和实际模块对齐。两种方法我都用过,推荐平移法,因为更直观、可重复。
平移法步骤:
- 把飞机平放在桌面上,光流镜头朝下,用垫块把镜头到桌面的距离固定在一个好算的值,比如 0.5 m。
- 在地面下铺一张有清晰纹理的纸或垫子,别用纯桌面。
- 沿一条直线匀速平移 0.5 m(用卷尺量好起点终点),速度控制在大约 0.5 m/s。
- 同步记录日志,看光流积分出来的位移。
- 如果日志显示 0.58 m,说明焦距参数偏小 16%,按比例放大;反之缩小。
重复两三次,让误差收敛到 5% 以内就够用了。整个过程要注意三点:平移过程高度保持恒定(手一抖高度变了,误差就混进去了);光照保持稳定;平移方向尽量和机体的一个轴对齐,方便分辨是哪个轴的参数要改。
手转法(验证用):把飞机按住,绕垂直轴匀速转 90°,同时看日志里光流报出的角速度积分是不是 π/2。这个方法适合快速验证安装朝向对不对,但因为陀螺补偿会一起参与,做定量标定不如平移法干净。
5.4 验收标准:什么样的漂移算正常
调完之后怎么判断合格?我给一套自己的验收标准,室内 1~1.5 m 高度、有纹理地面:
- 定点悬停 60 秒,水平漂移在 0.5 m 以内算合格。要求更高的场景能压到 0.3 m,但需要更好的高度源和更低的振动。
- 日志里光流的创新序列应该是白噪声形状,均值接近零,如果有明显的直流偏移,说明尺度因子没标好。
- 快速横移之后能收住,不会持续往一个方向跑。
- 从 0.5 m 缓慢升到 2 m,速度估计不出现比例失调,如果高度升高后速度估计明显偏小,说明高度源在高处的误差变大了。
达不到这几条,先回去查高度源和振动,别急着换模块。
6. 六个真实故障的排查链路
这一章按"现象—排查—根因"的顺序写,都是我实际遇到过的。排查顺序很关键,按这个顺序走能少走弯路。
6.1 有数据但位置照漂
现象:地面站能看到光流质量正常,速度也有输出,但飞机就是慢慢往一个方向爬。
排查链路:先看日志里光流报出的速度和实际运动方向是否一致(把飞机拿在手里手动平移,看符号对不对)。符号对说明安装朝向没问题,然后看量级。量级整体偏大或偏小,就是尺度因子或者高度源的问题。再进一步,把日志里的测距高度和卷尺实测高度对比,就能定位到是哪一个。
根因通常是两类:焦距参数没标定,或者高度源在低位测量不准。前者按第 5.3 节标定,后者换高度源或者修正安装位置的偏移量(测距仪装在机腹下方,到机体重心的距离要作为偏移量配置)。
6.2 一上电数据就乱跳
现象:还没起飞,光流输出的速度就在乱蹦。
排查链路:先判断是振动还是光照。用手把飞机按住不动,如果数据还是跳,排除振动。然后拿手电照一下地面增加对比度,如果数据变稳,就是光照或纹理问题。如果都不对,检查供电——光流模块的供电纹波大,图像质量会受影响,用示波器看或者换一路独立供电试。
还有一种是安装位置的问题:如果光流镜头离桨叶太近,螺旋桨下洗造成的地面气流会让地面上的灰尘、纸屑动起来,光流看到的是"地面在动",直接输出假速度。这个特别隐蔽,因为在地面静止测试时完全正常,一起飞就出问题。
6.3 室内好好的,出门就出事
现象:室内定点很稳,拿到室外就飘。
排查链路:室内外最大的差异是光照强度和环境纹理。正午的混凝土地面对比度很低,光流的质量字段会掉下来。先看日志里质量字段的室外分布,如果大面积低于门限,那就不是调参能解决的。
根因是环境限制,不是模块缺陷。解决方案有三条路:一是把光流只当作"起飞和降落阶段的辅助",室外正常飞就用 GPS;二是换更高动态范围的模块;三是在室外场景改用视觉定位方案。我一般推荐第一条,性价比最高。
6.4 光流和别的定位源打架
现象:同时开了光流和视觉定位(或者 UWB),飞机反而比以前更不稳。
排查链路:看日志里两个源的速度估计是否一致。如果两个源系统性偏差 10% 以上,EKF 会在两者之间来回拉,表现就是低频摆动。这种"两个都不太准的源互相打架"比单个源不准更麻烦。
解决办法是分级:不要同时把两个源都设为高优先级。用一个做主源,另一个只做健康监测和异常时的备份。或者对两个源都做一次物理标定,把系统偏差压到 5% 以内再融合。
6.5 起飞瞬间"吸地"
现象:飞机在起飞离地的那几厘米特别难离地,或者一离地就往前窜。
排查链路:先看光流的最小有效高度设置。如果设得太低,镜头在离地 3~5 cm 时图像还没对焦,输出的是一堆噪声,滤波器把它当成"飞机在高速运动",于是控制律反向修正。
根因就是最小高度配置不当,或者激光测距在这个距离上有盲区。解决办法是把光流最小高度设成 0.05~0.1 m,并且在起飞阶段暂时降低光流的观测权重,离地之后再启用。ArduPilot 和 PX4 都有类似的分阶段权重机制,具体参数查一下对应文档。
6.6 振动的隐蔽影响
振动导致的问题最难查,因为它不表现为"数据乱",而是表现为"数据有规律地错"。光流在特定油门点会报出一个稳定的假速度,飞机就沿着那个方向持续走。
排查方法:把油门固定在几个典型点位,看光流输出的直流分量随油门怎么变。如果某个油门区间出现稳定的偏移,基本可以确定是振动耦合。
解决办法按成本从低到高:做桨叶动平衡、给光流模块加减振垫(注意减振垫本身会引入低频晃动,要选对硬度)、改用全局快门模块、把光流装在离电机更远的位置。
7. 按场景选:四种典型机型的配置建议
选型最终要落到具体机型上。这一章按四种典型场景给出配置和预算参考。
7.1 室内穿梭机和微型机
起飞重量 250 g 以下,对重量极度敏感,飞行高度 0.3~2 m,速度要求高。
推荐:SPI 直连的 PMW3901 小板,或者 UART 小模块加 VL53L0X。重量控制在 3 g 以内。注意把光流最小高度设好,低空穿越时速度别超过前面算的 2~3 m/s 上限。这种配置下不要指望它做精确悬停,够用就行。
7.2 巡检机与室内测绘
起飞重量 1~5 kg,高度 1~4 m,需要稳定悬停和慢速航线。
推荐:DroneCAN 一体式光流加激光模块,配一颗长量程激光做高度源冗余。走 CAN 总线,走线干净,抗干扰好。这种配置能做到 60 秒漂移 0.3 m 以内。如果振动大,考虑全局快门方案,或者把模块做二次减振。
7.3 户外低空补盲
场景是 GPS 短时失效(桥下、林间、楼宇间),需要光流顶上一段。
推荐:全局快门模块,高度源用 TFmini 这类长量程激光,同时在参数上做好 GPS 和光流的切换逻辑,让光流只在需要时介入。要接受光流在正午硬质地面、水面上的局限,把光流定位的失效时间设短一点,及时退出。
7.4 教学和批量装机
场景是几十台设备要统一配置,预算敏感,维护简单。
推荐:UART 一体的 PMW3901 模块,走线和配置统一,坏了好换。批量装机最怕的是每台都要单独标定,所以选一个出厂一致性好的型号,标定参数直接复制,只在个别机器上做微调。这一点上,成熟品牌的模块比杂牌省的时间远超差价。
8. 想自己做模块:几个现实问题
如果你打算自己搭一个光流模块,而不是买现成的,有几个决策点值得想清楚。
8.1 传感器和镜头怎么挑
传感器层面,卷帘快门的消费级方案便宜好买,全局快门的工业方案贵但能用在高振动平台。镜头层面,视场角的选择是个权衡:视场角大,同样高度下能覆盖更多地面纹理,但每像素对应的角度变大,分辨率下降,而且边缘畸变严重;视场角小,分辨率好,但需要更高的飞行高度或者更长的焦距。
我的建议是先用现成模块跑通全流程,摸清楚你的场景真实需要多少分辨率,再去决定传感器和镜头的参数组合。跳过这一步直接做硬件,很容易做出一个参数很漂亮但场景不对的东西。
8.2 算力放在哪
两个选择:模块内做块匹配(像 PX4Flow 那样),飞控只收结果;或者模块只出原始图像或简单特征,算力放在飞控或者机载计算机上。
模块内做匹配的好处是延迟确定、飞控负担小;坏处是灵活度低,算法升级要刷模块固件。算力放上面的话,好处是算法可以随时迭代,坏处是引入了图像传输的延迟和带宽压力,而且飞控上的算力通常不够,得单独挂一台机载计算机。
8.3 延迟和时间戳,比精度更致命
自己做模块最容易栽的地方是延迟。光流数据从曝光到进入滤波器,中间有曝光时间、传输时间、处理时间,加起来可能几十毫秒。如果这个延迟没有被正确补偿,滤波器会把滞后数据当成当前数据,融合出来的速度会产生相位滞后,表现出来就是控制环在特定频率上振荡。
所以自研模块的时候,一定要把时间戳做对:图像的采样时刻要准确记录,并且通过协议传到飞控。飞控侧的延迟补偿参数要设成和实际延迟一致。这件事的优先级比把精度提高 5% 高得多。
8.4 从哪开始改代码
如果要基于开源方案起步,这几个方向是常见的切入点:飞控固件里已有的光流驱动和 EKF 融合逻辑,可以拿来看飞控期望的输入格式和时间戳约定;开源的视觉里程计算法实现,可以拿来做算法验证和仿真;光流数据的记录和回放工具,可以在不飞的情况下反复调试算法参数。
我自己的习惯是先在桌面上用录制的图像序列把算法跑通,再上模块,最后才上飞机。上飞机之后每次改参数都录日志,用回放的方式比对改前改后的效果。这套流程听着笨,但比"改一个参数出去飞一次"快得多,尤其是在有风或者场地要预约的情况下。
最后分享一个我在实操里总结的小技巧:光流系统的调试顺序永远是"先高度、再尺度、最后滤波"。顺序反了会浪费大量时间——很多人一上来就去调滤波器的噪声参数,试图用滤波把系统性偏差压下去,结果是把真实的动态响应也一起压没了,飞机反应迟钝还飘。先把高度源和尺度因子校准到 5% 以内,剩下的滤波调参就是水到渠成的事。这套顺序我在至少七八个不同机型上验证过,没有例外。