上篇讲了图像预处理的各种技术——去噪、增强、直方图均衡化、形态学操作。这些都是处理2D图像的。但机器人要理解三维世界,还需要深度信息。今天就来聊聊获取深度信息的几种主流方案。
面试时候被问"你用过哪些深度相机",很多人只能说出一两个品牌。但面试官真正想听的是:你理解这几种深度获取方案的原理差异吗?知道它们各自适合什么场景吗?能根据需求做出合理的选型吗?
结构光(Structured Light)
结构光相机的原理很直觉:向场景投射已知的图案(通常是红外散斑或者条纹图案),然后用相机观察这个图案在场景中的变形。通过比较投射图案和接收图案的差异,就能计算出深度。
具体来说,投射器发出的图案是已知的。当图案投射到平坦表面上时,相机看到的图案是规则的。但如果场景中有凹凸,图案就会发生形变。通过分析形变,就能算出每个点的深度。
代表产品:Intel RealSense D400系列、微软Kinect v1。
优点:近距离精度高(可以达到亚毫米级别),分辨率高,适合室内近距离应用。
缺点:有效距离有限(通常0.2-3米),室外容易受阳光干扰(阳光中也包含红外成分),多个设备同时使用会互相干扰。
适用场景:室内服务机器人、机械臂抓取、3D扫描、人脸识别(比如iPhone的Face ID就是结构光)。
飞行时间(ToF, Time of Flight)
ToF相机的原理很直接:发射红外光脉冲,测量光脉冲从发射到返回的时间,根据光速计算距离。
距离 = (光速 × 时间) / 2
除以2是因为光走了一个来回。
ToF有两种实现方式:直接ToF(dToF)和间接ToF(iToF)。dToF直接测量光的飞行时间,需要高精度的时间测量电路。iToF测量的是发射光和反射光之间的相位差,间接推算飞行时间,实现起来更容易但精度稍低。
代表产品:Intel RealSense L500系列、微软Kinect v2、索尼IMX556PLR传感器。
优点:测距范围广(可达10米以上),帧率高,受环境光影响相对较小,多设备干扰问题比结构光轻。
缺点:近距离精度不如结构光,分辨率通常较低,多径效应(光线经过多次反射后返回)会导致深度误差,对高反射率物体(如镜子)测量不准确。
适用场景:手机摄影(对焦辅助)、自动驾驶辅助、物流体积测量、室内导航。
双目视觉(Stereo Vision)
双目视觉的原理模仿人类视觉:两个相机从不同位置观察同一场景,通过匹配左右图像中的对应点,利用视差计算深度。
深度 = (基线距离 × 焦距) / 视差
基线距离是两个相机之间的距离,焦距是相机内参,视差是同一个点在左右图像中的水平位置差。
双目视觉有两种变体:被动双目(只用环境光,像人眼一样)和主动双目(额外投射红外图案辅助匹配)。主动双目在弱纹理场景(白墙、暗光环境)表现更好。
代表产品:Intel RealSense D400系列(主动双目模式)、ZED系列(Stereolabs)、MYNT EYE。
优点:室外性能好(不受阳光干扰,因为用的是环境光),理论上测距范围无限(只要有足够的纹理和基线),成本相对较低。
缺点:计算量大(需要在左右图像中找对应点),弱纹理区域效果差(白墙、纯色表面),基线距离决定了最近可测距离(基线越大,最近距离越远),需要精确的标定。
适用场景:自动驾驶、无人机避障、室外机器人、大场景3D重建。
深度相机的ROS2集成
在机器人项目中,深度相机通常通过ROS2驱动接入系统。以Intel RealSense为例,ROS2的realsense-ros包提供了完整的接口:
<!-- launch文件示例 --> <launch> <node pkg="realsense2_camera" exec="realsense2_camera_node"> <param name="enable_depth" value="true"/> <param name="enable_color" value="true"/> <param name="depth_width" value="640"/> <param name="depth_height" value="480"/> <param name="depth_fps" value="30"/> <param name="align_depth.enable" value="true"/> </node> </launch>启动后,深度相机会发布几个关键的topic:/camera/depth/image_rect_raw(原始深度图,16位单通道),/camera/color/image_raw(彩色图像),/camera/aligned_depth_to_color/image_raw(对齐后的深度图)。
对齐(alignment)是一个重要的概念。深度相机通常有两个传感器:一个红外传感器获取深度,一个RGB传感器获取彩色图像。这两个传感器的分辨率、视场角、光心位置都不一样,所以深度图和彩色图像之间不是一一对应的。对齐就是把深度图变换到彩色图像的坐标系下,让每个像素的深度值和对应的RGB值对齐。
对齐后的数据可以直接用来生成带颜色的点云,在Rviz2中可视化效果很好。但如果你的算法需要精确的深度值,建议用原始深度图而不是对齐后的——对齐过程中的插值会引入深度误差。
对于双目方案(比如ZED相机),ROS2驱动的使用方式类似。ZED提供了zed-ros2-wrapper,发布深度图、点云、IMU数据等多种topic。双目的深度图通常比结构光和ToF的噪声更大,但胜在室外效果好。
三种方案的对比
从几个关键维度来对比这三种方案:
精度方面:近距离(<3米)结构光最优,中距离(3-10米)ToF和双目差不多,远距离(>10米)双目更有优势(加大基线即可)。
功耗方面:结构光和ToF都需要主动发射红外光,功耗较高。被动双目只需要两个相机,功耗最低。
成本方面:被动双目最低(两个普通相机),结构光中等(需要投射器),ToF最高(需要精密的时间测量电路)。
计算复杂度方面:结构光和ToF的深度计算相对简单(硬件直接输出深度图),双目需要大量的立体匹配计算。
鲁棒性方面:双目在室外最鲁棒(不依赖主动光源),ToF次之,结构光最差(容易受阳光干扰)。
面试中怎么聊
面试官问深度相机,不要只说"我用过RealSense"。要能讲清楚:你用的是哪种原理(结构光/ToF/双目),为什么选这种方案,它的优缺点是什么,你在项目中遇到了什么问题、怎么解决的。
如果面试官追问"双目和ToF怎么选",你可以从应用场景、距离范围、精度要求、计算资源、成本预算几个维度来分析。这种结构化的回答比单纯说"双目更好"或"ToF更好"要有说服力得多。
最后,面试官如果问"你在项目中怎么验证深度数据的质量",你可以说:用已知距离的参考物(比如标定板放在固定距离)做精度验证,同时检查深度图的空洞率和噪声水平。定期做这种验证,确保深度数据在系统运行过程中保持可靠。
分享一个我在实际项目中选型深度相机的经历。当时给一台室内服务机器人选深度相机,候选有RealSense D435i(结构光+IMU)、Intel L515(激光ToF)和OAK-D(双目+AI加速)。我们在实际场景里做了对比测试:D435i在0.3-3米范围内效果最好,空洞率最低,但超过3米噪声明显增大。L515在暗光环境下表现好,但对高反光表面(比如不锈钢桌面)效果很差,深度图上会出现大面积黑洞。OAK-D的AI加速对目标检测有帮助,但深度精度不如D435i。最终我们选了D435i,因为我们的场景主要是室内3米范围内的物体识别和避障。选型的时候不能只看参数表,一定要在你的实际场景里做对比测试,不同场景下三种方案的表现差异很大。
下一篇讲RGB-D数据处理——深度图空洞填充、对齐和坐标转换。拿到深度数据之后怎么处理,是实际项目中最常遇到的问题。
如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。
「机器人软件开发面试·从入门到精通」连载系列上一篇:第153篇 图像预处理技术——去噪、增强、直方图均衡化 下一篇预告:第155篇 RGB-D数据处理——深度图空洞填充、对齐和坐标转换
有任何问题欢迎评论区留言,我会尽量回复。