3. 传感器基础(下):深度相机(RGB-D)原理、点云生成、相机标定基础
各位同学,咱们接着聊传感器。上一节我们把激光雷达和IMU讲透了,这一节轮到深度相机了。说实话,在机器人自主避障这个领域,RGB-D相机是我个人用得最多的传感器之一。为什么?因为它便宜、信息量大,一个摄像头就能同时拿到颜色和深度,这在很多场景下简直是降维打击。
3.1 深度相机的工作原理
深度相机,说白了就是能告诉你「每个像素离我有多远」的相机。常见的原理有三种,我分别讲一下。
3.1.1 结构光法
这个原理最早是微软Kinect v1带火的。它往场景里投射一个已知的红外光斑图案,然后用红外相机拍下被物体表面扭曲后的图案。通过计算每个光斑的偏移量,就能反推出深度。
优点:室内效果好,精度高,成本低。
缺点:怕强光,室外基本废掉。我在做室外巡检机器人时踩过这个坑——大太阳底下,结构光直接「瞎了」。
3.1.2 飞行时间法(ToF)
ToF的原理更直接:发射一束红外光,测量它往返的时间。光速是已知的,时间乘以光速除以2就是距离。Kinect v2和现在的iPhone上的LiDAR用的就是ToF。
优点:响应快,适合动态场景,室外也能用。
缺点:分辨率通常不如结构光,多路径干扰时容易出错。
3.1.3 双目立体视觉
这个最像人眼。两个相机同时拍一张图,通过匹配左右图像中的相同特征点,利用三角测量原理算出深度。Intel RealSense D435就是典型代表。
优点:室内外都可用,硬件简单。
缺点:计算量大,对纹理要求高——白墙面前直接「失明」。
核心对比:三种方案没有绝对好坏。我个人习惯是:室内静态场景用结构光,动态场景用ToF,室外或大范围用双目。你想想看,选型选对了,后面避障算法能省一半力气。
3.2 点云生成:从深度图到三维空间
拿到深度图之后,怎么变成我们熟悉的点云?这里涉及一个简单的几何投影关系。
每个像素点 (u, v) 对应一个深度值 d。相机内参矩阵 K 告诉我们焦距 fx、fy 和光心 cx、cy。那么三维坐标 (X, Y, Z) 的计算公式是:
Z = d / scale // 深度值通常以毫米或16位整数存储,需要缩放
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
嗯,这里要注意:不同相机的深度缩放因子不一样。RealSense一般是1000,Kinect可能是1。我曾经在项目里忘了除以scale,结果点云直接飞到几百米外,排查了半天才发现是单位问题。
生成点云后,我们通常还会做一步滤波。常用的有:
- 直通滤波:只保留一定距离范围内的点,比如0.3m到10m
- 体素滤波:降采样,减少点云数量,提高处理速度
- 统计滤波:去除离群点,那些飘在空中的噪点
实战技巧:在ROS里,用 pcl_ros 包可以非常方便地完成这些滤波。我建议你在 launch 文件里就把这些节点串起来,别等到跑算法时才发现点云太密导致CPU爆满。
3.3 相机标定基础
相机标定,说白了就是找到「真实世界中的点」和「图像上的像素」之间的映射关系。这个映射由两部分组成:内参和外参。
3.3.1 内参标定
内参描述的是相机本身的特性:焦距、光心、畸变系数。常用的标定方法是张正友标定法——你拿一个棋盘格,从不同角度拍十几张照片,然后让算法自动解算。
在ROS里,用 camera_calibration 包可以实时标定。我记得第一次用的时候,对着棋盘格摆了各种姿势,结果程序一直说「calibration failed」。后来发现是棋盘格尺寸没填对——你想想看,尺寸差1毫米,算出来的焦距能差多少?
3.3.2 外参标定
外参描述的是相机在机器人坐标系中的位置和朝向。对于RGB-D相机,我们还需要标定彩色相机和深度相机之间的变换关系——这叫「手眼标定」或「多传感器标定」。
常用的工具有:
- Kalibr:支持多相机、IMU联合标定,功能强大但配置复杂
- easy_handeye:专门做手眼标定的ROS包,上手快
- lidar_camera_calibration:激光雷达和相机的联合标定
避坑指南:我曾经在标定外参时,把棋盘格贴在墙上,然后移动机器人去拍。结果因为地面不平,机器人每次移动都有微小震动,标定结果一直收敛不了。后来改用固定机器人、移动棋盘格的方式,一次就成功了。记住:标定过程中,被标定的传感器尽量保持静止。
3.4 知识体系总览
下面这张图是我自己整理的深度相机知识体系,你可以把它当作本章的「地图」:
3.5 实战中的常见问题
最后,我总结几个实际项目中容易踩的坑:
- 深度图有空洞:透明物体、反光表面、黑色吸光材料都会导致深度丢失。解决办法是多传感器融合,别只依赖RGB-D。
- 点云漂移:尤其是ToF相机,温度变化会导致测量偏移。我建议开机后先预热5分钟再使用。
- 标定精度不够:棋盘格一定要打印平整,贴在硬纸板上,别用软纸。我见过有人用A4纸直接贴墙上,结果标定误差大得离谱。
- 时间同步问题:彩色图和深度图的时间戳如果不一致,生成的RGB-D点云会出现「颜色错位」。在ROS里用
message_filters做时间同步是标准做法。
一句话总结:深度相机是避障系统的「眼睛」,但眼睛也会骗人。理解原理、做好标定、合理滤波,才能让这双眼睛真正看清世界。
公众号:蓝海资料掘金营,微信deep3321