基于Jetson AGX Orin与GMSL摄像头的实时目标检测与3D重建系统实践

1. 项目概述:当边缘AI遇见多目视觉

最近在折腾一个挺有意思的项目,核心是把几路GMSL摄像头接到Jetson AGX Orin上,让它不仅能实时认出画面里的东西,还能把这些二维的“看见”变成三维的“理解”,也就是实现目标检测和3D重建的融合。这听起来像是自动驾驶或者高端机器人视觉的活儿,没错,它的应用场景确实集中在对实时性和算力都有严苛要求的边缘端,比如无人车、移动机器人或者工业质检平台。

为什么是Jetson AGX Orin加GMSL这个组合?简单说,就是“强强联合”。Orin作为NVIDIA目前顶级的边缘AI计算平台,提供了高达275 TOPS的AI算力,这让我们有机会在设备端(而不是云端)运行像YOLOv8、YOLOv11甚至更复杂的视觉Transformer模型来处理高分辨率视频流。而GMSL(千兆多媒体串行链路)技术,则是解决多路、长距离、高质量视频传输的“高速公路”。它通过一根同轴线缆就能同时传输高清视频、控制信号和电力,布线简洁,抗干扰能力强,特别适合车载这种振动大、电磁环境复杂的场景。你不再需要为每个摄像头单独拉电源线和网线,一套线束搞定,可靠性大大提升。

这个项目的核心价值在于,它试图在资源受限的边缘设备上,打通从“感知”到“认知”的闭环。传统方案可能只做目标检测,告诉你“那里有辆车,坐标是(x, y, w, h)”,或者只做离线3D重建,生成一个漂亮但滞后的点云模型。我们的目标是实时地、同步地完成这两件事:不仅检测出目标,还能立刻估算出它的三维位置、姿态甚至粗略的几何形状,为后续的路径规划、避障或交互提供直接的、可量化的空间信息。这对于智能体的自主决策至关重要。

2. 核心硬件选型与系统架构设计

2.1 主角解析:Jetson AGX Orin开发者套件

选择Jetson AGX Orin 64GB版本作为大脑,是经过深思熟虑的。它搭载的NVIDIA Ampere架构GPU,拥有1792个CUDA核心和56个Tensor核心,275 TOPS的INT8算力足以同时吞吐多路高清视频的AI推理。更重要的是,它提供了丰富的接口:多个CSI-2接口(用于连接MIPI摄像头)和强大的PCIe通道,后者正是连接GMSL解串器(Deserializer)的关键。

Orin内置的JetPack SDK(包含Linux操作系统、CUDA、TensorRT、深度学习框架等)构成了完整的软件生态,极大简化了开发。我们需要关注的是其电源管理,在满负荷运行多模型时,功耗可能达到40-50W,良好的散热设计(如使用官方散热套件或强制定制风冷)是稳定运行的前提。

2.2 视觉之眼:GMSL摄像头与解串方案

GMSL摄像头本身是一个集成了图像传感器和串行器的模块。市面上常见的有来自Leopard Imaging、Stereolabs或一些工业相机厂商的产品,支持100万到800万甚至更高像素。选择时需权衡分辨率、帧率、低照度性能(如索尼Starvis传感器)和镜头视场角。

关键环节在于如何让Orin“看懂”GMSL信号。Orin原生不支持GMSL,需要借助GMSL解串器板卡(如来自Connect Tech、Auvidea或Leopard Imaging的载板)。这些载板通过PCIe x4或x8接口与Orin连接,板上集成了Maxim(现ADI)的GMSL解串器芯片(如MAX9296),将来自摄像头的串行信号转换为并行的MIPI CSI-2信号,再通过FPC排线连接到Orin的CSI-2接口。

一个典型的四路GMSL系统连接拓扑如下:

  1. 4个GMSL摄像头通过同轴电缆连接到车载或设备端的串行器端。
  2. 同轴电缆另一端接入位于Orin侧的GMSL解串器载板。
  3. 该载板通过PCIe插槽与Jetson AGX Orin连接。
  4. 载板同时将转换后的CSI-2信号通过板间连接器送至Orin的CSI-2接收器。

注意:不同厂商的解串器载板需要特定的内核驱动和配置文件(.dtb)。务必从载板供应商处获取为特定JetPack版本(如JP 5.1.2)定制好的驱动和文档,自行编译内核或配置设备树是初期最大的挑战之一。

