RDK X5连接两路mipi摄像头与一路usb摄像头问题

:bullseye: 问题结论

这是典型的 MIPI CSI 通道资源冲突 问题。单个摄像头能工作说明硬件和驱动基本正常,但同时工作时出现冲突。

根据社区案例(#34254#31123),这类问题通常由以下原因导致:

原因 概率 解决方案
CSI 通道配置冲突 检查设备树 vcon 配置
I2C 地址相同 确认两路在不同 I2C 总线
电源/时钟资源不足 检查供电和 MCLK 配置
非官方模组兼容性 使用单路节点分别启动

:hammer_and_wrench: 诊断步骤

步骤 1:确认两路摄像头的 CSI 通道和 I2C 总线

# 查看设备树中的摄像头配置
ls -la /proc/device-tree/soc/cam/

# 查看 vcon@0 和 vcon@2 的配置
cat /proc/device-tree/soc/cam/vcon@0/status
cat /proc/device-tree/soc/cam/vcon@2/status

# 查看 I2C 总线上的设备
i2cdetect -y 4  # CSI 2 通常对应 I2C bus 4
i2cdetect -y 6  # CSI 0 通常对应 I2C bus 6

步骤 2:查看两路摄像头的硬件连接

# 查看 MIPI 通道分配
dmesg | grep -i "mipi rx phy\|csi"

# 查看传感器检测日志
dmesg | grep -i "vp_sensor_detect\|sensor_name"

步骤 3:检查摄像头型号和配置

# 告知以下信息:
# 1. 两个 MIPI 摄像头的具体型号(如 IMX219、SC132GS、SC230AI 等)
# 2. 摄像头连接的物理接口位置(CSI 0 还是 CSI 2)
# 3. 是否是官方模组还是第三方模组

:wrench: 解决方案

方案 1:分别启动两个单路节点(最推荐)

不要使用双目启动脚本,而是分别启动两个独立的单路节点:

# 终端 1 - 启动第一路摄像头(CSI 0)
cd /usr/local/mipi_test
bash run_cam.sh --channel 0 --rotation 0.0 --log_level INFO

# 终端 2 - 启动第二路摄像头(CSI 2)
cd /usr/local/mipi_test
bash run_cam.sh --channel 2 --rotation 0.0 --log_level INFO

或使用 ROS2:

# 终端 1
ros2 launch mipi_cam mipi_cam.launch.py channel:=0 camera_name:=cam0

# 终端 2
ros2 launch mipi_cam mipi_cam.launch.py channel:=2 camera_name:=cam1

方案 2:检查并修改设备树配置

如果上述方案仍失败,可能需要调整设备树:

# 查看当前设备树配置
cat /proc/device-tree/soc/cam/vcon@0/compatible
cat /proc/device-tree/soc/cam/vcon@2/compatible

# 检查是否有 status = "disabled"
cat /proc/device-tree/soc/cam/vcon@0/status
cat /proc/device-tree/soc/cam/vcon@2/status

方案 3:错开初始化时间

如果存在资源竞争,可以尝试错开初始化:

# 终端 1
bash run_cam.sh --channel 0 --rotation 0.0 --log_level INFO

# 等待 3 秒后,终端 2
sleep 3 && bash run_cam.sh --channel 2 --rotation 0.0 --log_level INFO

方案 4:使用 VIO API 直接访问

# Python 示例
from hobot_vio import Vio
import time

# 打开第一路
vio0 = Vio()
vio0.open(channel=0)
vio0.start()

# 稍等片刻再打开第二路
time.sleep(1)

vio1 = Vio()
vio1.open(channel=2)
vio1.start()

# 获取图像
while True:
    frame0 = vio0.get_frame()
    frame1 = vio1.get_frame()

:clipboard: 关键排查点

1. 确认两个摄像头连接在不同的 CSI 通道

CSI 0 → 通常对应 channel 0
CSI 2 → 通常对应 channel 2

不能将两个摄像头连接到同一个 CSI 通道。

2. 确认 I2C 地址不冲突

  • 两个摄像头应在不同的 I2C 总线
  • 如果都在同一总线且地址相同(如都是 0x30),会冲突

3. 确认供电充足

  • 两个摄像头同时工作时,检查电源是否稳定
  • 使用 dmesg | grep -i "power\|voltage" 查看是否有供电警告

4. 确认模组兼容性

根据社区案例 #34254非官方双目模组可能存在兼容性问题:

  • 官方模组:SC132GS 双目模组(已适配)
  • 第三方模组:可能需要自行配置设备树和驱动

:memo: 请提供以下信息以便进一步诊断

# 1. 两个摄像头的型号
echo "Camera 1: ????"
echo "Camera 2: ????"

# 2. 设备树配置
ls -la /proc/device-tree/soc/cam/

# 3. I2C 检测结果
i2cdetect -y 4
i2cdetect -y 6

# 4. 传感器检测日志
dmesg | grep -i "vp_sensor_detect\|sensor_name" | tail -20

# 5. 系统版本
cat /etc/os-release
dpkg -l | grep -i "tros\|mipi"

:books: 相关资源


:light_bulb: 临时建议

如果急需使用两个摄像头,可以先:

  1. 分别启动两个单路节点(方案 1)
  2. USB 摄像头单独用 OpenCV 访问/dev/video*
  3. MIPI 摄像头用官方接口访问(不要用 cv2.VideoCapture

请提供上述诊断命令的输出,我可以帮您进一步分析具体是哪种冲突导致的。