相机选型与硬件搭建:双目视觉的“眼睛”和“大脑”

做无人机定高,说白了就是让飞机知道自己离地面有多远。单目视觉靠不住,因为一张图看不出深度。双目视觉就不一样了,它像人的两只眼睛,通过视差算出距离。嗯,这里有个前提——你得选对“眼睛”和“大脑”。

我刚开始做这个项目时,踩过不少坑。有一次选了个高分辨率相机,结果 Jetson Nano 跑不动,帧率掉到 5fps,飞机差点撞树。所以这一章,咱们聊聊怎么选相机、怎么配镜头和基线,以及怎么搭嵌入式平台。

双目相机选型要点

选双目相机,不是越贵越好。你得看三个核心指标:分辨率、帧率、感光芯片尺寸。

  • 分辨率:我建议 640×480 或 1280×720。太高了,比如 1920×1080,处理起来太慢。太低了,比如 320×240,视差计算精度不够。我个人习惯用 640×480,够用且省算力。
  • 帧率:30fps 是底线。低于这个数,无人机运动快了会丢帧。我在项目中试过 15fps 的相机,结果飞机一倾斜,深度图就断层了。
  • 感光芯片:CMOS 是主流。注意看像素尺寸,3μm 以上的比较好。太小了,弱光下噪点多,定高会飘。

重要提醒:双目相机必须硬件同步。两个镜头要同时曝光,否则运动中的物体会产生伪视差。我见过有人用两个独立 USB 相机拼凑,结果一飞就炸——因为左右图时间戳对不上。

市面上常见的双目模组有 Intel RealSense D435、Mynt Eye、ZED Mini。RealSense 的深度算法是硬件的,省 CPU,但室外强光下容易失效。Mynt Eye 我用的比较多,它支持硬件触发,适合无人机。

镜头焦距与基线选择

焦距和基线决定了你能测多远、测多准。说白了,这是一对“矛盾体”。

参数 影响 我的建议
焦距(f) 焦距越长,视场角越小,看得越远,但近处盲区大 2.8mm~4mm 适合室内,6mm~8mm 适合室外
基线(B) 基线越长,深度精度越高,但相机体积变大 6cm~12cm 是黄金区间

为什么会这样?你想想看,深度计算公式是 Z = f * B / d。d 是视差,单位是像素。如果基线太短,视差变化小,远处物体的深度就测不准。如果基线太长,左右图重叠区域变小,近处物体可能只出现在一个镜头里。

我在项目中遇到过一个问题:选了 8mm 焦距、基线 15cm 的配置。结果飞机在 2 米高度时,地面纹理只能被一个相机看到,另一个相机拍的是天空。嗯,这就是基线太长的后果。后来我换成 6mm 焦距、基线 8cm,问题解决了。

小技巧:如果你不确定怎么选,可以用这个公式估算:最大可测距离 ≈ f * B / 1(像素)。比如 f=4mm,B=8cm,最大可测距离约 32 米。对于无人机定高,10~20 米就够用了。

嵌入式平台配置:Jetson Nano 实战

嵌入式平台是双目视觉的“大脑”。我推荐 Jetson Nano,性价比高,生态好。但配置起来有几个坑,我一个个说。

硬件连接

  • 双目相机用 USB 3.0 接口。Nano 有两个 USB 3.0,一个接相机,一个接遥控器数传。
  • 供电要稳。Nano 的 5V 输入至少 4A。我试过用充电宝供电,结果电压一掉,相机就掉帧。
  • 散热必须加。Nano 跑双目算法时,CPU 和 GPU 都满载,不加散热片会降频。

软件环境

我习惯用 JetPack 4.6 版本,自带 CUDA 和 OpenCV。装好系统后,第一件事是安装相机驱动。

# 安装 RealSense 驱动(以 D435 为例)
sudo apt-get update
sudo apt-get install librealsense2-dev
sudo apt-get install librealsense2-utils

# 验证相机是否识别
realsense-viewer

如果用的是 Mynt Eye,驱动稍微麻烦点。需要从 GitHub 拉源码编译。我踩过这个坑——记得先装好依赖库,不然编译会报错。

# Mynt Eye 驱动安装
git clone https://github.com/slightech/MYNT-EYE-S-SDK.git
cd MYNT-EYE-S-SDK
make init
make install

注意:Jetson Nano 的 ARM 架构和 x86 不同。有些库没有预编译包,需要自己编译。比如 OpenCV 的 contrib 模块,我编译了整整两个小时。建议直接用 JetPack 自带的 OpenCV,省时间。

性能调优

双目视觉在 Nano 上跑,CPU 占用率很高。我一般这样优化:

  • 降低图像分辨率到 640×480,帧率 30fps。
  • 用 CUDA 加速视差计算。OpenCV 的 cv::cuda::StereoBM 比 CPU 版本快 5 倍。
  • 关闭不必要的窗口显示。显示图像会占用 GPU 资源。
// CUDA 加速视差计算示例
cv::cuda::GpuMat left_gpu, right_gpu, disparity_gpu;
left_gpu.upload(left_img);
right_gpu.upload(right_img);

cv::Ptr<cv::cuda::StereoBM> stereo = cv::cuda::createStereoBM(64, 21);
stereo->compute(left_gpu, right_gpu, disparity_gpu);

cv::Mat disparity;
disparity_gpu.download(disparity);

嗯,这里要注意:CUDA 版本和 OpenCV 版本要匹配。我试过 OpenCV 4.5 配 CUDA 10.2,结果编译报错。后来换成 OpenCV 4.1.1 才搞定。

知识体系总览

下面这张图,是我自己总结的双目视觉硬件搭建逻辑。从相机选型到平台配置,每一步都环环相扣。

双目视觉硬件搭建知识体系 相机选型 镜头与基线 嵌入式平台 分辨率 · 帧率 · 感光芯片 硬件同步 · 室外适用性 焦距 2.8~8mm 基线 6~12cm Jetson Nano · 供电 · 散热 驱动安装 · CUDA加速 三者匹配才是关键 选型 → 配置 → 调优 → 飞起来

这张图把三个核心模块串起来了。相机选型决定了图像质量,镜头和基线决定了深度精度,嵌入式平台决定了你能不能实时跑起来。三者缺一不可。

好了,这一章就到这里。记住一句话:硬件选型不是一步到位的,多试几次,找到最适合你应用场景的组合。

专注资料整理