2.3 系统架构总览

整个系统的数据流和软件架构可以这样理解:

[GMSL Camera x N] --(GMSL Coax)--> [GMSL Deserializer Board] --(PCIe + CSI-2)--> [Jetson AGX Orin] | V [V4L2 Driver] -> [RAW Image Buffer] | V [NVIDIA DeepStream SDK / 自定义GStreamer Pipeline] | V +------------------+------------------+ | | | V V V [目标检测模型推理] [图像预处理/矫正] [多视图图像缓存] | | | V V V [2D BBox & Labels] [Rectified Images] [Image Pairs] | | | +------------------+------------------+ | V [3D重建与融合模块] (立体匹配/深度估计 -> 点云生成 -> 目标关联) | V [3D BBox / Point Cloud / Pose] | V [ROS 2 Node / 自定义API] -> 输出

DeepStream SDK是本项目的加速器,它提供了高效的视频流解码、批处理、推理、跟踪的流水线,能充分发挥Orin的硬件编解码器和TensorRT的推理优化能力。

3. 软件栈搭建与驱动配置

3.1 基础环境准备

首先,为Jetson AGX Orin刷写最新的JetPack SDK。建议使用NVIDIA SDK Manager进行安装,它能确保OS、CUDA、cuDNN、TensorRT等版本完全兼容。这里以JetPack 5.1.2为例。

# 安装后,检查关键组件版本 cat /etc/nv_tegra_release # 查看L4T版本 nvcc --version # 查看CUDA版本 dpkg -l | grep nvidia-jetpack # 查看JetPack元包版本

接下来,安装必要的工具和库:

sudo apt-get update sudo apt-get install -y cmake git build-essential libopencv-dev python3-dev python3-pip pip3 install --upgrade pip

3.2 GMSL摄像头驱动与V4L2配置

这是第一个技术难点。假设我们使用的是某厂商提供的四路GMSL解串器载板。

  1. 获取驱动包:从载板厂商官网下载针对JetPack 5.1.2的驱动包,通常包含内核模块(.ko文件)和设备树覆盖(.dtbo)文件。
  2. 安装内核模块
    # 解压驱动包 tar -xzf gmsl_driver_bundle.tar.gz cd gmsl_driver_bundle # 编译并安装内核模块,具体命令依厂商说明而定,可能涉及`make`和`sudo insmod` sudo ./install.sh
  3. 配置设备树:将提供的.dtbo文件复制到/boot/dtbs/目录,并修改/boot/extlinux/extlinux.conf文件,在FDT项中添加设备树覆盖的路径。
    # 例如,在extlinux.conf中找到对应条目,修改为: FDT /boot/dtbs/kernel_tegra234-p3701-0000-p3737-0000-gmsl.dtb
  4. 重启并验证:重启Orin后,使用v4l2-ctl工具检查摄像头是否被识别。
    # 列出所有视频设备 v4l2-ctl --list-devices # 应该能看到类似 /dev/video0, /dev/video1... 的设备,对应各个摄像头 # 查看某个摄像头的具体信息和支持格式 v4l2-ctl -d /dev/video0 --all

实操心得:驱动安装失败十有八九是内核版本不匹配。务必确认驱动包支持的L4T版本与你安装的JetPack版本完全一致。另一个常见问题是PCIe枚举顺序导致/dev/video编号不稳定,建议在应用层通过设备的唯一标识(如总线信息)来定位摄像头,而不是依赖固定的video编号。

3.3 深度学习环境与推理引擎部署

