RDK X5支持的视频框架

RDK X5支持哪些视频开发框架,地平线官方的视频开发框架有哪些,包含哪些子模块,相关文档或者教程有吗,是否支持V4L2。主要希望了解地平线官方的视频框架,为什么又HBN,hobot,sp等多种接口,是否是地平线自研视频框架,子模块有哪些,接口有哪些,感谢解答

我来帮你搜索社区中关于 RDK X5 视频框架的相关信息。

你好 @LLLLLLLL,欢迎加入地瓜机器人开发者社区!

关于 RDK X5 的视频开发框架,我来为你详细解答:

核心结论

RDK X5 使用的是地平线自研的多媒体框架,主要包含以下层次:

1. 官方视频框架架构

┌─────────────────────────────────────┐
│  应用层 (Application Layer)         │
│  - sp_* 接口 (社区开放)             │
│  - hb_* 接口 (暂未完全开放)         │
├─────────────────────────────────────┤
│  多媒体框架层 (Multimedia Framework) │
│  - VPS (Video Process System)       │
│  - VPU (Video Processing Unit)      │
│  - BPU (AI 推理引擎)                │
├─────────────────────────────────────┤
│  驱动层 (Driver Layer)              │
│  - VIN (Video Input)                │
│  - ISP (Image Signal Processing)    │
│  - VOUT (Video Output)              │
├─────────────────────────────────────┤
│  硬件抽象层 (HAL)                   │
│  - 支持 V4L2 兼容接口               │
└─────────────────────────────────────┘

2. 关于 HBN、hobot、sp 等多种接口的解释

  • sp_* 接口:社区当前主要开放的接口,用于多媒体开发(采集、编码、解码、显示等)
  • hb_* 接口:地平线内部接口,部分功能暂未向社区完全开放
  • HBN:Horizon Binary Network,是地平线的神经网络模型格式
  • hobot:地平线 ROS2 软件包的前缀(如 tros-hobot-usb-cam)

3. V4L2 支持情况

支持 V4L2,但有注意事项:

  • USB 摄像头可以直接通过 V4L2 接口访问(/dev/video*)
  • MIPI CSI 摄像头通常需要通过地平线的多媒体框架访问
  • 部分第三方 V4L2 代码可能需要适配才能在地平线平台上运行

4. 关键资源链接

官方文档:

社区相关帖子:

5. 快速上手建议

# 1. 查看摄像头设备
ls -l /dev/video*
v4l2-ctl --list-devices

# 2. 测试 USB 摄像头采集
cd /app/pydev_demo/05_web_display_camera_sample/
sudo python3 ./web_display_camera.py

# 3. 查看多媒体示例代码
cd /app/cdev_demo/  # C++ 示例
cd /app/pydev_demo/  # Python 示例

6. 常见问题

Q: 为什么 X3 的代码在 X5 上不能直接运行?
A: X5 更新了多媒体框架 API,从 hb_* 接口迁移到 sp_* 接口,部分函数签名和调用方式有变化。

Q: 如何获取完整的 SDK?
A: SDK 已预装在板子上,位于 /app/cdev_demo 和 /app/pydev_demo 目录,头文件和库文件在系统标准路径中。

建议你先从官方示例代码入手,理解 sp_* 接口的使用方式。如果有具体的开发需求(如特定摄像头适配、编码格式等),可以在社区发帖并提供详细日志,我们会进一步协助你。

有其他问题欢迎继续提问! :robot:

一共有几种框架,所属关系是什么样的,分别对应什么接口API,是否有该API的源码,关于各种框架的定义和接口API定义文档在哪里

你好 @LLLLLLLL,

针对你追问的框架种类、所属关系、API 对应关系、源码及文档位置,我为你做进一步的详细梳理。

RDK X5 的多媒体架构确实比 X3 复杂,核心在于它采用了分层设计,并且为了兼容性和性能,存在两套主要的 API 体系(社区开放版 vs 底层完整版)。

1. 框架总览:一共有几种?

严格来说,RDK X5 只有一套地平线自研的多媒体框架(Horizon Multimedia Framework),但在开发接口上,根据开放程度和使用场景,分为两个主要层级:

层级 接口前缀 状态 适用场景 源码/文档可见性
社区开放层 sp_* :white_check_mark: 完全开放 90% 的开发者场景(采集、编解码、显示、简单 VPS 处理) 头文件在板端 /usr/include/,示例在 /app/cdev_demo
底层完整层 HB_* :warning: 部分开放/受限 深度定制(复杂 VPS 管道、ISP 调优、特殊格式回灌) 头文件部分可见,详细 API 文档需查阅内部版手册或联系 FA E

