news 2026/10/7 5:19:16

无人机光流模块选型、标定与室内定位实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
无人机光流模块选型、标定与室内定位实战

三年前在一个钢结构厂房里做巡检演示,飞机在起飞点上方稳得像钉住一样,往前飞了七八米,位置就开始慢慢往右后方爬,最后撞在钢梁上。那天返厂查日志,才发现问题根本不在飞控调参,而在这台无人机上那颗几十块钱的光流模块——它测出来的速度整体偏了大概 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 m2.2 m/s
1 m7.4 m/s
3 m22 m/s
10 m74 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_POSXY0(无)室内没有绝对水平位置源
EK3_SRC1_VELXY5(光流)水平速度全部来自光流
EK3_SRC1_POSZ2(测距)垂直位置来自激光测距
EK3_SRC1_VELZ0(无)垂直速度由位置推导
EK3_SRC1_YAW1(罗盘)室内如果没有磁干扰用罗盘

如果室内磁干扰严重(钢结构厂房、电机附近),可以把 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 或对应参数)和实际模块对齐。两种方法我都用过,推荐平移法,因为更直观、可重复。

平移法步骤:

  1. 把飞机平放在桌面上,光流镜头朝下,用垫块把镜头到桌面的距离固定在一个好算的值,比如 0.5 m。
  2. 在地面下铺一张有清晰纹理的纸或垫子,别用纯桌面。
  3. 沿一条直线匀速平移 0.5 m(用卷尺量好起点终点),速度控制在大约 0.5 m/s。
  4. 同步记录日志,看光流积分出来的位移。
  5. 如果日志显示 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% 以内,剩下的滤波调参就是水到渠成的事。这套顺序我在至少七八个不同机型上验证过,没有例外。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 5:19:07

2026前端面试实战笔记:从简历打磨到框架原理与场景题全攻略

2026年3月5日,春招和跳槽季正好撞在同一条时间线上。白天投简历、约面试,晚上回来复盘,我把这两个月里所有前端面试遇到的问题、答得不好的地方、以及后来补齐的知识点,整理成了一份笔记。这份笔记不是什么“标准答案合集”&#…

作者头像 李华
网站建设 2026/10/7 5:19:03

C++类为何不能包含自身对象?从sizeof与不完整类型说起

1. 一个让新手程序员集体懵圈的编译错误先还原一个我见过无数次的场景。某个刚学C的朋友写了这样一段代码:class Person { public:Person() {} private:Person other; // 错误:字段“other”具有不完整的类型 };编译器直接甩出一句“field ‘other’ ha…

作者头像 李华
网站建设 2026/10/7 5:18:04

AI Native团队SDLC重构:Claude Code与CLAUDE.md实战手册

1. 从"人写代码"到"人管Agent":AI Native团队到底变了什么这两年"AI Native"这个词被喊得太多,多到有点变味。很多团队挂上这个牌子,实际干的事还是老一套:产品经理写PRD,开发照着文档敲…

作者头像 李华
网站建设 2026/10/7 5:17:49

JVM类加载机制全解析:从双亲委派模型到类冲突排查实战

线上服务发版后,有个接口开始随机报ClassNotFoundException,日志里明明能看到那个类就在依赖包里,但就是加载不到。当时我盯着堆栈看了半天,最后才意识到问题根本不在包有没有引入,而在类加载器。这种场景干过几年 Jav…

作者头像 李华
网站建设 2026/10/7 5:16:41

校园图书借阅系统实战:SpringBoot+Vue从设计到部署的避坑指南

简介:本资源是面向高校计算机专业学生与Java全栈开发者的校园图书借阅与管理系统完整项目源码,采用SpringBoot后端与Vue.js前端的前后端分离架构,适合作为课程设计、毕业设计或全栈练手参考。压缩包共1087个文件,约1.8MB&#xff…

作者头像 李华
网站建设 2026/10/7 5:16:21

微信小程序手机号组件接入指南:快速验证与实时验证选型、避坑经验

1. 手机号组件到底能帮你省多少事做微信小程序开发的人应该都有体会,用户身份体系搭建永远是第一个绕不过去的坎。以前要做手机号登录,常见的套路是让用户自己输入手机号,再发送短信验证码,用户收到后填回来。这套流程本身没什么问…

作者头像 李华