玩无人机的都清楚,飞控能稳住姿态、GPS能定位,但真正让飞机“有脑子不乱撞”的,其实是避障相机。最近好多朋友来问我到底怎么选避障相机,问的人里有DIY装机的新手,也有做行业应用的老手。我翻了手头几台飞机,又结合这些年踩过的坑,把避障相机的底层逻辑和经验整理成这篇东西。先说结论:选避障相机,核心不是看像素有多高,而是看“快、宽、稳”三件事——即帧率、视场角、宽动态表现,以及和你的算法/飞控能不能对得上。这篇文章适合准备做无人机视觉避障、双目测距、光流辅助定位的朋友参考,也适合被各种相机参数搞晕头的初学者,看完基本就知道该怎么选了。
1. 先搞清楚避障系统到底怎么“看”世界
1.1 避障相机不是人眼相机,是“传感器阵列”
很多人一上来就纠结“要不要买4K相机”,这是把安防摄像头的思维带进来了。避障相机的核心任务不是拍出好看的画面,而是在极短时间内持续输出能够让算法识别“前方有没有障碍物、障碍物在哪个方向、大概多远”的图像数据。它更像雷达的替代品,只是用光学的形式去感知深度和轮廓。
目前的视觉避障大体分三条路线:光流避障、单目视觉测距避障、双目立体视觉避障。光流方案通常配一个朝下的灰度小相机,靠地面的纹理变化估计水平速度和位移,帮助飞控稳住位置,顺便做一个简单的“下方没有可降落平面”的检测。单目方案靠一帧画面里的物体大小、位置变化,配合深度学习的语义分割做避障判断,部署成本低、速度快,但测距精度一般。双目方案是用两个固定间距的相机同时拍同一个场景,两帧画面的视差反推深度,精度高、不依赖外部特征,但计算压力和硬件配对要求都高,而且这是真正意义上能给飞控“三维障碍图”的方案。
所以你先想清楚:你的飞机要防什么方向的碰撞?是只防机头朝前撞墙、撞树枝,还是周围360度都要感知?是低速室内悬停,还是高速户外穿越?不同场景对相机的需求完全不同,后面所有参数选择都要围绕这个起点展开。这也是为什么很多新手下单直接买两个安防模组回来,结果算法跑起来要么画面糊、要么同步崩。不是相机不够好,而是从一开始就没想清楚让它感知什么、以多快的节奏感知。
1.2 场景决定方案:室内、室外、高速、低速的取舍
我做了个很直白的总结:低速室内机,光流 + 超声波组合就能满足基本避障;中速室内或低空户外,单目 + 神经网络检测就够用;真正需要高速穿越、贴地飞行、复杂环境的,就必须上双目立体视觉甚至LiDAR辅助。为什么?因为反应时间不够。
算一笔账你就明白了:一台正常飞行的穿越机速度大约15m/s,如果你用10Hz的感知帧率,相当于每100ms才得到一次障碍信息,飞机在这个间隔里已经飞出了1.5米。如果这时候障碍物在20米开外,你有大约十几帧的时间做判断,但如果你飞的越快、感知频率越低,留给控制系统的距离就越短。低速飞行的无人机,感知频率低一点问题不大;高速飞行时,低于30fps的视觉输入基本就是“睁眼瞎”状态。所以我建议做中高速机型的朋友,感知链路至少按30fps起步来设计,这才是选避障相机的第一道硬门槛。
1.3 主动避障与被动避障的区别
还有一个容易混淆的地方:避障相机本身分“主动”和“被动”。被动避障靠环境自然光反射进入镜头成像,成本低、功耗低,室内外都行,但晚上或者浓雾天直接趴窝。主动避障则是给相机加了个补光装置,比如红外LED投射结构光,或者用ToF主动发光测量,它是自己发信号再回收,弱光环境下也能用。但主动方案功耗高、成本高,近距离精度好而远距离衰减严重。
你在选相机的时候,要结合飞机用途做这个主被动判断。室内玩的小机器用被动就足够了,别花冤枉钱;做安防巡检或者夜间飞行的,再考虑主动方案。而且主动方案往往需要专门的驱动芯片,不是普通相机模组能替代的,这点要提前查清楚。我的经验是,绝大多数消费级和DIY级别的项目,被动双目加补光LED的方案性价比最高,在光照条件尚可的场景里已经能压榨出不错的避障能力。
2. 避障相机五大核心参数,商家不会告诉你的事
2.1 分辨率不是越高越好,“够用”才算聪明
避障相机的主流分辨率区间其实集中在VGA(640×480)到1080p之间。很多人会觉得“4K肯定比720p看得远”,但实际上是两码事。避障算法处理的是“有没有障碍、障碍轮廓长什么样”,不是“障碍物上的纹理细节有多精细”。分辨率越高,意味着需要处理和传输的数据量越大、曝光和读出时间更长、更容易受卷帘效应影响,而它对避障距离的贡献也远小于视场角和帧率。
举例来说,一颗OV9281这类全局快门VGA传感器,在低照度表现和快门效率上往往比很多低端4K传感器更讨巧。为什么?因为小分辨率意味着单像素面积更大、感光能力更强,在光线一般的户外树林里反而更可靠。而且处理器输出视差图、跑神经网络的算力是有限的,你上4K,计算单元容易吃不消,避障帧率直接被拖垮。所以我的选型原则是:入门用VGA/480p级别,进阶用720p到1080p级别,除非你的处理器是旗舰级的,否则别上4K避障。
2.2 帧率才是避障相机的生命线
上面讲算账的时候已经露出了一点帧率的重要性,这里我再讲深一点。视觉避障的全链路延迟包括:传感器曝光时间、读出时间、传输时间、算法推理时间、飞控决策时间、舵机或电机响应时间。相机部分能影响的,主要是曝光读出和传输延迟。
以全局快门相机配合高帧率模式为例,常见能做到60fps甚至120fps的VGA输出。这意味着避障系统每8ms就能刷新一次感知结果,给飞控留下了更充裕的避障空间。相反,很多安防卷帘快门相机只能做到30fps,而且遇到快速运动时图像会变形,视差计算大概率出错。实测下来,35km/h飞行,30fps的卷帘相机在光线一般时避障成功率不到50%,换成60fps全局快门,成功率能提到90%以上。所以别省这个钱,高速飞行优先选高帧率全局快门相机。
2.3 快门方式:卷帘还是全局,差的不只是“果冻”
卷帘快门传感器是逐行曝光、逐行读出的,图像里每一行的曝光时间起点不同。飞机高速运动或者机身高频振动时,这种逐行差异会变成明显的“果冻效应”:原本竖直的树干会歪斜、螺旋桨叶变形。对避障算法来说,这种几何形变等于直接污染了深度计算的数据源,哪怕做了畸变校正,也无法完全修复。
全局快门则在同一瞬间曝光整帧画面,画面里每一个像素都在同一时刻被抓取,不存在行间时间差。这对运动场景的视觉测距和特征匹配非常重要。避障相机里全局快门几乎是硬性要求,至少用于双目视觉的那两颗必须是全局快门。如果你看到某个模组写着是卷帘快门但号称“智能避障专用”,大概率是拿安防产品贴牌,直接绕开就行。
2.4 宽动态和逆光表现,决定“能不能在傍晚起飞”
避障相机的另一个隐形杀手是大光比场景。比如黄昏的树林、背对太阳飞行、窗口进光的室内,明暗差异能到十几倍甚至几十倍。普通传感器在这种场景下,要么暗部全黑、要么高光过曝,避障算法根本提取不到有效特征。
解决方式有两种:一是传感器本身支持高动态范围(HDR,High Dynamic Range),用多次曝光合成高对比度画面;二是依赖全局快门配合软件调整曝光参数。实际选型时,我更推荐带线性模式加内建HDR的全局快门传感器,像Sony IMX系列、豪威(OmniVision)的一些车规级传感器都有不错表现。有些相机模组标称“WDR”,但只是软件做了GAMMA拉升,实际暗部噪点巨大,避障效果仍然很差。你可以在选购时直接问商家“暗部信噪比多少dB”,如果对方答不上来,说明这块很可能不是强项。
2.5 视场角和基线:远处的墙和近处的树枝,你得都能看见
视场角(FOV)决定了相机能看到多宽的范围。水平视场角太窄,飞机侧向的障碍物进入画面时已经太晚;太宽又会带来严重的边缘畸变,影响深度估计。常见的避障相机FOV在水平60°~120°区间。我个人的习惯是,横向避障用100°左右的广角,纵向俯视光流用100°~130°的超广角。前者的畸变量还在算法可校正范围内,后者则主要是为了在大范围移动时保持地面纹理可见。
双目相机的基线长度直接决定测距能力。基线越长,同样视差下测得的距离越远,但近处存在盲区——两相机视野的交叠区域有限。基线越短,近距离感知越好,但远距离视差变小,精度骤降。公式上粗略看是Z = f×B/d,Z是距离,f是焦距,B是基线,d是视差。你选12cm左右的基线配2.6mm小焦距镜头,适合感知3~15米的障碍;基线拉到30cm以上,能感知更远距离,但整机结构就得加大,近处盲区也明显。要在“远处能躲”和“近处能刹”之间找平衡,我推荐DIY玩家从10~15cm基线起步,经过实飞测试再调整。
提示:很多双目模组出厂就定死了基线和镜头,你自己换镜头会直接破坏视差模型。买之前先确认模组的基线、FOV是符合你应用场景的,尽量选接口开放、可以重新标定的模组。
3. 接口、SoC与整体架构:选相机其实是在选系统
3.1 CSI、USB、以太网,三种传输方式怎么选
掌握了传感器本身的指标,还只是一个维度。避障相机拍到的图像,总得走到处理器里去跑算法。目前主流的接口无非三种:MIPI CSI、USB、GigE以太网。MIPI CSI是SoC和相机之间最直接的并行接口,延迟极低、带宽高,适合树莓派、Jetson Nano这类开发板直连,代价是需要排线布局紧凑、软件配置稍微麻烦。USB接口胜在方便,即插即用兼容性强,但传输上有协议开销,延迟会高一点,UVC协议的相机在带宽抢占严重时可能出现帧丢失。GigE接口常用于工业相机,布线距离长、稳定性好,但需要独立供电和更高成本,DIY无人机上相对少见。
如果你用的是树莓派或者Jetson系列,我的建议是优先考虑CSI接口的双目模组。CSI不仅能保证帧同步的一致性更好,也减少了USB控制器带来的CPU占用。很多现成的双目模组,比如基于OV2311的双目摄像头,直接一根FFC排线接上就能跑,调试成本低很多。USB相机不是不能做双目,而是两个独立USB相机在时间同步上很麻烦,除非模组本身内部做硬件同步,否则软件同步的误差会让视差图“抖动”,深度边缘模糊。
3.2 输出RAW还是YUV,算法到底需要什么
避障算法的后端不是只看RGB彩图那么简单。很多深度估计算法(像SGBM、BM、甚至深度学习视差模型)直接吃的是灰度图或者RAW图,彩色图像预处理反而增加了噪声和计算开销。双目立体视觉中,为了精确匹配左右像素,最好让两个相机输出完全相同灰度特性的图像。如果相机内部自动做了白平衡、自动曝光,会在两帧之间产生曝光差异,影响匹配效果。
这就是为什么工业级避障相机模组通常提供RAW输出、关闭一切自动图像处理,让算法端自己控制曝光时间和增益。你选相机的时候,尽量选能够“关闭自动曝光、手动设置曝光和增益”的模组。如果商家宣传里写“全自动对焦、自动白平衡”,这类相机大概率更适合拍照,而不是做深度感知。一句话总结:避障相机要的是可控制的原始数据,而不是讨好眼睛的成品图。
3.3 双目系统的硬件配对,远比你想象的严格
很多人直接买两颗相同型号的镜头和传感器,回到飞控上发现视差图对上不齐,就以为是代码问题。其实核心原因是两颗相机的镜头、传感器甚至镜头座的角度只要有一点点制造差异,都会导致两幅图像之间的几何关系发生偏差。专业双目方案都是出厂经过精密对齐标定的。自己DIY双目,至少要准备一张标定板,跑一遍棋盘格标定流程,算出两相机间的外参(旋转R和平移T)以及各自的内参和畸变系数,再在立体校正后测试深度图。
另外,两颗相机的传感器要做到硬件同步曝光。软件同步虽然省事,但精度和稳定性差太多。尤其是卷帘快门相机,软件同步几乎不可行;而全局快门相机配合硬件触发线,能做到微秒级同步误差,这样拿到的左右画面才真正反映同一时刻的场景。如果模组已经内置了硬件同步功能,那就是加分项,可以优先选。
4. 实操配置参考与方案选型示例
4.1 入门DIY方案:树莓派 + 全局快门单目相机
如果你是第一次给无人机加避障,别一上来就搞双目。先做个最稳妥的方案:树莓派Zero 2W或者树莓派4B,配一颗支持全局快门的MIPI相机,比如树莓派官方的GS Camera(基于Sony IMX296),再接一个下视光流模块。这里用到的算法是“单目近距避障 + 水平光流辅助”,飞控用开源的ArduPilot或者PX4都行。
这套方案的精力主要花在相机的安装角度上:光流模块朝下偏前约30°~45°,保证低空飞行时能看到地面纹理,也能稍微感知侧面墙体。默认树莓派把相机识别为/dev/video0后,你可以用v4l2-ctl命令直接调整曝光时间和增益,比如:
v4l2-ctl -d /dev/video0 --set-ctrl=exposure=300,analogue_gain=8把曝光压短一点,避免运动模糊。这一步很关键,因为很多朋友装上后发现光流图案糊成一团,先别怀疑传感器,往往就是曝光太长导致的。调完曝光再跑OpenCV里的Lucas-Kanade光流算法,每秒能达到20~40帧,完成基础避障绰绰有余。
4.2 进阶双目方案:Jetson Orin Nano + 100°全局快门双目模组
想真正做三维避障,就得上双目。我目前比较推荐的硬件组合是NVIDIA Jetson Orin Nano配合基于OV2311/IMX287的全局快门双目模组,基线约120mm,FOV选100°。这个组合的优势在于,Orin Nano的GPU跑SGBM或小型深度学习网络都有余力,同时CSI口能直接接入双目模组的同步信号。
在软件层面,可以先用OpenCV的StereoSGBM快速验证:
import cv2 left = cv2.imread('left.png', cv2.IMREAD_GRAYSCALE) right = cv2.imread('right.png', cv2.IMREAD_GRAYSCALE) stereo = cv2.StereoSGBM_create( numDisparities=112, blockSize=11, P1=8 * 3 * 11 ** 2, P2=32 * 3 * 11 ** 2, mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY ) disparity = stereo.compute(left, right).astype(np.float32) / 16.0这里numDisparities要尽量覆盖场景深度范围,blockSize越大、视差越平滑但边缘细节越差,实际推荐值在9到15之间。算出视差值后,再乘焦距乘基线、除以视差,就能恢复出深度图。这个流程走通之后,再把视差图转成三维点云或者栅格地图,交给飞控的避障模块即可。整体开发周期大概两到三周,前提是标定做扎实。
4.3 相机标定:所有精度都建立在这几步上
自己组装双目,标定绕不开。先用打印好的棋盘格(比如9×6内角点),倾斜、旋转、远近各拍20对以上,然后跑OpenCV的calibrateCamera和stereoCalibrate。标定的关键要点有三个:一是标定板要足够平整,最好贴在玻璃板而不是普通纸板上,否则标定出的畸变系数全是标定板自身不平整的误差;二是左右画面必须来自同一时间的同步曝光,否则标定的外参会飘;三是标定后一定要做一次立体校正验证,看左右图像的行对准情况。
实测经验是,标定后纵向视差残差应该小于1个像素。如果残差超过这个数,优先怀疑安装结构是否发生形变、镜头是否有松动。很多模组号称“免标定”,但出厂标定只对应一个固定的装配关系,摔过一次之后尽量重新标定。避障相机的精度天花板,一半在硬件,另一半在标定手艺。
4.4 供电与散热:容易被忽视的稳定性关键
避障相机的功耗一般不高,但整套视觉系统加在一起就不容小觑。单颗全局快门相机功耗在几百毫瓦到1瓦左右,双目模组再加Jetson的功耗,峰值能做到15W以上。给相机单独供电时,尤其要注意滤波。电机调速器产生的纹波如果串进相机电源,画面会出现“水波纹”或莫名闪断。建议用独立的低压差稳压模块(LDO,Low Dropout Regulator,低压差线性稳压器)为相机供电,且尽量远离电机和电调的走线。
散热上,Jetson这类主控在跑神经网络时发热严重,如果长期超出工作温度,性能就会掉到保守频率,避障帧率直接减半。相机的传感器本身功耗不高,但贴在机臂上长时间飞行后,机臂共振和热量也会影响镜头座稳定性。我的常规做法是给主控加主动散热风扇,给相机模组贴一块导热硅胶垫与碳板连接,把热量导走,实测能明显降低长时间飞行时的图像噪声。
5. 常见问题与避坑实录
5.1 双目画面错位、深度图“花屏”,多是标定问题不是硬件
见过太多人装好双目之后第一反应是退换货。其实绝大多数“错位”都是因为没有做立体校正,或者标定数据丢在了上一次摔机前。校验方式是看视差图的边缘轮廓是否清晰连续,如果显示出来是一团噪声、没有明确的物体边界,先考虑两个问题:一、左右画面曝光参数是否一致;二、标定板拍摄数量够不够(至少15~20对)。必要时把相机固定在三角架上重新跑一次完整标定流程,八成能修好。
5.2 逆光飞行时避障失效,曝光参数必须手动锁定
逆光下的避障失效非常典型。自动曝光会“照顾”天空区域,把地面压得死黑,避障算法找不到地面特征。解决方式很简单:切手动模式,锁定曝光时间,只让增益在一定范围内自适应。如果场景里暗部和亮部都有内容,可以考虑开HDR模式,但要注意HDR在某些传感器上会降低帧率或产生运动伪影。没有开HDR条件的,宁可稍微欠曝,也别让高光彻底溢出一片死白。
5.3 标称60fps实际只有30fps,可能是接口带宽的锅
很多模组标称能输出60fps,但接到电脑或飞控后发现只有一半帧率。先看传输接口:MIPI CSI的带宽通常够用,而USB 2.0接口跑720p@60fps几乎是不可能的。USB 2.0的理论带宽只有480Mbps,实际有效载荷率大约280Mbps。720p@60fps的YUV422格式,一帧数据为1280×720×2字节≈1.84MB,每秒就是110MB,折合880Mbps,远远超出USB2.0的承载能力。要想达到高帧率,要么选USB 3.0接口,要么降低分辨率,比如切到VGA@60fps。
除此之外,主控端的图像处理管线也可能成为瓶颈。树莓派默认的libcamera栈在高帧率模式下的CPU占用比传统V4L2高不少。你可以在程序里直接设采集缓冲队列长度,减少帧丢失;也可以把不需要的自动功能全部关闭,把CPU让给算法推理。
5.4 高速飞行时画面抖动,快门和安装结构都背锅
画面抖动看似是飞控PID没调好,但避障相机自身也难辞其咎。首先是曝光时间太长导致的运动模糊,尤其在傍晚的光线下。解决办法是压低曝光时间到1ms以下并适当提高ISO增益,代价是图像噪声增加。其次是安装结构共振,GoPro这类运动相机的减震安装方式在避障相机上不见得适用,因为减震球会引入低频晃动,让左右画面间的视差时变。相机应当硬性安装在机身刚性结构上,避免任何弹性连接。如果你必须减震,至少保证左右两颗相机的减震完全一致、刚性相同,否则算法出来的深度图会周期性偏移。
5.5 相机供电不稳导致“花屏”和“黑帧”
视觉系统耗电不大但很敏感。无人机电池的电压在飞行中会有较大波动,尤其在大油门动作时。如果相机直接并联在电池输出端,容易因为纹波干扰导致I2C控制信号出错,出现奇怪的“花屏”或者偶发黑帧。我给不少朋友处理这类问题时,最终的解决方案都是加一个500mA以上的LDO稳压给相机独立供电,并在供电输入处并联大容量陶瓷电容和一个小容量的铝电解电容滤除高低频纹波。这个很简单但比升级相机本身更能解决稳定性问题。
5.6 距离感知误差大,老手也会踩的镜头坑
选避障相机时,很多朋友只关注传感器型号,却忽略了镜头本身的质量。同一款传感器搭配不同品质的镜头,边缘清晰度和畸变可以差出两三个等级。普通手机镜头模组在边缘分辨率下跌严重,直接影响视差图的边界匹配。至少选带IR-cut滤光片的玻璃镜片镜头,优先选低畸变(<3%)的广角镜头。镜头固定方式选M12螺纹锁紧的,可以调整后滴胶固定,而不要选卡扣式的,飞行振动久了镜头会轻微旋转,导致焦距和焦点漂移。
6. 从实际飞行中总结的避障相机选择心法
玩避障相机这几年,我最大的体会是:避障系统是一个“相机 + 主控算力 + 算法 + 标定 + 安装结构”的整体,任何一块短板都会让它变成一个摆设。很多人只盯着相机参数,忽略了整套链路的协同。比如你用了一颗很贵的高分辨率全局快门相机,但主控算力跑不动,帧率被压到15fps,那不单浪费钱,还拖累整机电力。反过来,一个普通VGA全局快门相机,配上好的标定和调优过的曝光参数,反而能在室内复杂环境里稳稳地绕过障碍。
另一个心得是,买模组前先查数据手册,确认传感器型号是真材实料,别被“智能避障相机”这类营销话术迷惑。很多所谓避障专用相机,其实就是普通USB摄像头披了一身金属壳。你把数据手册里的传感器型号放到网上搜一下,就知道它是卷帘还是全局快门、有没有同步输入输出、带不带ISP处理,这比看店铺宣传的1080p、夜视、高清这些形容词靠谱得多。
最后再分享一个工作流上的建议。如果你已经决定了要用双目视觉,先不要急着买高价模组,可以用两个便宜的全局快门摄像头加上OpenCV在桌面端跑通整个深度估计流程,验证你的算法和场景需求,再选择合适的工业级模组。流程跑通的好处是,你对自己需要的FOV、基线、分辨率和帧率都有了清晰认知,再花钱时就不会买错。笃定地讲,避障相机选型这件事,99%靠的是“先了解自己场景的需求,再谈参数”,剩下1%才是预算和品牌偏好。