news 2026/10/17 19:18:59

双目立体视觉(2)- ZED2相机在自动驾驶中的应用实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双目立体视觉(2)- ZED2相机在自动驾驶中的应用实践

1. 从实验室到马路:为什么自动驾驶需要一双“好眼睛”

聊到自动驾驶,大家脑子里蹦出来的第一个词可能就是“激光雷达”,那玩意儿贵啊,动不动就大几万甚至几十万,感觉是高端玩家的专属。但说实话,我在这个行业里摸爬滚打这么多年,发现很多实际落地项目,特别是那些对成本敏感、追求量产化的方案,都在悄悄用另一种“眼睛”——那就是双目立体视觉。而ZED2,可以说是这个领域里一个相当能打的“优等生”。

你可以把自动驾驶的感知系统想象成我们人开车。我们开车靠什么?主要就是一双眼睛。眼睛能告诉我们前面有没有车、距离多远、旁边的行人是不是要过马路。激光雷达呢,就像一个特别精确的尺子,能非常精准地测量出每个点的距离,但它“看”到的世界是密密麻麻的点,缺乏颜色和纹理信息,而且雨雪天气下性能会打折扣。而双目相机,模仿的就是我们人类的双眼。它通过两个并排的摄像头,像我们的左右眼一样,从略有差异的角度观察同一个场景,然后通过复杂的算法计算出每个像素点的深度信息,最终生成一个带有距离信息的“三维地图”。

这有什么好处呢?第一,信息丰富。它得到的是RGB-D信息,既有颜色(RGB),又有深度(D)。这意味着系统不仅能知道“那里有个东西”,还能知道“那是个红色的、正在移动的、大概20米远的行人”。这对于后续的识别、分类、行为预测至关重要。第二,成本优势。相比动辄数万的激光雷达,一套高性能的双目相机模组成本要低得多,这为大规模量产装车扫清了一个巨大的障碍。第三,环境适应性。纯视觉方案不依赖主动发射的激光,在强光、雨雾等复杂天气下,虽然也有挑战,但其数据特性与激光雷达不同,通过算法融合可以起到很好的互补作用。

所以,当项目预算有限,但又需要稳定可靠的深度感知能力时,ZED2这类成熟的立体视觉相机就成了一个非常务实的选择。它不是一个“平替”,而是在特定场景和需求下,一个极具竞争力的“正选”方案。接下来,我就结合自己的一些项目经验,掰开揉碎了讲讲ZED2在自动驾驶的几个核心环节里是怎么干活儿的。

2. 环境感知:构建车辆周围的“三维实景地图”

环境感知是自动驾驶的基石,车得先知道自己周围有什么,才能谈下一步该怎么做。ZED2在这里扮演的角色,就是一个高效的“三维场景重建师”。

2.1 稠密点云与深度图生成

ZED2 SDK最核心的能力之一,就是能实时输出高质量的深度图和点云。这可不是简单的两个图像做做减法。它内部集成了完整的立体匹配算法和深度计算引擎。当你调用grab()和retrieveMeasure()函数时,它已经在底层完成了从图像矫正、特征匹配、视差计算到深度转换的全部流程。

import pyzed.sl as sl # 初始化相机 zed = sl.Camera() init_params = sl.InitParameters() init_params.camera_resolution = sl.RESOLUTION.HD720 # 使用720p分辨率保证帧率 init_params.depth_mode = sl.DEPTH_MODE.ULTRA # 启用ULTRA深度模式,质量最高 init_params.coordinate_units = sl.UNIT.METER # 使用米作为单位 # 打开相机 err = zed.open(init_params) if err != sl.ERROR_CODE.SUCCESS: print("相机打开失败") exit(1) # 准备存储深度图和点云的数据结构 runtime_parameters = sl.RuntimeParameters() mat_depth = sl.Mat() # 深度图 point_cloud = sl.Mat() # 点云 while True: if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS: # 获取深度图,深度值以浮点数形式存储(单位:米) zed.retrieve_measure(mat_depth, sl.MEASURE.DEPTH) # 获取RGB点云,每个点包含XYZ坐标和RGB颜色 zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA) # 此时,mat_depth和point_cloud中就包含了当前帧的完整3D信息 # 可以用于后续的障碍物检测、可行驶区域分割等

这里有个关键参数depth_mode,我实测下来发现对效果影响很大。PERFORMANCE模式速度最快,但深度图比较稀疏,边缘毛糙;QUALITY模式是平衡之选;而ULTRA模式会启用完整的后处理优化链,包括空洞填充、边缘平滑,得到的深度图非常稠密和平滑,特别适合做精细的环境建模,当然对计算资源的要求也更高。在车载工控机上,我一般会根据实际场景在QUALITY和ULTRA之间做权衡。

