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.xmlsetup.cfgsetup.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/config 文件均可原样沿用。
  • 想避免摄像头与此节点之间的逐帧 CPU 复制? 参见 qrb_ros_transport 了解零拷贝 DMA-buf 传递。
  • 更喜欢此管线的打包版本? qrb_ros_samples 中的 sample_depth_estimation 提供了预先连接好的相同管线——当您想在不自行构建节点的情况下运行深度估计时可以使用它。