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 运行时如果您的平台上没有 QNN TFLite delegate — 确认共享库存在:如果该文件缺失,请先为您的设备安装 Qualcomm AI SDK 或 QNN 运行时软件包,然后再继续。该库必须位于
ai-edge-litert,可以回退到 tflite-runtime:/usr/lib/libQnnTFLiteDelegate.so(节点加载的默认路径)。摄像头驱动2
获取模型
Qualcomm AI Hub 上的所有模型在下载之前,均已针对您的特定目标设备进行编译和验证。
- 访问 https://aihub.qualcomm.com/models/midas。
- 选择 Export 并选择您的目标设备——IQ8 选择 IQ‑8275 EVK,IQ9 选择 IQ‑9075 EVK。
- 选择 TFLite 作为运行时,并选择 INT8 量化(
w8a8)。 - 下载导出的
.tflite文件——其名称为midas-midas-v2-w8a8.tflite。
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 节点,负责连接摄像头订阅、运行推理并发布结果。
midas_depth_ros/midas_tflite.py
midas_depth_ros/midas_tflite.py
负责 QNN delegate 加载、输入预处理、推理和深度彩色化的 TFLite 封装:
midas_depth_ros/midas_depth_node.py
midas_depth_ros/midas_depth_node.py
将摄像头订阅、推理和话题发布连接在一起的 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提供了预先连接好的相同管线——当您想在不自行构建节点的情况下运行深度估计时可以使用它。