生成的稠密点云是什么概念?它相当于给你的车瞬间拍了一张周围环境的“3D彩照”。路面、路沿、树木、建筑物、其他车辆,都以带有精确坐标和颜色的点的形式呈现出来。这个数据,是后续所有高级感知功能的基础原料。

2.2 可行驶区域与道路结构理解

有了三维点云,下一步就是理解“哪里能走”。这对于自动驾驶的路径规划是前置条件。传统方法可能依赖于高精地图的预先标注,但ZED2提供的实时三维信息让我们能进行在线感知。

一种常见且有效的方法是地面分割。由于路面在三维空间中通常处于一个连续的、较为平坦的平面上,我们可以利用点云的法线信息或采用RANSAC等平面拟合算法,快速将地面点与非地面点(障碍物)分离开来。ZED2的点云数据坐标准确,做这个分割非常顺手。分割出的地面点云,就构成了当前的可行驶区域。

更进一步,我们可以识别道路边界,比如路沿、车道线(虽然ZED2是单目识别车道线,但结合深度信息可以判断车道线的起伏和真实位置)、护栏等。通过分析点云在高度和横向分布上的突变,可以检测出这些结构。例如,路沿通常会表现为高度上的一个台阶,在点云中会形成一条明显的“线”。将这些信息提取出来,就能实时构建出一个结构化的道路模型,知道路的宽度、边界在哪里,为车辆“划”出了安全的通行走廊。

3. 障碍物检测与跟踪:精准识别动态威胁

环境里静止的东西好办,难的是那些会动的——车辆、行人、自行车。这就是障碍物检测与跟踪的战场,也是ZED2发挥其融合感知优势的地方。

3.1 基于3D边界框的物体检测

很多初学者的一个误区是,直接用YOLO这类2D检测器去处理ZED2的左眼图像,得到2D框,然后再映射到点云上求3D位置。这个方法不是不行,但问题很多:2D框的投影映射容易出错,特别是对于部分遮挡的物体;而且深度信息只用来做后期融合,没有在检测阶段发挥作用,浪费了数据优势。

更鲁棒的做法是直接在3D点云上进行物体检测与定位。ZED2 SDK其实提供了一个内置的物体检测模块(需要CUDA支持),它能够直接输出检测到的物体(如人、车)的3D边界框。这个框是带朝向的,不仅告诉你物体在哪里(中心点3D坐标),还告诉你它有多大(长宽高)以及朝向角。

# 启用物体检测模块 obj_param = sl.ObjectDetectionParameters() obj_param.enable_tracking = True # 启用跟踪,为每个物体分配唯一ID obj_param.enable_segmentation = False # 根据需求是否启用像素级分割 obj_param.detection_model = sl.DETECTION_MODEL.MULTI_CLASS_BOX # 多类别3D框检测 zed.enable_object_detection(obj_param) objects = sl.Objects() # 用于存储检测结果 obj_runtime_param = sl.ObjectDetectionRuntimeParameters() while True: if zed.grab() == sl.ERROR_CODE.SUCCESS: # 进行物体检测 zed.retrieve_objects(objects, obj_runtime_param) for obj in objects.object_list: print(f"物体标签: {obj.label}") print(f"跟踪ID: {obj.id}") print(f"3D位置: {obj.position}") # 中心点 (x, y, z) print(f"3D尺寸: {obj.dimensions}") # 长宽高 print(f"速度: {obj.velocity}") # 3D速度向量(需要跟踪) print(f"追踪状态: {obj.tracking_state}")

这个3D框的稳定性远超2D框投影。因为它是算法综合了物体的外观特征(来自图像)和空间分布特征(来自点云)后得出的,对于遮挡、光照变化更鲁棒。拿到这个3D框,我们立刻就知道前方车辆距离我们多少米、它的宽度是否超过了车道、它是否正在切入我们的车道(通过朝向角判断)。

3.2 多目标跟踪与轨迹预测

仅仅检测出来是不够的,我们需要持续地跟踪它们,预测它们的运动轨迹。这就是上面代码中enable_tracking = True的作用。ZED2的SDK会为每个检测到的物体分配一个唯一的id,并在后续帧中维持这个id,即使物体被短暂遮挡。

通过连续帧间id的关联,我们可以计算出每个物体的速度(velocity字段)和运动轨迹。这对于判断他车意图至关重要。比如,旁边车道的车辆如果其速度向量开始指向我方车道,同时位置也在接近车道线,那么它切入的可能性就很高。基于这些稳定的3D轨迹,我们可以使用简单的卡尔曼滤波或者更复杂的运动模型,来预测物体未来几秒的位置,为自车的决策规划提供前瞻时间。

