相机选型与硬件搭建:双目视觉的“眼睛”和“大脑”
做无人机定高,说白了就是让飞机知道自己离地面有多远。单目视觉靠不住,因为一张图看不出深度。双目视觉就不一样了,它像人的两只眼睛,通过视差算出距离。嗯,这里有个前提——你得选对“眼睛”和“大脑”。
我刚开始做这个项目时,踩过不少坑。有一次选了个高分辨率相机,结果 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 才搞定。
知识体系总览
下面这张图,是我自己总结的双目视觉硬件搭建逻辑。从相机选型到平台配置,每一步都环环相扣。
这张图把三个核心模块串起来了。相机选型决定了图像质量,镜头和基线决定了深度精度,嵌入式平台决定了你能不能实时跑起来。三者缺一不可。
好了,这一章就到这里。记住一句话:硬件选型不是一步到位的,多试几次,找到最适合你应用场景的组合。