[具身智能-610]:Linux EGL Preview(嵌入式相机本地 HDMI 预览,适配你 RDK X5 + TROS/mipi_cam 场景)

一、基础概念

EGL = Embedded-System Graphics Library作用:作为 OpenGL ES 和底层显示硬件(Framebuffer/Drm/KMS)的桥梁无需 X11 窗口系统直接渲染画面到屏幕。

✅ EGL Preview 优势(嵌入式核心价值)

  1. 无 X Server 依赖:纯Linux console 环境就能跑,节省内存、降低 CPU 占用;
  2. 支持 YUV (NV12) 硬件渲染,适配MIPI相机原生输出格式;
  3. 支持 DMA-BUF 零拷贝,和地平线 VIO/hobot_shm 共享内存;
  4. RDK X5 平台官方推荐HDMI 本地预览方案,替代 websocket 网页预览。

对比:

  • Websocket:网络推流,适合远程浏览器查看;
  • EGL Preview:本地 HDMI 显示器实时渲染,低延迟。

二、两条实现路线(RDK X5 平台)

路线 1:地平线原生方案(优先推荐,适配 TROS mipi_cam)

地平线 SDK 内置两套显示方案:

  1. hobot_vio Display 模块(底层 VIO 链路) 直接接收 MIPI 相机 NV12 图像,EGL 渲染输出 HDMI,不经过 ROS2,延迟最低;
  2. ROS2 订阅话题 +EGL 渲染程序订阅/image_combine_raw(NV12 图像话题),EGL 渲染到 HDMI 屏幕。

⚠️前置硬性条件(对应你当前故障)相机必须先正常初始化:I2C 通信恢复,mipi_cam成功发布图像话题/image_combine_raw

当前你 I2C 超时、相机无法启动,即使编译好 EGL 预览程序,也没有图像数据可以渲染

路线 2:GStreamer EGL 简易预览(快速验证)

如果相机正常出流后,可以一行命令拉起 EGL 预览(纯命令行)

bash

运行

# 若你构建gst接收ROS图像链路,或直接V4L2采集 gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12 ! videoconvert ! eglglessink sync=false

eglglessink= GStreamer内置 EGL 渲染后端,不需要桌面系统。


三、EGL Preview 标准开发流程(C 代码逻辑概要)

针对 NV12 相机图像(RDK mipi_cam 输出格式)

  1. 获取 EGL Display(DRM/KMS 平台EGL_DEFAULT_DISPLAY
  2. 选择 EGL 配置、创建窗口表面(HDMI 输出窗口)
  3. 创建 OpenGL ES 2.0 上下文
  4. 编写NV12 转 RGB 着色器(相机输出标准 NV12)
  5. 接收图像帧(内存 / DMA-BUF)→ 创建 EGLImage 纹理
  6. 调用 gl 渲染,eglSwapBuffers()输出到屏幕
  7. 循环释放资源,持续渲染下一帧

关键难点:嵌入式平台 NV12 双平面纹理采样;零拷贝需要平台支持EGL_EXT_image_dma_buf_import扩展(RDK X5 支持)。

四、和现有工程结合的可行方案

当前工程链路:MIPI相机 → mipi_cam → /image_combine_raw(NV12) → hobot_codec(JPEG/H264) → websocket

方案 A(本地 HDMI 预览,新增 EGL 渲染节点)

新增一个 ROS2 节点: 订阅/image_combine_raw→ EGL OpenGL ES 渲染 → HDMI 显示器输出 同时保留原有 websocket 远程预览,两套预览并行运行。

方案 B(替换 websocket,底层 VIO 直出 EGL)

不经过 ROS2,直接使用地平线 VIO 采集相机图像 + Display EGL 送显,延迟最低; 缺点:不方便叠加 ROS 算法推理框。

方案 C(GStreamer 桥接 ROS2 话题 + EGL 渲染)

借助ros2_gstreamer插件订阅图像话题,交给eglglessink渲染,不用写 C++ 图形代码。

五、重要问题提醒(关联你前面的故障)

优先级顺序

  1. 先修复 I2C 超时,保证 mipi_cam 能够正常发布/image_combine_raw图像话题(当前阻塞点)
  2. 图像话题稳定输出后,再部署 EGL 本地预览程序
  3. 不要颠倒顺序:没有图像源,EGL 预览程序只能黑屏

六、常见踩坑清单(RDK X5 EGL)

  1. 无法打开 EGL display
    • 原因:使用 ssh 远程运行,没有权限访问 DRM 设备;
    • 解决:export XDG_SESSION_TYPE=drm,使用 root 权限,或直接本地串口 / HDMI 终端运行程序。
  2. NV12 画面偏色、花屏着色器 YUV→RGB 转换矩阵错误,或 UV 平面纹理绑定顺序错误。
  3. 高 CPU 占用尽量使用 DMA-BUF 零拷贝,避免内存拷贝;不要每次渲染都内存 memcpy 图像。
  4. 黑屏无画面确认帧率匹配、图像分辨率和纹理尺寸一致;检查 eglSwapBuffers 调用。

七、你可以补充信息,我给你对应落地代码

  1. 目标:需要独立 C++ ROS2 EGL 预览节点源码,还是 GStreamer 命令行方案?
  2. 硬件:是否已经连接 HDMI 显示器?
  3. 需求:是否需要在画面叠加检测框、文字渲染?