Skip to main content
本页是 qrb_ros_samples 目录中 sample_depth_estimation 的手工构建版本。您不是安装打包好的示例,而是自己构建 ROS 2 节点——订阅摄像头话题、通过 Qualcomm QNN delegate 在 Hexagon HTP NPU 上运行量化的 TFLite 模型,并发布着色后的深度图像和原始逆深度图。目标是端到端地展示各个部分如何组合在一起,以便您可以为任何模型构建自己的节点。
为什么要自己构建而不是使用示例? 示例目录是一个很好的起点,但您最终会遇到它未覆盖的模型或流水线形态。本页演示了示例所使用的相同模式——QNN delegate 加载、预处理、推理、后处理、发布——基于标准的 sensor_msgs / cv_bridge 以及来自 Qualcomm AI Hub 的模型进行连接。一旦您看过一次,就可以将 MiDaS v2 替换为任何 AI Hub 模型并复用相同的脚手架。本页和 sample_depth_estimation 都以相同的 Hexagon HTP NPU 为目标——只是本页展示了每一根”连线”。

每个阶段在哪里运行

这与标准 ROS 2 TFLite 节点有何不同

  • 标准 TFLite 在 CPU(最多在 OpenCL GPU)上运行。 Hexagon HTP NPU 只能通过 Qualcomm QNN delegate 或 QNN SDK 访问,而这正是此流水线所加载的内容。
  • 每个节点边界都是一次 memcpy。 cv_bridge + v4l2_camera 在每一跳都会分配并复制完整帧。对于硬件到硬件的流水线(摄像头 ISP → NPU),这种复制是可以避免的——参见 qrb_ros_transport 了解 DMA‑buf fd 传递。
  • NVIDIA Isaac ROS / Intel OpenVINO 软件包面向不同的芯片(NVIDIA GPU / Intel VPU),无法在 Qualcomm 硬件上运行。
前提条件: 开始之前请完成 软件设置工作流程。本页使用发布 /image_raw 的 USB 或 ISP 摄像头,而非特定的机器人平台。
此工作流程中的前处理和后处理——图像解码、缩放、颜色转换和可视化——在 CPU 上运行。若需 GPU 加速的前后处理,请使用 IM SDK 中的 GStreamer 插件。
1

安装前提条件

安装 Python TFLite 运行时,验证 QNN TFLite delegate,并安装摄像头驱动。TFLite 运行时
如果 ai-edge-litert 在您的平台上不可用,请回退到 tflite-runtime:
QNN TFLite delegate — 确认共享库存在:
如果该文件缺失,请先为您的设备安装 Qualcomm AI SDK 或 QNN 运行时软件包再继续。该库必须位于 /usr/lib/libQnnTFLiteDelegate.so(节点加载的默认路径)。摄像头驱动
2

获取模型

Qualcomm AI Hub 上的所有模型在您下载之前都已针对您的特定目标设备进行了编译和验证。
  1. 前往 https://aihub.qualcomm.com/models/midas。
  2. 选择 Export 并选择您的目标设备——IQ8 选择 IQ‑8275 EVK,IQ9 选择 IQ‑9075 EVK。
  3. 选择 TFLite 作为运行时,并选择 INT8 量化(w8a8)。
  4. 下载导出的 .tflite 文件——文件名将为 midas-midas-v2-w8a8.tflite。
下载后,请确认文件名以 .tflite 结尾。如果 AI Hub 对您的设备只显示 ONNX 导出选项,则该组合不支持 TFLite——请参阅 AI 工作流程章节,了解如何在 NPU 上运行 ONNX 模型。
3

搭建软件包脚手架

ros2 pkg create 会生成所有样板文件——package.xml、setup.cfg、setup.py、ament 资源标记和 __init__.py。
运行这些命令之前,请导航到您的工作区根目录。后续步骤中的所有路径都是相对于工作区根目录的。
软件包名称必须是 ros2 pkg create 之后的第一个位置参数——将其紧跟在 create 之后、任何标志之前。如果将它放在 --dependencies 之后,CLI 会将其视为另一个依赖项,命令将失败且不会创建任何软件包。
创建其余目录并将模型移动到位:
4

更新 package.xml

ros2 pkg create 已经添加了 ROS 依赖项。在 <package> 块内追加这两个 Python 系统依赖项:
添加这些依赖项后,重新运行 rosdep install 来解析它们:
5

替换 setup.py

生成的 setup.py 需要更新 data_files,以便安装 launch 文件、配置和模型。
6

编写源文件

该软件包有两个源文件:一个 TFLite 包装类,负责 delegate 加载、预处理、推理和可视化;以及一个 ROS 2 节点,负责连接摄像头订阅、运行推理并发布结果。
处理 QNN delegate 加载、输入预处理、推理和深度着色的 TFLite 包装器:
将摄像头订阅、推理和话题发布连接在一起的 ROS 2 节点:
7

编写 launch 和配置文件

关键参数:
8

构建

9

运行

如果摄像头尚未运行,请先启动它:
然后启动推理节点:
启动时,节点会记录 NPU delegate 是否成功加载:
如果 delegate 加载失败,它会回退到 CPU 并记录原因:

话题

在 RViz 中可视化

添加一个 Image 显示并将话题设置为 /midas/depth_image。使用默认的 inferno 颜色映射,着色输出会将较近的物体映射为较亮的值。

后续步骤

  • 将此脚手架适配到另一个模型。 将步骤 2 中的 MiDaS 导出替换为来自 Qualcomm AI Hub 的任何 TFLite 模型,并调整 midas_tflite.py 中的预处理。delegate 加载、话题连接以及 launch/配置文件均可原样复用。
  • 想避免摄像头与此节点之间每帧的 CPU 复制? 参见 qrb_ros_transport,了解零拷贝 DMA-buf 传递。
  • 更喜欢此流水线的打包版本? qrb_ros_samples 中的 sample_depth_estimation 提供了预先连接好的相同流水线——当您想运行深度估计而无需自己构建节点时可以使用它。