我们选择TensorRT作为最终的推理引擎,因为它能为Orin的GPU提供极致优化。通常的工作流是:在PC上训练好模型(使用PyTorch或TensorFlow),然后转换为ONNX格式,最后在Orin上用TensorRT生成序列化引擎(.engine文件)。

  1. 安装PyTorch和TorchVision:从NVIDIA官网下载与JetPack CUDA版本匹配的PyTorch wheel文件进行安装。
    wget https://nvidia.box.com/shared/static/......torch-2.1.0a0+41361538.nv23.06-cp38-cp38-linux_aarch64.whl pip3 install torch-*.whl # 安装对应版本的torchvision pip3 install torchvision
  2. 安装TensorRT和ONNX相关工具:JetPack已包含TensorRT,但可能需要额外安装onnxonnx-simplifier
    pip3 install onnx onnxsim onnxruntime
  3. 模型转换示例(以YOLOv8为例)
    # 1. 导出YOLOv8模型为ONNX(在训练机上进行) # 假设你有一个训练好的yolov8n.pt模型 yolo export model=yolov8n.pt format=onnx imgsz=640 # 2. (可选) 简化ONNX模型 python3 -m onnxsim yolov8n.onnx yolov8n_sim.onnx # 3. 在Jetson Orin上,使用trtexec转换ONNX为TensorRT引擎 # 需要先找到trtexec工具,通常在/usr/src/tensorrt/bin/下 /usr/src/tensorrt/bin/trtexec --onnx=yolov8n_sim.onnx --saveEngine=yolov8n_fp16.engine --fp16 --workspace=2048 --buildOnly
    --fp16启用半精度推理,能显著提升速度并节省内存,精度损失通常可接受。--workspace设置GPU内存工作空间大小,复杂模型需要更大空间。

4. 多路视频流采集与同步处理

4.1 基于GStreamer/DeepStream的流水线构建

直接使用OpenCV的VideoCapture读取多路GMSL摄像头在Orin上效率不高,无法充分利用硬件加速。我们采用GStreamer来构建高效的采集和处理流水线。DeepStream SDK本质上是NVIDIA对GStreamer的深度定制和插件扩展。

一个基本的、使用GStreamer读取四路摄像头并进行显示的流水线命令如下:

gst-launch-1.0 \ v4l2src device=/dev/video0 ! queue ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! tee name=t0 \ t0. ! queue ! nvvidconv ! nvegltransform ! nveglglessink window-x=0 window-y=0 \ t0. ! queue ! nvvidconv ! nvstreammux0.sink_0 \ v4l2src device=/dev/video1 ! queue ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! nvvidconv ! nvstreammux0.sink_1 \ v4l2src device=/dev/video2 ! queue ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! nvvidconv ! nvstreammux0.sink_2 \ v4l2src device=/dev/video3 ! queue ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! nvvidconv ! nvstreammux0.sink_3 \ nvstreammux name=nvstreammux0 batch-size=4 width=1280 height=720 ! \ nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink window-x=1280 window-y=0

这个命令做了两件事:1) 在窗口左上角显示一路摄像头的原始画面;2) 将四路摄像头画面通过nvstreammux组件批处理成一个批量张量,然后进行简单的转换和叠加显示。nvstreammux是DeepStream的核心组件之一,负责将多路流打包,以便后续的AI推理插件能进行批处理推理,极大提升吞吐量。

4.2 集成目标检测推理

我们需要将上面的显示流水线,升级为包含AI推理的流水线。这通常通过编写C++或Python的DeepStream应用程序来实现。其核心是配置一个包含nvstreammux->nvinfer(推理插件) ->nvtracker(可选,跟踪插件) ->nvdsosd(绘制插件)的管道。

关键配置文件config_infer_primary.txt(用于nvinfer插件)示例片段:

[property] ... model-engine-file=yolov8n_fp16.engine # 上一步生成的TensorRT引擎 batch-size=4 ... [class-attrs-all] ... pre-cluster-threshold=0.2

在应用中,推理插件会输出带检测框的元数据,nvdsosd插件则根据这些元数据在视频帧上绘制框和标签。

注意事项:多路流的帧同步是个挑战。硬件触发(如使用同步信号线连接所有摄像头)是最精确的方式。如果做不到,则需要在软件层面进行处理。nvstreammuxbatch-size应等于摄像头路数,它会在一个批次中处理每一路的最新帧,但这并非严格的硬件同步。对于3D重建,时间同步误差会导致深度计算错误,因此对于立体匹配用的摄像头对,硬件同步是强烈推荐的。

5. 实时3D重建模块实现

5.1 从2D检测到3D空间

仅仅有2D检测框是不够的。我们需要知道目标在三维空间中的位置(X, Y, Z)。这里主要有两种思路:

  1. 单目深度估计 + 2D检测:使用一个深度学习模型(如MiDaS,但速度较慢)或几何先验(如假设地面是平面,目标接触地面)来估算整个场景或目标底部的深度,从而反算3D位置。这种方法精度有限,但实现相对简单。
  2. 立体视觉:这是我们项目采用的核心方法。至少需要两个经过精确标定的摄像头(构成双目系统)。通过找到同一个目标在两个摄像头图像中的对应点(匹配),利用三角测量原理直接计算其三维坐标。这需要相机标定立体匹配两个关键步骤。

