RDK x5运行vio2encoder示例丢帧问题

根据社区资源和你的日志分析,官方没有直接提供双目的 vio2encoder 示例代码,但你可以通过以下方式实现:

:file_folder: vio2encoder 示例位置

# X5 上的默认路径
/opt/tros/humble/share/hobot_vio/samples/vio2encoder/
# 或
/opt/hobot/samples/vio2encoder/

:wrench: 双目实现方案

方案 1:修改现有单目示例(推荐)

官方 vio2encoder 是单目的,需要修改为双路采集:

// 核心修改点:在 sp_open_camera 中配置两个 camera_id
// 示例伪代码(参考社区案例)

#include "hobot_vio/hbot_vio.h"

// 双目配置结构
sp_camera_config_t cam0_config = {
    .camera_id = 0,      // MIPI CSI0
    .fps = 30,
    .width = 1280,       // 建议先降分辨率测试
    .height = 720,
    .buffer_count = 6    // 减少缓冲区避免溢出
};

sp_camera_config_t cam1_config = {
    .camera_id = 2,      // MIPI CSI2(注意:不是1)
    .fps = 30,
    .width = 1280,
    .height = 720,
    .buffer_count = 6
};

// 分别初始化两个摄像头
sp_open_camera(&cam0_config);
sp_open_camera(&cam1_config);

// 循环获取双路帧
while (running) {
    sp_vio_get_frame(0, &frame0);  // 获取 cam0
    sp_vio_get_frame(2, &frame1);  // 获取 cam1
    
    // 编码处理...
}

方案 2:参考 ROS2 双目实现提取代码

查看 ROS2 包中的双目实现逻辑:

# 查看 mipi_cam 功能包的双目 launch 文件
find /opt/tros -name "*stereo*" -o -name "*dual*" | grep launch

# 查看源码(如果有)
find /opt/tros -name "*.cpp" -o -name "*.c" | xargs grep -l "sp_open_camera" | head -5

方案 3:使用 Python 快速验证

先用 Python 验证双目采集是否正常:

#!/usr/bin/env python3
from hobot_vio import libsrcampy as srcampy
import cv2
import numpy as np

def open_dual_camera():
    # 打开 cam0 (CSI0)
    cam0 = srcampy.Camera()
    ret0 = cam0.open_cam(0, -1, 30, 1280, 720)  # 先降分辨率
    print(f"Cam0 open: {ret0}")
    
    # 打开 cam1 (CSI2)
    cam1 = srcampy.Camera()
    ret1 = cam1.open_cam(2, -1, 30, 1280, 720)
    print(f"Cam1 open: {ret1}")
    
    if ret0 != 0 or ret1 != 0:
        print("Failed to open dual cameras")
        return
    
    # 同时获取双路帧
    while True:
        img0 = cam0.get_img(2, 1280, 720)
        img1 = cam1.get_img(2, 1280, 720)
        
        if img0 and img1:
            # 转换为 BGR 显示
            nv12_0 = np.frombuffer(img0, dtype=np.uint8).reshape(720*3//2, 1280)
            nv12_1 = np.frombuffer(img1, dtype=np.uint8).reshape(720*3//2, 1280)
            
            bgr0 = cv2.cvtColor(nv12_0, cv2.COLOR_YUV2BGR_NV12)
            bgr1 = cv2.cvtColor(nv12_1, cv2.COLOR_YUV2BGR_NV12)
            
            cv2.imshow("Cam0", bgr0)
            cv2.imshow("Cam1", bgr1)
            
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
    cam0.close_cam()
    cam1.close_cam()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    open_dual_camera()

:pushpin: 关键配置点

根据你的 dmesg 日志:

  • cam0vin mipi0 (CSI0)
  • cam1vin mipi2 (CSI2)

camera_id 对应关系

CSI0 → camera_id = 0
CSI2 → camera_id = 2  // 注意不是 1!

:bullseye: 立即可执行的步骤

# 1. 先运行 Python 双目测试(验证硬件)
python3 dual_cam_test.py

# 2. 如果不丢帧,再修改 C++ vio2encoder 示例
cd /opt/tros/humble/share/hobot_vio/samples/vio2encoder/
cp -r . ~/my_vio2encoder_dual/
cd ~/my_vio2encoder_dual/

# 3. 修改配置文件或源码中的 camera_id 和分辨率
# 将 1920x1080 改为 1280x720
# 添加第二个摄像头的初始化代码

# 4. 编译运行
mkdir build && cd build
cmake ..
make -j4
./vio2encoder

:books: 相关资源

建议:先用 Python 脚本验证 720p@30fps 双目是否稳定,确认后再移植到 C++ vio2encoder 示例中。如果 Python 测试也丢帧,说明是带宽/驱动层问题,需要进一步调整 CSI 配置。