我踩过的一个坑是,在复杂路口,行人、自行车、车辆混杂,id偶尔会发生跳变或混淆。这时候,单纯依赖SDK的内部跟踪可能不够。我们的做法是,将ZED2输出的3D检测框和跟踪id作为输入,再接入一个自研的多目标跟踪算法(比如基于匈牙利算法和外观重识别的),进行二次融合与平滑,这样得到的轨迹就非常稳定可靠了。

4. 定位与路径规划:让车知道“我在哪”和“怎么走”

感知的最终目的是为了决策和行动。ZED2提供的丰富三维信息,在定位和路径规划这两个高阶环节也能提供独特的价值。

4.1 视觉里程计与局部定位

在GPS信号弱或者没有高精地图的区域,车辆需要知道自己相对于周围环境的精确运动。ZED2 SDK内置了强大的视觉里程计模块。它通过分析连续帧之间特征点的变化,可以实时估算出相机自身在三维空间中的运动(平移和旋转),精度非常高。

# 获取相机位姿(视觉里程计结果) py_transform = sl.Transform() tracking_state = zed.get_position(py_transform, sl.REFERENCE_FRAME.WORLD) if tracking_state == sl.POSITIONAL_TRACKING_STATE.OK: # py_transform 包含了相机的旋转和平移矩阵 # 可以从中提取出车辆的位移和偏航角等信息 translation = py_transform.get_translation() rotation = py_transform.get_rotation_matrix() print(f"位移: {translation}")

这个自定位信息有什么用呢?第一,它可以与轮速计、IMU进行融合,提供更稳定、更准确的车辆局部位置估计,尤其是在车辆起步、刹车、打滑时,视觉信息可以纠正惯性传感器的漂移。第二,在构建局部地图时,它是将不同时刻点云对齐到同一个坐标系的关键。我们把每一帧的点云,用视觉里程计计算出的位姿进行变换拼接,就能得到一个不断增长的、车辆周围的局部三维地图,这个地图可以用来做更长期的路径规划,或者识别之前来过的地点(闭环检测)。

4.2 三维空间下的路径规划

传统的路径规划大多在二维平面上进行,但现实世界是三维的。一个缓坡、一个凸起的井盖、一个低矮的限高杆,这些信息在二维地图里是缺失的。ZED2提供的三维点云,使得进行真正的三维路径规划成为可能。

规划器不再只考虑“哪里没有障碍物”,还要考虑“地面的通过性”和“上方的净空”。我们可以从点云中提取出地面高度图,分析地面的坡度、起伏程度,判断是否是越野路面或者有坑洼。同时,可以生成一个“顶高”地图,检查规划路径上方是否有树枝、招牌、桥梁等低矮障碍物。

具体实现时,我们通常会把三维点云数据降维到一个2.5D的代价地图中。这个地图的每个栅格不仅记录“是否被占据”,还可能包含多个层级的代价信息,比如:地面高度代价(鼓励走平坦区域)、障碍物代价(禁止碰撞)、净空代价(避免剐蹭)。路径搜索算法(如A*、Dijkstra)在这个多维代价地图上运行,找出的就是一条综合考虑了安全性、平顺性和通过性的最优或次优路径。

5. 实战配置与性能调优经验谈

纸上得来终觉浅,最后分享一些实实在在的部署和调参经验,这些都是我在项目里真金白银踩出来的。

5.1 硬件部署与同步

在车上装ZED2,位置很有讲究。最好安装在挡风玻璃后,车内后视镜附近,这个位置视野开阔,且受雨刷清洁区域覆盖。要确保两个镜头都在同一水平线上,不能有俯仰或滚转,否则会严重影响立体匹配的精度。官方有卖校准板,但我通常直接用远处平整的墙面或者棋盘格做软件校准,也够用。

如果车上还有其他传感器,比如激光雷达、毫米波雷达,时间同步是头等大事。ZED2支持硬件触发输入,可以用一个统一的PPS(每秒脉冲)信号给所有传感器打上统一的时间戳。如果做不到硬件同步,那至少要在软件层记录每个数据帧的本地高精度时间戳,后期做离线对齐。不同步的数据,融合起来就是灾难,会产生“幽灵障碍物”。

5.2 关键参数调优指南

ZED SDK的参数很多,这里说几个对自动驾驶场景影响最大的:

参数选项适用场景与影响
depth_modePERFORMANCE对算力要求极低,适合低功耗平台或远距离探测(深度图较稀疏)。
QUALITY(默认)精度和速度的平衡点,大多数场景的推荐选择。
ULTRA最高精度,启用所有后处理,深度图稠密平滑,适合近距离精细感知,算力需求高。
camera_resolutionHD2K(2208x1242)最高分辨率,提供最丰富的细节和更远的探测距离,但帧率最低(15fps),数据量大。
HD1080(1920x1080)全高清,平衡了细节和帧率(30fps),是车载场景的甜点选择。
HD720(1280x720)高清,能获得最高的帧率(60fps+),适合高速场景,但探测距离和细节有所下降。
depth_stabilizationTrue/False建议开启。它会平滑深度图,减少帧间抖动,对于跟踪和规划稳定性帮助很大。
coordinate_systemIMAGE,RIGHT_HANDED_Y_UP等设置点云坐标系。车载通常使用RIGHT_HANDED_Y_UP,其中Z轴向前,Y轴向上,符合常规习惯。