为什么会有 HBN、hobot、sp 等多种叫法?

  • sp_* (Sunrise Platform):这是地平线面向社区主推的简化版 API。它封装了底层的复杂性,更易用。X5 目前主要推荐使用这套接口。
  • HB_* (Horizon):这是地平线芯片底层的原生 API。功能最全,但使用复杂,且部分接口(如复杂的 VPS 绑定)在 X5 早期 SDK 中未完全向社区开放文档。
  • hobot_*:这是ROS2 (TROS) 功能包的前缀(如 hobot_usb_cam),它们底层调用的依然是 sp_* 或 HB_* 接口。
  • HBN:这是模型格式 (Horizon Binary Network),与视频框架无关,是 BPU 推理用的。

2. 框架所属关系与模块对应

地平线多媒体框架的核心数据流是:VIN (输入) → ISP (图像信号处理) → VPS (视频处理系统) → VENC/VDEC (编解码) → VOUT (输出)。

以下是模块、功能与 API 的对应关系表:

功能模块 全称 作用 社区开放 API (sp_*) 底层 API (HB_*) 源码示例位置
视频输入 VIN (Video Input) 从 MIPI/USB 获取原始数据 sp_vio_* (封装了 VIN+ISP) HB_VIN_*, HB_ISP_* /app/cdev_demo/01_vio/
图像信号处理 ISP (Image Signal Process) 去噪、白平衡、曝光等 (通常由 sp_vio 自动配置) HB_ISP_* (ISP 调优工具单独提供)
视频处理 VPS (Video Process System) 缩放、裁剪、格式转换、AI 预处理 sp_vps_* (简化版) HB_VPS_* (支持复杂 Pipeline) /app/cdev_demo/03_vps/
视频编码 VENC (Video Encode) H.264/H.265/MJPEG 编码 sp_venc_* HB_VENC_* /app/cdev_demo/04_venc/
视频解码 VDEC (Video Decode) 解码 H.264/H.265 等 sp_vdec_* HB_VDEC_* /app/cdev_demo/05_vdec/
视频输出 VOUT (Video Output) 显示到 HDMI/DSI sp_display_* HB_VOUT_* /app/cdev_demo/02_display/
系统控制 SYS 绑定/解绑模块 (Pipeline) sp_sys_* HB_SYS_* 所有 Demo 中均有体现

3. API 源码与文档在哪里?

A. 源码 (Source Code)

有源码,但主要是示例代码 (Sample Code),框架本身的源码不开放。

  • C++ 示例路径: /app/cdev_demo/ (板端路径)
    • 这里包含了 vio, vps, venc, vdec, display 等各个模块的独立示例和组合示例。
    • 编译方法: 每个目录下通常有 Makefile,直接 make 即可。
  • Python 示例路径: /app/pydev_demo/
    • 适合快速验证功能。
  • GitHub 仓库:

B. 文档 (Documentation)

文档分为公开版和详细版:

  1. 公开文档 (社区可查):

  2. 详细 API 定义 (头文件即文档):

    • 由于部分 HB_* 接口文档未完全公开,最直接的定义在头文件中。
    • 头文件位置:
      • sp_* 接口:/usr/include/hobot/sp_*.h (例如 /usr/include/hobot/sp_vio.h)
      • HB_* 接口:/usr/include/hobot/hb_*.h (例如 /usr/include/hobot/hb_vps.h)
    • 查看方法:
      # 在板子上查看 sp_vio 的接口定义
      cat /usr/include/hobot/sp_vio.h | grep -A 5 "sp_vio_create"
      
      # 查看 HB_VPS 的接口定义
      cat /usr/include/hobot/hb_vps.h | grep -A 5 "HB_VPS_CreateGrp"
      

