[具身智能-610]:Linux EGL Preview(嵌入式相机本地 HDMI 预览,适配你 RDK X5 + TROS/mipi_cam 场景)
一、基础概念
EGL = Embedded-System Graphics Library作用:作为 OpenGL ES 和底层显示硬件(Framebuffer/Drm/KMS)的桥梁,无需 X11 窗口系统直接渲染画面到屏幕。
✅ EGL Preview 优势(嵌入式核心价值)
- 无 X Server 依赖:纯Linux console 环境就能跑,节省内存、降低 CPU 占用;
- 支持 YUV (NV12) 硬件渲染,适配MIPI相机原生输出格式;
- 支持 DMA-BUF 零拷贝,和地平线 VIO/hobot_shm 共享内存;
- RDK X5 平台官方推荐HDMI 本地预览方案,替代 websocket 网页预览。
对比:
- Websocket:网络推流,适合远程浏览器查看;
- EGL Preview:本地 HDMI 显示器实时渲染,低延迟。
二、两条实现路线(RDK X5 平台)
路线 1:地平线原生方案(优先推荐,适配 TROS mipi_cam)
地平线 SDK 内置两套显示方案:
- hobot_vio Display 模块(底层 VIO 链路) 直接接收 MIPI 相机 NV12 图像,EGL 渲染输出 HDMI,不经过 ROS2,延迟最低;
- 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=falseeglglessink= GStreamer内置 EGL 渲染后端,不需要桌面系统。
三、EGL Preview 标准开发流程(C 代码逻辑概要)
针对 NV12 相机图像(RDK mipi_cam 输出格式)
- 获取 EGL Display(DRM/KMS 平台
EGL_DEFAULT_DISPLAY) - 选择 EGL 配置、创建窗口表面(HDMI 输出窗口)
- 创建 OpenGL ES 2.0 上下文
- 编写NV12 转 RGB 着色器(相机输出标准 NV12)
- 接收图像帧(内存 / DMA-BUF)→ 创建 EGLImage 纹理
- 调用 gl 渲染,
eglSwapBuffers()输出到屏幕 - 循环释放资源,持续渲染下一帧
关键难点:嵌入式平台 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++ 图形代码。
五、重要问题提醒(关联你前面的故障)
❗优先级顺序
- 先修复 I2C 超时,保证 mipi_cam 能够正常发布
/image_combine_raw图像话题(当前阻塞点) - 图像话题稳定输出后,再部署 EGL 本地预览程序
- 不要颠倒顺序:没有图像源,EGL 预览程序只能黑屏
六、常见踩坑清单(RDK X5 EGL)
- 无法打开 EGL display
- 原因:使用 ssh 远程运行,没有权限访问 DRM 设备;
- 解决:
export XDG_SESSION_TYPE=drm,使用 root 权限,或直接本地串口 / HDMI 终端运行程序。
- NV12 画面偏色、花屏着色器 YUV→RGB 转换矩阵错误,或 UV 平面纹理绑定顺序错误。
- 高 CPU 占用尽量使用 DMA-BUF 零拷贝,避免内存拷贝;不要每次渲染都内存 memcpy 图像。
- 黑屏无画面确认帧率匹配、图像分辨率和纹理尺寸一致;检查 eglSwapBuffers 调用。
七、你可以补充信息,我给你对应落地代码
- 目标:需要独立 C++ ROS2 EGL 预览节点源码,还是 GStreamer 命令行方案?
- 硬件:是否已经连接 HDMI 显示器?
- 需求:是否需要在画面叠加检测框、文字渲染?