5.2 相机标定与立体校正

标定的目的是获取每个摄像头的内参(焦距、主点、畸变系数)和两个摄像头之间的外参(旋转矩阵和平移向量)。我们使用OpenCV的cv2.calibrateCameracv2.stereoCalibrate函数。

标定实操步骤:

  1. 采集标定板图像:使用棋盘格或CharUco标定板,同时用左右(或多目)摄像头从不同角度拍摄十几到几十对图像。确保标定板在图像中清晰、完整。
  2. 提取角点:使用cv2.findChessboardCornerscv2.aruco.CharucoDetector检测角点。
  3. 计算参数
    # 单目标定 ret, K1, dist1, rvecs1, tvecs1 = cv2.calibrateCamera(objpoints, imgpoints_left, image_size, None, None) ret, K2, dist2, rvecs2, tvecs2 = cv2.calibrateCamera(objpoints, imgpoints_right, image_size, None, None) # 双目标定 ret, K1, dist1, K2, dist2, R, T, E, F = cv2.stereoCalibrate( objpoints, imgpoints_left, imgpoints_right, K1, dist1, K2, dist2, image_size )
  4. 立体校正:标定后,使用cv2.stereoRectify计算校正映射,并使用cv2.initUndistortRectifyMap生成映射表。后续对每一帧图像,使用cv2.remap进行快速校正,使得左右图像的极线对齐(共面行对准),将复杂的立体匹配问题简化为一维搜索。
    R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(K1, dist1, K2, dist2, image_size, R, T) map1x, map1y = cv2.initUndistortRectifyMap(K1, dist1, R1, P1, image_size, cv2.CV_32FC1) map2x, map2y = cv2.initUndistortRectifyMap(K2, dist2, R2, P2, image_size, cv2.CV_32FC1) # 对实时帧进行校正 frame_left_rectified = cv2.remap(frame_left, map1x, map1y, cv2.INTER_LINEAR) frame_right_rectified = cv2.remap(frame_right, map2x, map2y, cv2.INTER_LINEAR)

避坑技巧:标定精度直接决定3D重建的准确性。务必保证标定板图像质量高、角度多样。标定后,务必用cv2.projectPoints重投影来评估重投影误差(通常应小于0.5像素)。对于GMSL摄像头,如果镜头存在明显的径向畸变,标定尤为重要。

5.3 立体匹配与深度图计算

校正后的左右图像,对于同一场景点,其在左右图中的纵坐标相同,只需在水平方向(行)上搜索匹配点。这个水平方向的坐标差称为视差。深度Z与视差d成反比:Z = f * B / d,其中f是焦距(像素单位),B是两个摄像头光心之间的距离(基线长度)。

OpenCV提供了多种立体匹配算法,主要分两类:

  • 局部方法:如BM(Block Matching)、SGBM(Semi-Global Block Matching)。速度较快,适合实时系统。
  • 全局方法:如ELAS、GC。精度更高,但速度慢。

我们选择SGBM作为实时应用的平衡点:

import cv2 # 创建SGBM对象并设置参数 window_size = 5 min_disp = 0 num_disp = 16*5 # 必须是16的整数倍,数值越大,可探测的深度范围越近 stereo = cv2.StereoSGBM_create( minDisparity=min_disp, numDisparities=num_disp, blockSize=window_size, P1=8*3*window_size**2, P2=32*3*window_size**2, disp12MaxDiff=1, uniquenessRatio=15, speckleWindowSize=0, speckleRange=2, preFilterCap=63, mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY ) # 计算视差图 disparity = stereo.compute(gray_left_rectified, gray_right_rectified).astype(np.float32) / 16.0 # 计算深度图 (Q是stereoRectify得到的重投影矩阵) depth_map = cv2.reprojectImageTo3D(disparity, Q) # depth_map是一个三维数组,其中depth_map[y, x, 2]就是像素点(x,y)的深度Z值。

5.4 2D检测框与3D信息的融合