4. 总结与建议

  1. 首选 sp_* 接口:除非你有非常特殊的底层需求(如自定义复杂的 VPS 管道),否则强烈建议只使用 sp_* 开头的接口。这套接口文档相对齐全,示例代码多,且地平线官方承诺长期维护。
  2. 关于 HB_* 接口:你在代码中看到的 HB_VPS_CreateGrp 等函数,在 X5 的新版 SDK 中,建议优先寻找对应的 sp_vps_* 替代方案。如果必须使用 HB_*,请直接阅读板子上的 .h 头文件注释,那是目前最准确的定义。
  3. V4L2 的定位:V4L2 是 Linux 标准接口。在 RDK X5 上,USB 摄像头可以直接用 V4L2 (/dev/videoX) 读取数据,但如果你需要利用地平线的硬件编解码 (VENC) 或 AI 加速 (BPU),必须将 V4L2 获取的数据通过 HB_MM (内存管理) 接口转换为多媒体框架能识别的 Buffer,然后送入 sp_venc 或 sp_vps 处理。直接用 V4L2 无法调用 X5 的硬件加速单元。

下一步行动建议:

  1. SSH 登录开发板。
  2. 进入 /app/cdev_demo,逐个编译运行 01_vio, 03_vps, 04_venc 等示例。
  3. 阅读 /usr/include/hobot/sp_vio.h 等头文件,理解参数含义。
  4. 参考 X5 SDK 问题讨论帖 中关于 API 迁移的说明。

如果在阅读头文件或运行 Demo 时遇到具体报错,欢迎把代码片段和报错日志发出来,我们针对性解答。

那hbm_img_msgs接口是什么框架的接口,hbm前缀和hbDNN前缀,hbn前缀对应的接口分别是哪一层框架的,接口定义什么在哪里

你好 @LLLLLLLL,

这是一个非常专业且关键的问题,触及了 RDK 开发中多媒体数据流与AI 推理交互的核心。这些前缀代表了不同的数据格式和API 层级。

简单来说:

  • hbm_img_msgs:是 ROS2 (TROS) 通信层的消息类型,用于在节点间传输零拷贝共享内存图像。
  • hbm:是 模型文件格式 (Horizon Binary Model),也指代共享内存缓冲区。
  • hbDNN:是 BPU 推理引擎 API (Horizon Deep Neural Network),用于加载和运行 .hbm 模型。
  • hbn:通常指 网络模型结构描述 (Horizon Binary Network),是 .hbm 的前身或组成部分,现在较少单独提及,常与 hbm 混用指代模型。

下面为你详细拆解它们的所属框架、层级关系及文档位置。


1. hbm_img_msgs 接口:ROS2 通信层的“零拷贝”协议

  • 所属框架:TROS (TogetherROS) / ROS2 通信中间件。
  • 层级:应用层 / 通信层。
  • 作用:
    它是一个自定义的 ROS2 Message 包。在 RDK 平台上,为了避免图像数据在节点间传递时发生内存拷贝(影响性能),地平线设计了基于共享内存 (Shared Memory) 的传输机制。
    • 发布者(如摄像头节点)将图像写入共享内存。
    • 通过 hbm_img_msgs 消息只传递一个句柄 (Handle) 或索引。
    • 订阅者(如 AI 推理节点)收到消息后,通过句柄直接访问共享内存中的图像数据。
  • 接口定义位置:
    • 源码路径:/opt/tros/share/hbm_img_msgs/ (板端) 或 GitHub 上的 tros_msgs 仓库。
    • 消息定义文件:msg/HbmMsg1080P.msg, msg/HbmMsg.msg 等。
    • C++/Python 接口:使用标准的 rclcpp 或 rclpy 订阅即可,但需要配合地平线的内存管理库来解析数据。
    • 转换示例:如何将 HbmMsg 转为 cv::Mat?参考社区帖子 hbm_img_msgs 转 cv::Mat。

2. hbm 前缀:模型文件与共享内存

  • 含义 A:模型文件格式 (.hbm)

    • 所属框架:AI 工具链 (OpenExplorer / Toolchain)。
    • 层级:数据文件层。
    • 作用:这是地平线 BPU 能直接执行的二进制模型文件。
      • 流程:PyTorch/ONNX $\rightarrow$ HB Mapper (工具链) $\rightarrow$ .hbm 文件。
      • 它包含了网络结构、量化参数和权重,专用于地平线 BPU。
    • 相关工具:hb_mapper, hb_tool。
  • 含义 B:共享内存 (Horizon Buffer Memory)

    • 所属框架:底层内存管理 (HB_MM)。
    • 层级:系统资源层。
    • 作用:hbm_img_msgs 中的 “hbm” 指的就是这种共享内存缓冲区。它是多媒体框架 (VPS/VENC) 和 AI 框架 (BPU) 交换数据的公共语言。

