问题结论
这是典型的 MIPI CSI 通道资源冲突 问题。单个摄像头能工作说明硬件和驱动基本正常,但同时工作时出现冲突。
根据社区案例(#34254、#31123),这类问题通常由以下原因导致:
| 原因 | 概率 | 解决方案 |
|---|---|---|
| CSI 通道配置冲突 | 高 | 检查设备树 vcon 配置 |
| I2C 地址相同 | 高 | 确认两路在不同 I2C 总线 |
| 电源/时钟资源不足 | 中 | 检查供电和 MCLK 配置 |
| 非官方模组兼容性 | 中 | 使用单路节点分别启动 |
诊断步骤
步骤 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. 是否是官方模组还是第三方模组
解决方案
方案 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()
关键排查点
1. 确认两个摄像头连接在不同的 CSI 通道
CSI 0 → 通常对应 channel 0
CSI 2 → 通常对应 channel 2
不能将两个摄像头连接到同一个 CSI 通道。
2. 确认 I2C 地址不冲突
- 两个摄像头应在不同的 I2C 总线上
- 如果都在同一总线且地址相同(如都是 0x30),会冲突
3. 确认供电充足
- 两个摄像头同时工作时,检查电源是否稳定
- 使用
dmesg | grep -i "power\|voltage"查看是否有供电警告
4. 确认模组兼容性
根据社区案例 #34254,非官方双目模组可能存在兼容性问题:
- 官方模组:SC132GS 双目模组(已适配)
- 第三方模组:可能需要自行配置设备树和驱动
请提供以下信息以便进一步诊断
# 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"
相关资源
临时建议
如果急需使用两个摄像头,可以先:
- 分别启动两个单路节点(方案 1)
- USB 摄像头单独用 OpenCV 访问(
/dev/video*) - MIPI 摄像头用官方接口访问(不要用
cv2.VideoCapture)
请提供上述诊断命令的输出,我可以帮您进一步分析具体是哪种冲突导致的。