一、硬件基础说明

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 控制脚 + 传感器供电。

硬件接线规范

  1. 两路 FPC 排线分别插入板载 2 个 22Pin CSI 插座;排线金属接触面朝向卡扣外侧;
  2. 严禁热插拔摄像头,上电插拔极易烧毁 Sensor;
  3. 双路摄像头I2C 地址不能相同:CSI0 走 i2c-6,CSI1 走 i2c-7,硬件模组需切换寄存器地址,否则总线冲突无法识别;
  4. 供电:两路 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 双路相机必须在设备树同时打开csi0csi1节点,绑定对应 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.dtb

2. 修改双 CSI 节点配置示例(IMX477 4Lane)

dts

&csi0 {
    status = "okay";
    i2c-bus = <&i2c6>;
    data-lanes = <4>; // 启用完整4Lane
    cam_left: camera@1a {
        compatible = "imx477";
        reg = <0x1a>; // CSI0摄像头I2C地址
        rst-gpio = <&gpio RST_PIN GPIO_ACTIVE_LOW>;
        pwdn-gpio = <&gpio PWDN_PIN GPIO_ACTIVE_HIGH>;
        status = "okay";
    };
};

&csi1 {
    status = "okay";
    i2c-bus = <&i2c7>;
    data-lanes = <4>; // 第二路同样4Lane
    cam_right: camera@1b {
        compatible = "imx477";
        reg = <0x1b>; // CSI1地址与左目区分开
        rst-gpio = <&gpio RST2_PIN GPIO_ACTIVE_LOW>;
        pwdn-gpio = <&gpio PWDN2_PIN GPIO_ACTIVE_HIGH>;
        status = "okay";
    };
};

3. 重新编译并重启生效

bash

运行

dtc -I dts -O dtb -o x5-rdk.dtb x5-rdk.dts
sudo cp x5-rdk.dtb /boot/hobot/x5-rdk.dtb
sudo reboot

四、三种开发使用方案(从简易到工程量产)

方案 1:命令行 V4L2 单路调试(验证 4Lane 带宽)

CSI0(4Lane 4K)采集预览

bash

运行

# 设置4K NV12格式,采集并保存yuv
v4l2-ctl -d /dev/video0 --set-fmt-video width=3840,height=2160,pixelformat=NV12
v4l2-ctl -d /dev/video0 --stream-to=/tmp/cam0.yuv --stream-count=30
# 实时预览推HDMI
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=3840,height=2160,format=NV12 ! videoconvert ! kmssink
CSI1 同步测试

bash

运行

gst-launch-1.0 v4l2src device=/dev/video2 ! video/x-raw,width=3840,height=2160,format=NV12 ! videoconvert ! queue ! kmssink plane-id=1

方案 2:官方 C 库 hobot_vio 双 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 使用带宽与性能说明

  1. 单路 4Lane 上限 10Gbps,可稳定跑 4K RAW10@30fps
  2. 两路同时 4Lane 总带宽 20Gbps,双 4K 无丢帧、无花屏;
  3. 若只用 1/2Lane:修改data-lanes = <2>lane:=2,带宽减半,适合 1080P 低功耗场景;
  4. ISP 硬件两路独立图像处理,降噪、去拜耳、缩放硬件加速,不占用 CPU。

六、常见踩坑与解决

  1. 只能识别一路相机,另一路无 /dev/video
    • I2C 地址冲突:两路 Sensor 必须修改硬件地址,CSI0=i2c6、CSI1=i2c7 分开总线;
    • 设备树csi1节点 status 未设为 okay、lane 数量配置错误。
  2. 4K 画面花屏、横纹、丢帧
    • 未开启 4Lane,只用 2Lane 带宽不足;设备树data-lanes=<4>
    • FPC 排线差分不等长、接触不良,更换高品质短排线;
    • Sensor 供电纹波大,增加滤波电容。
  3. 双路启动帧率暴跌
    • 缓冲区 buffer_count 过小,调高至 6~8; 降低 ISP 降噪、锐化负载,关闭多余后处理。
  4. ROS 双路启动话题覆盖冲突 必须通过pub_topic参数分开左右目话题,禁止共用/image

七、典型应用场景

  1. 双目立体视觉(CSI0 左、CSI1 右,两路 4Lane 同步测距);
  2. 双路 4K 缺陷检测,左右工位独立采集;
  3. 360 环视双路高清摄像头,MIPI 带宽独立不占用 USB 资源。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