[具身智能-603]:RDK X5 两路独立 4-Lane MIPI CSI 完整使用教程
·
一、硬件基础说明
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.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 使用带宽与性能说明
- 单路 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 供电纹波大,增加滤波电容。
- 未开启 4Lane,只用 2Lane 带宽不足;设备树
- 双路启动帧率暴跌
- 缓冲区 buffer_count 过小,调高至 6~8; 降低 ISP 降噪、锐化负载,关闭多余后处理。
- ROS 双路启动话题覆盖冲突 必须通过
pub_topic参数分开左右目话题,禁止共用/image。
七、典型应用场景
- 双目立体视觉(CSI0 左、CSI1 右,两路 4Lane 同步测距);
- 双路 4K 缺陷检测,左右工位独立采集;
- 360 环视双路高清摄像头,MIPI 带宽独立不占用 USB 资源。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)