这是最后一步,也是信息升华的一步。流程如下:

  1. 获取2D检测结果:从DeepStream流水线中,我们得到了每一帧中每个目标的2D边界框(x_min, y_min, x_max, y_max)和类别标签。
  2. 定位目标3D位置
    • 方法A(框内平均):在深度图上,取目标2D框底部中心区域(假设目标接触地面)或整个框内所有有效深度点的平均值或中值,作为该目标的深度Z。
    • 方法B(3D点云聚类):将目标2D框内的所有3D点(由深度图转换而来)提取出来,形成一个小的点云子集。然后使用聚类算法(如DBSCAN)或直接计算点云的中心,得到目标的3D位置(X, Y, Z)和可能的3D边界框尺寸。
  3. 坐标转换:注意,此时得到的3D坐标是在左摄像头坐标系下的。如果需要,可以将其转换到车体或世界坐标系(需要额外的外参标定)。
  4. 输出:最终,每个目标的信息从[类别, 2D框]扩展为[类别, 2D框, 3D位置(X,Y,Z), 3D尺寸(长宽高), 置信度]
# 伪代码示例:融合2D检测框与深度图 for detection in detections_list: x1, y1, x2, y2 = detection.bbox class_id = detection.class_id # 取框底部中心区域(例如,底部20%的高度) roi_bottom = depth_map[int(y2*0.8):y2, x1:x2, 2] # 假设depth_map的第三维是Z # 过滤掉无效深度(例如为0或非常大的值) valid_depths = roi_bottom[(roi_bottom > 0.5) & (roi_bottom < 50.0)] if len(valid_depths) > 0: object_depth = np.median(valid_depths) # 使用中值抵抗噪声 # 利用相机内参,将图像坐标(u,v)和深度Z反投影到相机坐标系(Xc, Yc, Zc) # u = (x1+x2)/2, v = (y1+y2)/2 或 v = y2 u, v = (x1+x2)//2, y2 Xc = (u - cx) * object_depth / fx Yc = (v - cy) * object_depth / fy Zc = object_depth detection.set_3d_position(Xc, Yc, Zc)

6. 性能优化与工程化挑战

6.1 实时性保障与资源分配

在Jetson AGX Orin上同时跑多路视频流、目标检测和立体匹配,对算力是巨大考验。必须进行精细的优化:

  1. 模型轻量化:优先选择计算量小的模型,如YOLOv8n、YOLOv11n,或使用TensorRT的INT8量化。INT8量化能带来近一倍的推理速度提升,但需要校准数据集来减少精度损失。
  2. 流水线并行:利用DeepStream的管道和多线程特性,让数据采集、预处理、推理、后处理、3D计算等步骤尽可能重叠执行,减少整体延迟。
  3. GPU/CPU分工:将计算密集型的任务(图像预处理中的缩放/归一化、AI推理、立体匹配中的部分计算)放在GPU上(CUDA核函数或TensorRT插件)。将逻辑控制、结果发布等任务放在CPU上。
  4. 内存管理:Jetson平台共享内存,需警惕内存泄漏。使用jetson_stats工具(sudo pip3 install jetson-stats)监控GPU、CPU、内存使用情况。确保及时释放不再使用的缓冲区。

6.2 多路流同步与延迟处理

即使无法硬件同步,也要在软件层面尽量减少异步带来的影响:

  • 时间戳对齐:为每一帧打上采集时间戳。在处理时,尽量使用时间戳相近的帧进行立体匹配和融合。
  • 运动补偿:对于快速运动的场景或平台,如果处理延迟较大,可以根据自身的IMU数据对3D检测结果进行运动补偿,将其投影到最新的时间点上。
  • 选择性处理:不是每一帧都需要进行完整的3D重建。可以降低3D重建的频率(例如每3帧做一次),或者只对感兴趣的目标(如近距离、运动快的目标)进行精细的3D计算。

6.3 系统集成与输出

处理结果需要以某种形式输出,供上层应用(如自动驾驶的规划模块、机械臂的控制系统)使用。常见的方式有:

  • ROS 2节点:将整个应用封装成一个或多个ROS 2节点,通过vision_msgs/Detection3DArray等标准消息类型发布3D检测结果,通过sensor_msgs/PointCloud2发布稠密或稀疏的点云。这是机器人领域最通用的集成方式。
  • ZeroMQ/Protobuf:如果需要与不同语言或框架的系统通信,可以使用ZeroMQ进行高性能消息传递,并用Protobuf定义数据结构,保证跨平台的兼容性和效率。
  • 视频流叠加输出:利用DeepStream的nvdsosd插件或OpenCV,将2D检测框和3D信息(如距离)直接绘制在视频流上,通过RTMP推流或HDMI输出,用于监控或调试。