我的经验是,在城市结构化道路,车速不快但场景复杂,我用HD1080+QUALITY模式,保证足够的细节和30fps的实时性。在高速场景,障碍物相对稀疏但车速快,我会切换到HD720+PERFORMANCE或QUALITY,优先保障高帧率,确保能快速响应。

5.3 与其他传感器的融合思路

ZED2虽强,但也不是万能的。浓雾、暴雨、夜间极端弱光,纯视觉都会面临挑战。因此,在实际的自动驾驶系统中,它一定是融合感知体系中的一员。

  • 与毫米波雷达融合:毫米波雷达测速极准,且不受天气影响。当视觉因天气原因对某个障碍物深度估计不准时,雷达提供的精确距离和速度信息可以作为强补充。融合时,可以用雷达目标作为提示,引导视觉在对应区域进行更精细的深度计算和物体识别。
  • 与激光雷达融合:这属于“强强联合”。激光雷达提供极其精确但稀疏的深度点,ZED2提供稠密但相对没那么精确的深度和完整的纹理颜色。两者融合可以生成一张既精确又稠密、还有色彩的三维地图。通常做法是将激光点云投影到图像上,作为深度真值来在线优化视觉深度估计算法的参数,或者直接进行点云级别的融合。
  • 与IMU/GNSS融合:如前所述,视觉里程计与IMU互补,能提供稳定可靠的局部定位。再结合GNSS的全局位置,就能实现稳定且全局一致的定位,这是高阶自动驾驶功能的基础。

说到底,ZED2是一个功能强大、性价比高的三维视觉感知工具包。它把复杂的立体视觉算法封装成了简单易用的API,让我们能把精力更多地放在上层应用开发上。从环境重建到障碍物跟踪,再到辅助定位规划,它在自动驾驶的感知层能扮演一个多面手的角色。当然,它要求开发者对三维视觉、坐标系变换、多传感器同步有基本的理解,这样才能避开坑,真正发挥出它的威力。在我经手的多个L2+和限定场景L4项目中,ZED2都是感知方案里不可或缺的一环,它的稳定性和丰富的数据输出,确实让整个系统的开发事半功倍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 16:10:05

直线电机技术解析:从原理到工业应用实践

1. 直线电机到底是什么?它和普通电机有啥不一样? 咱们先从一个最直观的问题开始:直线电机,听起来挺高大上,它到底是个啥?简单说,你可以把它想象成把咱们常见的旋转电机“一刀切开,然…

作者头像 李华
网站建设 2026/10/5 16:10:07

League Akari:4大核心功能重新定义英雄联盟游戏体验

League Akari:4大核心功能重新定义英雄联盟游戏体验 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 当你在英雄…

作者头像 李华
网站建设 2026/10/5 16:10:07

Qwen3-VL:30B开源模型应用:星图平台部署+Clawdbot飞书集成降本增效实证

Qwen3-VL:30B开源模型应用:星图平台部署Clawdbot飞书集成降本增效实证 实验说明:本文所有的部署及测试环境均由 CSDN 星图 AI 云平台提供。我们使用官方预装的 Qwen3-VL-30B 镜像作为基础环境进行二次开发。 1. 项目概述:打造智能办公助手 在…

作者头像 李华
网站建设 2026/10/5 16:11:08

mPLUG视觉问答模型在Linux环境下的高效部署指南

mPLUG视觉问答模型在Linux环境下的高效部署指南 你是不是也遇到过这种情况?手头有一堆图片,想快速知道里面有什么内容,或者想针对图片内容进行问答,但手动处理太慢,用在线服务又担心隐私问题。今天要聊的mPLUG视觉问答…

作者头像 李华
网站建设 2026/10/5 8:17:19

新手必看:Qwen3-Reranker常见问题解答

新手必看:Qwen3-Reranker常见问题解答 1. 引言:为什么需要了解这些问题 当你第一次接触Qwen3-Reranker这个文本重排序模型时,可能会遇到各种疑问和困惑。作为阿里云通义千问团队推出的新一代文本重排序模型,Qwen3-Reranker-0.6B…

作者头像 李华
网站建设 2026/10/5 16:13:33

SketchUp-STL:让3D打印工作流效率提升3倍的开源方案

SketchUp-STL:让3D打印工作流效率提升3倍的开源方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 核心价值&…

作者头像 李华