根据社区资源和你的日志分析,官方没有直接提供双目的 vio2encoder 示例代码,但你可以通过以下方式实现:
vio2encoder 示例位置
# X5 上的默认路径
/opt/tros/humble/share/hobot_vio/samples/vio2encoder/
# 或
/opt/hobot/samples/vio2encoder/
双目实现方案
方案 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()
关键配置点
根据你的 dmesg 日志:
- cam0 →
vin mipi0(CSI0) - cam1 →
vin mipi2(CSI2)
camera_id 对应关系:
CSI0 → camera_id = 0
CSI2 → camera_id = 2 // 注意不是 1!
立即可执行的步骤
# 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
相关资源
- 多目 MIPI 相机取流教程 - RDK X3 但原理相通
- 如何调用双目相机模组 - Python 示例
- VIO API 打开 MIPI 双目 - 配置讨论
建议:先用 Python 脚本验证 720p@30fps 双目是否稳定,确认后再移植到 C++ vio2encoder 示例中。如果 Python 测试也丢帧,说明是带宽/驱动层问题,需要进一步调整 CSI 配置。