机器人视觉综述
概述
视觉是机器人感知世界最重要的方式之一。相机作为机器人的"眼睛",为导航、操作、人机交互等任务提供丰富的环境信息。本节概述机器人视觉系统的基本组成、相机类型和设计考量。
视觉在机器人中的角色
核心应用
| 应用领域 | 任务 | 对相机的要求 |
|---|---|---|
| 导航 | SLAM、避障、路径规划 | 深度信息、宽FOV、高帧率 |
| 操作 | 目标检测、抓取位姿估计 | 高分辨率、深度精度 |
| 人机交互 | 人体检测、手势识别 | RGB高清、低延迟 |
| 巡检 | 缺陷检测、读表 | 高分辨率、颜色准确 |
| 自动驾驶 | 车道线检测、行人检测 | 宽动态范围、高帧率 |
视觉处理流水线
graph LR
A[光学系统<br>镜头+传感器] --> B[图像采集<br>ISP/解码]
B --> C[预处理<br>去畸变/增强]
C --> D[特征提取<br>传统/深度学习]
D --> E[高层理解<br>检测/分割/估计]
E --> F[决策/控制<br>规划/动作]
style A fill:#fff3e0
style B fill:#ffe0b2
style C fill:#ffcc80
style D fill:#ffb74d
style E fill:#ffa726
style F fill:#ff9800
相机类型总览
按获取信息分类
| 类型 | 输出 | 优势 | 劣势 | 代表产品 |
|---|---|---|---|---|
| RGB相机 | 2D彩色图像 | 低成本、高分辨率 | 无深度信息 | IMX219, C920 |
| 深度相机 | RGB + 深度图 | 直接获取3D | 室外受限、范围有限 | RealSense D435i |
| 双目相机 | 左右图像→深度 | 被动测距、室外可用 | 计算量大 | ZED 2i |
| 结构光 | 投射图案→深度 | 高精度 | 仅室内、范围短 | Kinect Azure |
| ToF相机 | 飞行时间→深度 | 速度快、不受纹理影响 | 分辨率低 | PMD Flexx2 |
| 事件相机 | 异步亮度变化 | 超高时间分辨率 | 生态不成熟 | DAVIS346 |
| 全景相机 | 360°图像 | 全方位覆盖 | 畸变大 | Ricoh Theta |
按接口分类
| 接口 | 带宽 | 延迟 | 线缆长度 | CPU占用 | 适用场景 |
|---|---|---|---|---|---|
| CSI-2 | 2.5 Gbps/lane (4 lanes) | 最低 | <30cm | 极低(ISP硬件处理) | 嵌入式系统 |
| USB 2.0 | 480 Mbps | 中 | <5m | 中 | 低分辨率相机 |
| USB 3.0 | 5 Gbps | 中 | <3m | 中 | 主流相机 |
| GigE Vision | 1 Gbps | 中 | <100m | 低 | 工业相机 |
| 10GigE | 10 Gbps | 低 | <100m | 低 | 高速工业相机 |
分辨率与帧率
分辨率选择
| 分辨率 | 像素数 | 数据量(RGB) | 典型帧率 | 适用场景 |
|---|---|---|---|---|
| VGA (640x480) | 0.3MP | 0.9MB/帧 | 60-120fps | 实时导航、避障 |
| 720p (1280x720) | 0.9MP | 2.7MB/帧 | 30-60fps | 一般视觉任务 |
| 1080p (1920x1080) | 2.1MP | 6.2MB/帧 | 30fps | 目标检测、识别 |
| 4K (3840x2160) | 8.3MP | 24.9MB/帧 | 15-30fps | 高精度检测 |
帧率需求
\[
\text{最低帧率} = \frac{v_{\text{max}}}{d_{\text{min}}} \times \frac{1}{\text{FOV}_{\text{pixel}}}
\]
其中:
- \(v_{\text{max}}\):机器人最大速度
- \(d_{\text{min}}\):最小需要检测的物体距离
- \(\text{FOV}_{\text{pixel}}\):单像素对应的视场角
帧率计算示例
移动机器人速度1m/s,需要在2m外检测障碍物,水平FOV 60°,分辨率640px:
\[\text{单像素FOV} = \frac{60°}{640} \approx 0.094°\]
\[\text{最低帧率} = \frac{1}{2} \times \frac{1}{0.094° \times \pi/180°} \approx 305 \text{ fps}\]
实际中由于检测算法容忍数个像素的运动模糊,30fps通常足够。
带宽计算
\[
\text{带宽} = \text{宽} \times \text{高} \times \text{通道数} \times \text{位深} \times \text{帧率}
\]
| 配置 | 原始带宽 | 压缩后(MJPEG) |
|---|---|---|
| 640x480 RGB @30fps | 27.6 MB/s | ~5 MB/s |
| 1080p RGB @30fps | 186 MB/s | ~30 MB/s |
| 1080p RGB @60fps | 373 MB/s | ~60 MB/s |
| 4K RGB @30fps | 746 MB/s | ~100 MB/s |
关键光学参数
焦距与视场角
焦距 \(f\) 和传感器尺寸决定视场角(FOV):
\[
\text{FOV} = 2 \arctan\left(\frac{d}{2f}\right)
\]
其中 \(d\) 是传感器在该方向的尺寸。
| 焦距 | FOV (1/2.3"传感器) | 特点 | 应用 |
|---|---|---|---|
| 2.1mm | ~120° | 超广角 | 全景、避障 |
| 3.6mm | ~80° | 广角 | 导航、SLAM |
| 6mm | ~50° | 标准 | 目标检测 |
| 12mm | ~25° | 窄角 | 远距离识别 |
| 25mm | ~12° | 长焦 | 巡检、读表 |
光圈与景深
光圈(F值)影响进光量和景深:
\[
\text{景深} \propto \frac{F \times d^2}{f^2}
\]
其中 \(F\) 是光圈F值,\(d\) 是对焦距离,\(f\) 是焦距。
- 小F值(大光圈):进光多,景深浅 → 适合暗环境
- 大F值(小光圈):进光少,景深深 → 适合需要全焦的场景
快门类型
| 类型 | 原理 | 优点 | 缺点 | 适用 |
|---|---|---|---|---|
| 滚动快门 | 逐行曝光 | 成本低、高分辨率 | 运动畸变(果冻效应) | 静态/慢速场景 |
| 全局快门 | 全像素同时曝光 | 无运动畸变 | 成本高、噪声稍高 | 高速运动、VIO |
滚动快门对SLAM的影响
视觉SLAM中,滚动快门会导致特征点位置偏移,影响位姿估计精度。高速移动的机器人应优先选择全局快门相机。
视觉处理流水线详解
硬件流水线
graph TB
subgraph 传感器端
A[CMOS传感器] --> B[模拟信号]
B --> C[ADC]
C --> D[原始数据<br>RAW Bayer]
end
subgraph ISP处理
D --> E[黑电平校正]
E --> F[坏点校正]
F --> G[去马赛克<br>Demosaic]
G --> H[白平衡]
H --> I[降噪<br>Denoise]
I --> J[色彩校正<br>CCM]
J --> K[Gamma校正]
K --> L[锐化]
end
subgraph 输出
L --> M[RGB/YUV]
M --> N[编码<br>MJPEG/H.264]
N --> O[传输<br>CSI/USB]
end
软件处理流水线
import cv2
import numpy as np
class VisionPipeline:
def __init__(self, camera_matrix, dist_coeffs):
self.K = camera_matrix
self.D = dist_coeffs
# 预计算去畸变映射表
self.map1, self.map2 = cv2.initUndistortRectifyMap(
self.K, self.D, None, self.K, (640, 480), cv2.CV_16SC2
)
def process(self, frame):
# 1. 去畸变
undistorted = cv2.remap(frame, self.map1, self.map2,
cv2.INTER_LINEAR)
# 2. 色彩空间转换
gray = cv2.cvtColor(undistorted, cv2.COLOR_BGR2GRAY)
# 3. 直方图均衡(应对光照变化)
enhanced = cv2.equalizeHist(gray)
# 4. 特征提取或送入神经网络
return enhanced
室内 vs 室外环境
| 挑战 | 室内 | 室外 |
|---|---|---|
| 光照 | 相对稳定 | 变化极大(阴影、直射光) |
| 动态范围 | ~60dB够用 | 需要>100dB(HDR) |
| 距离 | 1-10m | 1m-100m+ |
| 天气 | 不受影响 | 雨、雾、灰尘 |
| 深度相机 | 红外投射可用 | 红外被太阳光干扰 |
| 推荐传感器 | RGB-D(RealSense) | 双目/LiDAR |
典型机器人视觉系统配置
室内移动机器人
| 组件 | 型号 | 用途 |
|---|---|---|
| 前方深度相机 | RealSense D435i | 避障+SLAM |
| 机械臂手眼相机 | RealSense D405 | 抓取定位 |
| 后方鱼眼相机 | OV9281 | 后方感知 |
| 计算平台 | Jetson Orin Nano | 推理+ROS2 |
自动驾驶小车
| 组件 | 型号 | 用途 |
|---|---|---|
| 前方双目相机 | ZED 2i | 深度+视觉SLAM |
| 环视鱼眼相机 x4 | IMX219(广角) | 360°感知 |
| LiDAR | Livox Mid-360 | 3D建图 |
| 计算平台 | Jetson Orin NX | 多模型推理 |
选型决策流程
graph TD
A[视觉任务需求] --> B{需要深度信息?}
B -->|否| C{分辨率要求?}
B -->|是| D{使用环境?}
C -->|>4K| E[工业相机<br>GigE Vision]
C -->|1080p| F[USB相机<br>IMX477/C920]
C -->|720p以下| G[CSI相机<br>IMX219]
D -->|室内| H{深度范围?}
D -->|室外| I[双目相机<br>ZED 2i]
H -->|<1m| J[结构光<br>D405]
H -->|1-10m| K[主动双目<br>D435i/D455]
H -->|>10m| L[LiDAR+RGB]
小结
- 相机是机器人最重要的传感器之一,选型需匹配具体任务
- CSI接口延迟最低适合嵌入式,USB方便灵活,GigE适合长距离
- 分辨率和帧率需要在带宽约束下权衡
- 全局快门对高速运动和VIO至关重要
- 室内用RGB-D,室外用双目或LiDAR辅助
- 视觉流水线涉及从光学到软件的完整链路
参考资料
- Hartley, R., & Zisserman, A. Multiple View Geometry in Computer Vision
- Szeliski, R. Computer Vision: Algorithms and Applications
- Intel RealSense Documentation: https://dev.intelrealsense.com/
- OpenCV Documentation: https://docs.opencv.org/