一、硬件基础说明
RDK X5 内置2 组完全独立 D-PHY 4Lane CSI-2:
- CSI0(通道 ID=0,I2C6 总线):第一路 4Lane,总带宽 10Gbps
- CSI1(通道 ID=2,I2C7 总线):第二路 4Lane,总带宽 10Gbps 两路硬件 PHY、ISP 通路、I2C 控制总线完全分离,总带宽 20Gbps,互不抢占资源,支持双目同步采集、双 4K@30fps 同时运行。 每路接口完整信号:4 组 DP/DN 差分数据线 + I2C_SDA/SCL + RST_N/PWDN 控制脚 + 传感器供电。
硬件接线规范
- 两路 FPC 排线分别插入板载2 个 22Pin CSI 插座;排线金属接触面朝向卡扣外侧;
- 严禁热插拔摄像头,上电插拔极易烧毁 Sensor;
- 双路摄像头I2C 地址不能相同:CSI0 走 i2c-6,CSI1 走 i2c-7,硬件模组需切换寄存器地址,否则总线冲突无法识别;
- 供电:两路 Sensor 1.8V IO、模拟供电独立,避免压降导致花屏。
二、第一步:硬件识别与驱动验证
1. 检测 I2C 是否识别两路 Sensor
bash
运行
# CSI0 I2C总线6 i2cdetect -y 6 # CSI1 I2C总线7 i2cdetect -y 7两条总线都能读到摄像头地址才算硬件接线正常。
2. 查看 CSI 驱动加载日志
bash
运行
# 查看MIPI、Sensor初始化日志 dmesg | grep -E "csi|vcon|sensor|imx|sc" # 查看视频设备节点,两路MIPI会生成/dev/video0、/dev/video2 ls /dev/video* # 查看媒体拓扑链路 media-ctl -p正常输出:vcon@0(CSI0)、vcon@2(CSI1)两个独立视频控制器。
三、第二步:设备树配置(双 4Lane 启用核心)
RDK X5双路相机必须在设备树同时打开csi0、csi1节点,绑定对应 Sensor 驱动、I2C 总线、4Lane 参数。
1. 备份并反编译 dtb
bash
运行
# 备份原厂设备树 sudo cp /boot/hobot/x5-rdk.dtb /boot/hobot/x5-rdk.dtb.bak # 安装编译工具 sudo apt install device-tree-compiler # 反编译 dtc -I dtb -O dts -o x5-rdk.dts /boot/hobot/x5-rdk.dtb2. 修改双 CSI 节点配置示例(IMX477 4Lane)
dts
&csi0 { status = "okay"; i2c-bus = <&i2c6>; >双 4Lane 采集(底层高性能,推荐算法开发)核心规则:
- CSI0 camera_id = 0
- CSI1 camera_id = 2
- 两路独立创建采集句柄,4Lane 模式带宽自动拉满 10Gbps / 路
极简双路采集伪代码
c
运行
#include "hobot_vio.h" #include <stdio.h> // CSI0 4Lane配置 4K@30 sp_camera_config_t cfg0 = { .camera_id = 0, .width = 3840, .height = 2160, .fps = 30, .lane_num = 4, // 启用4Lane .buffer_count = 8 }; // CSI1 4Lane配置 sp_camera_config_t cfg1 = { .camera_id = 2, .width = 3840, .height = 2160, .fps = 30, .lane_num = 4, .buffer_count = 8 }; int main(){ // 打开两路4Lane相机 int fd0 = sp_open_camera(&cfg0); int fd1 = sp_open_camera(&cfg1); while(1){ // 读取左目CSI0图像 sp_frame_t frame0; sp_get_frame(fd0, &frame0); // 读取右目CSI1图像 sp_frame_t frame1; sp_get_frame(fd1, &frame1); // 此处对接DNN推理、编码逻辑 printf("CSI0帧、CSI1帧获取成功\n"); // 释放buffer sp_release_frame(fd0, &frame0); sp_release_frame(fd1, &frame1); } sp_close_camera(fd0); sp_close_camera(fd1); return 0; }
编译运行:官方示例路径/opt/hobot/samples/vio_capture修改为双 camera_id 即可。
方案 3:ROS2 TogetheROS双目工程(机器人量产首选)
官方mipi_cam包支持双 4Lane 并行启动,分开话题避免冲突。
1)双路独立启动(最稳定,无同步时序问题)
bash
运行
# 终端1:CSI0左目4Lane,话题/image_left source /opt/tros/humble/local_setup.bash ros2 launch mipi_cam mipi_cam.launch.py channel:=0 camera_name:=left width:=3840 height:=2160 lane:=4 # 终端2:CSI1右目4Lane,话题/image_right ros2 launch mipi_cam mipi_cam.launch.py channel:=2 camera_name:=right width:=3840 height:=2160 lane:=4
2)一键双目 launch 文件 dual_4lane.launch.py
python
运行
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): cam0 = Node( package="mipi_cam", executable="mipi_cam_node", name="cam0_4lane", parameters=[{ "channel": 0, "width": 3840, "height": 2160, "fps": 30, "lane": 4, "pub_topic": "/image_left" }] ) cam1 = Node( package="mipi_cam", executable="mipi_cam_node", name="cam1_4lane", parameters=[{ "channel": 2, "width": 3840, "height": 2160, "fps": 30, "lane": 4, "pub_topic": "/image_right" }] ) return LaunchDescription([cam0, cam1])
启动命令:
bash
运行
ros2 launch your_pkg dual_4lane.launch.py # 查看两路图像话题 ros2 topic list | grep image
五、4Lane 使用带宽与性能说明
- 单路 4Lane 上限 10Gbps,可稳定跑4K RAW10@30fps;
- 两路同时 4Lane 总带宽 20Gbps,双 4K 无丢帧、无花屏;
- 若只用 1/2Lane:修改
data-lanes = <2>、lane:=2,带宽减半,适合 1080P 低功耗场景; - ISP 硬件两路独立图像处理,降噪、去拜耳、缩放硬件加速,不占用 CPU。
六、常见踩坑与解决
- 只能识别一路相机,另一路无 /dev/video
- I2C 地址冲突:两路 Sensor 必须修改硬件地址,CSI0=i2c6、CSI1=i2c7 分开总线;
- 设备树
csi1节点 status 未设为 okay、lane 数量配置错误。
- 4K 画面花屏、横纹、丢帧
- 未开启 4Lane,只用 2Lane 带宽不足;设备树
data-lanes=<4>; - FPC 排线差分不等长、接触不良,更换高品质短排线;
- Sensor 供电纹波大,增加滤波电容。
- 双路启动帧率暴跌
- 缓冲区 buffer_count 过小,调高至 6~8; 降低 ISP 降噪、锐化负载,关闭多余后处理。
- ROS 双路启动话题覆盖冲突 必须通过
pub_topic参数分开左右目话题,禁止共用/image。
七、典型应用场景
- 双目立体视觉(CSI0 左、CSI1 右,两路 4Lane 同步测距);
- 双路 4K 缺陷检测,左右工位独立采集;
- 360 环视双路高清摄像头,MIPI 带宽独立不占用 USB 资源。