7. 常见问题排查与调试心得

在实际部署中,你会遇到各种各样的问题。下面是一个快速排查指南:

问题现象可能原因排查步骤与解决方案
摄像头无法识别 (v4l2-ctl无设备)1. 驱动未安装或安装错误。
2. 设备树配置错误。
3. 硬件连接问题(线缆、供电)。
1. 检查`dmesg
视频流花屏、卡顿1. 带宽不足(分辨率/帧率过高)。
2. PCIe带宽瓶颈(多路高清流)。
3. 系统负载过高,CPU/GPU饱和。
1. 降低摄像头分辨率或帧率(如从1080p60降至720p30)。
2. 使用sudo lspci -vv检查PCIe链路速度和宽度,确保是Gen3 x4或以上。
3. 使用jtophtop监控系统资源,优化代码,启用硬件加速。
目标检测模型推理速度慢1. 模型过于复杂。
2. 未使用TensorRT或未启用FP16/INT8。
3. 批处理(batch)大小设置不合理。
1. 换用更轻量的模型(如YOLOv8n vs YOLOv8x)。
2. 确保使用trtexec生成引擎,并在DeepStream配置中正确指定引擎文件,启用fp16int8
3. 在DeepStream的nvstreammuxnvinfer配置中,将batch-size设置为与路数相等,充分利用批处理优势。
3D重建深度图噪声大、空洞多1. 相机标定不准确。
2. 立体匹配参数不佳。
3. 场景纹理缺失(如白墙、纯色物体)。
4. 摄像头同步不好,有运动模糊。
1. 重新进行高精度的双目标定,检查重投影误差。
2. 调整SGBM参数,如增大P1P2惩罚系数,调整numDisparitiesblockSize。可尝试OpenCV的StereoBMcv2.StereoSGBM_MODE_HH模式。
3. 增加场景纹理,或考虑使用结构光、ToF等主动深度传感器辅助。
4. 改善光照条件,尝试硬件同步,或使用全局快门摄像头减少运动模糊。
2D框与3D位置对应错误1. 2D检测框抖动。
2. 深度图计算区域选择不当(如框到了背景)。
3. 坐标系转换错误。
1. 在DeepStream流水线中加入nvtracker插件进行目标跟踪,稳定ID和框位置。
2. 优化从2D框到3D点的映射策略,例如使用框底部中心、结合目标分割掩码(如果可用)来获取更精确的目标区域深度。
3. 仔细检查相机内参、外参矩阵在坐标反投影和坐标系转换中的使用顺序和乘法顺序。绘制3D点到图像上的重投影点,验证准确性。
系统运行一段时间后崩溃或卡死1. 内存泄漏。
2. 散热不足导致热节流。
3. 电源不稳定。
1. 使用valgrindgperftools检查内存泄漏。确保在循环中释放临时变量,特别是OpenCV的cv::Mat和动态分配的内存。
2. 安装主动散热风扇,监控GPU温度(jtop),确保温度在85°C以下。
3. 使用官方推荐的电源适配器(至少65W),避免使用功率不足的电源。

个人调试心得:

  • 日志分级:在代码中实现详细的日志系统(如spdlog),区分INFO、DEBUG、ERROR等级。在开发阶段开启DEBUG日志,能快速定位数据流在哪个环节出了问题。
  • 可视化是王道:不要只盯着数据看。实时显示每一路摄像头的原始画面、校正后的画面、检测结果叠加图、视差图(归一化后)和深度图(伪彩色)。视觉反馈能帮你立刻发现标定是否对齐、匹配是否出错。
  • 分阶段验证:不要试图一次性集成所有模块。先确保单路摄像头采集正常;然后加入目标检测并稳定运行;接着实现双目标定和深度图生成;最后再做2D/3D融合。每完成一步,都进行充分的测试和验证。
  • 利用好Jetson的专属工具jtop是监控Jetson状态的瑞士军刀。nvpmodeljetson_clocks可以配置CPU和GPU的运行频率模式。在追求极致性能时,可以手动锁频,但要注意功耗和散热。