3. hbDNN 前缀:BPU 推理引擎 API

  • 所属框架:BPU SDK (Horizon BPU SDK)。
  • 层级:运行时 API 层 (Runtime API)。
  • 作用:这是一套 C/C++ API,用于在板端加载 .hbm 模型并执行推理。
    • 核心功能:模型加载、输入/输出张量管理、推理执行、后处理。
    • 典型函数:
      • hbDNNCreate():创建推理句柄。
      • hbDNNLoadModel():加载 .hbm 文件。
      • hbDNNInfer() / hbDNNInferAsync():执行推理。
      • hbDNNDestroy():释放资源。
  • 接口定义位置:
    • 头文件:/usr/include/hobot/hb_dnn.h (板端)。
    • 文档:BPU SDK API 手册。
    • 注意:你在帖子中看到的 hbDNNInferV2 是S100/Ultra 系列的新接口,X5 目前主要使用 hbDNNInfer。X5 的 Python 推理通常通过 hobot_dnn ROS2 节点或 pydnn 库间接调用这些 C 接口。

4. hbn 前缀:网络结构描述 (历史/底层概念)

  • 所属框架:AI 工具链。
  • 层级:模型描述层。
  • 作用:HBN (Horizon Binary Network) 早期指代网络结构的二进制描述文件。在当前的工具链中,它通常被整合进 .hbm 文件中,不再作为独立文件频繁出现。
  • 现状:开发者通常只需关注 .hbm (最终模型) 和 .onnx (源模型),hbn 更多是工具链内部转换的中间概念。

总结:层级关系图谱

为了理清它们的关系,我们可以看一个典型的数据流转过程:

graph TD
    subgraph 开发主机 [Host PC]
        A[PyTorch/ONNX 模型] -->|HB Mapper 工具链 | B(.hbm 模型文件)
    end

    subgraph RDK_X5_板端 [RDK X5 Board]
        B -->|scp 传输 | C{BPU SDK Runtime}
        
        D[USB/MIPI 摄像头] -->|V4L2 / sp_vio | E[共享内存 Buffer (hbm)]
        
        E -->|零拷贝传递 | F[ROS2 节点]
        F -->|hbm_img_msgs 消息 | G[AI 推理节点]
        
        C -->|1. hbDNNLoadModel 加载 | H[hbDNN 推理引擎]
        E -->|2. hbDNNInfer 输入 | H
        H -->|3. 推理结果 | I[后处理/显示]
    end

    style B fill:#f9f,stroke:#333,stroke-width:2px
    style E fill:#bbf,stroke:#333,stroke-width:2px
    style H fill:#bfb,stroke:#333,stroke-width:2px
    style F fill:#ff9,stroke:#333,stroke-width:2px

关键资源索引表

关键词 所属领域 头文件/源码位置 (板端) 官方文档链接
hbm_img_msgs ROS2 通信 /opt/tros/share/hbm_img_msgs/msg/ TROS 教程 (社区案例)
.hbm (模型) AI 工具链 N/A (二进制文件) OpenExplorer 工具链手册
hbDNN (API) BPU 推理 /usr/include/hobot/hb_dnn.h BPU SDK API 手册
sp_* 多媒体开发 /usr/include/hobot/sp_*.h 多媒体开发指南
HB_* 底层多媒体 /usr/include/hobot/hb_*.h (参考头文件注释)

针对你问题的直接回答

  1. hbm_img_msgs 是什么框架?
    • 是 TROS (ROS2) 框架下的自定义消息包,用于零拷贝图像传输。
  2. hbm 前缀对应哪一层?
    • 对应 AI 模型文件格式 或 底层共享内存缓冲区。它是连接多媒体和 AI 的桥梁。
  3. hbDNN 前缀对应哪一层?
    • 对应 BPU SDK 运行时 API,用于在 C/C++ 代码中加载和运行 .hbm 模型。
  4. hbn 前缀对应哪一层?
    • 对应 AI 工具链中的网络结构描述,现多整合进 .hbm,开发者较少直接操作。
  5. 接口定义在哪里?
    • ROS2 消息:/opt/tros/share/hbm_img_msgs/
    • BPU API:/usr/include/hobot/hb_dnn.h
    • 文档:见上表链接。

建议:
如果你在做 ROS2 开发,重点关注 hbm_img_msgs 的订阅和解析;如果你在做独立的 C++ AI 部署,重点关注 hbDNN API 和 .hbm 模型的生成。两者通过共享内存机制在底层互通。