2. Jetson硬件与摄像头接口基础

在 Jetson 上做多摄像头同步采集,第一步不是写代码,而是把“摄像头到内存”的整条硬件通路搞清楚。Jetson 的摄像头子系统并不是一个简单的“USB 插上就能读”的结构,而是一条由物理接口、串行链路、接收控制器、图像信号处理器和内存写入单元组成的流水线。只有知道每一级叫什么、负责什么、瓶颈在哪里,后面做多路同步、时间戳对齐和标定时才不会“盲调”。

一、从传感器到内存:一条完整的数据通路

以最常见的 MIPI CSI-2 摄像头为例,数据从传感器出发,依次经过以下关键模块:

  • Sensor(图像传感器):输出 RAW、YUV 或 RGB 数据,通过 MIPI D-PHY 或 C-PHY 物理层发送。
  • CSI-2 协议层:把图像打包成 CSI-2 数据包,包含帧起始(FS)、帧结束(FE)、行起始(LS)、行结束(LE)等短包,以及像素数据长包。
  • NVCSI:Jetson 内部的 MIPI CSI 接收控制器,负责解析 CSI-2 数据包、做通道对齐(Lane Alignment)、错误检测(ECC/CRC),并把数据交给 VI。
  • VI(Video Input):视频输入模块,负责把 NVCSI 送来的像素流按格式写入内存,同时生成帧缓冲、处理裁剪、缩放等基础操作。
  • ISP(Image Signal Processor):对 RAW 数据做去马赛克、白平衡、降噪、Gamma、色彩校正等处理,输出可用的 YUV/RGB 图像。
  • 内存(DMA Buffer):最终图像以帧缓冲形式落在系统内存中,供应用层读取。

这条通路可以用下面的结构图表示。注意:ISP 并不是所有路径都必经——如果传感器直接输出 YUV,VI 可以绕过 ISP 直接写内存;如果输出 RAW,则必须经过 ISP 才能得到可显示图像。

Sensor RAW / YUV MIPI D-PHY C-PHY 可选 1/2/4 lane CSI-2 协议 FS/FE/LS/LE ECC / CRC NVCSI Lane 对齐 错误检测 VI 写内存 裁剪/缩放 ISP 去马赛克 白平衡/降噪 内存 DMA Buffer 帧缓冲 RAW 路径 YUV 直通 带宽约束核心公式: 单路带宽 ≈ 分辨率宽 × 高 × 帧率 × 每像素比特数 × 开销系数(≈1.1~1.2) → 多路求和必须 ≤ 平台 CSI/VI/内存总带宽

二、CSI-2、GMSL、USB 三种接口的定位差异

Jetson 上常见的摄像头接入方式有三类,它们的适用场景和约束完全不同:

接口类型 典型线缆长度 同步能力 多路扩展 适用场景
MIPI CSI-2 通常 < 30 cm 依赖传感器外部触发 受限于 Jetson CSI 通道数 短距离、高带宽、板载模组
GMSL2 / GMSL3 可达 10~15 m 支持硬件同步触发 通过解串器多路聚合 车载、机器人、长距离多路
USB 3.x 可达 3~5 m 软件时间戳,同步弱 受 USB 控制器带宽限制 快速验证、低同步要求

需要特别注意的是:GMSL 并不是直接接到 Jetson 的 CSI 接口上,而是通过解串器(Deserializer)把多路 GMSL 信号转换成 MIPI CSI-2,再送入 NVCSI。因此 GMSL 方案的本质是“延长线 + 聚合”,最终仍然受 Jetson CSI/VI 带宽约束。

三、MIPI 通道数与带宽计算

MIPI CSI-2 的带宽由 lane 数量和每 lane 速率决定。以 Jetson Orin 系列为例,单个 CSI 端口通常支持 1/2/4 lane,D-PHY 每 lane 速率可达 2.5 Gbps 左右(具体以模块手册为准)。计算单路摄像头所需带宽的示例:

示例:1920×1080 @ 30fps,RAW10 格式
每像素比特数 = 10 bit
单帧像素数 = 1920 × 1080 = 2,073,600
单帧数据量 = 2,073,600 × 10 / 8 = 2,592,000 Byte ≈ 2.47 MB
每秒数据量 = 2.47 MB × 30 ≈ 74.2 MB/s ≈ 593 Mbps
考虑 CSI-2 协议开销(约 1.15 倍)≈ 682 Mbps

若使用 2 lane @ 1.5 Gbps/lane,总带宽 = 3.0 Gbps > 682 Mbps,满足。
若使用 1 lane @ 1.5 Gbps,总带宽 = 1.5 Gbps > 682 Mbps,也满足但余量较小。

多路场景下,必须把所有摄像头的带宽求和,再与平台总带宽比较。例如 4 路 1080p30 RAW10,总需求约 2.73 Gbps,若 Jetson 的 CSI 总带宽为 6 Gbps 以上,则余量充足;但如果同时还要跑 ISP 和 VI 写内存,内存带宽也会成为瓶颈。

四、ISP、VI、NVCSI 的职责边界

很多初学者会把这三个模块混在一起,实际上它们的职责非常清晰:

  • NVCSI:只负责“收包和校验”,不改变图像内容。它把 CSI-2 的 lane 数据对齐成像素流,检测传输错误。如果 NVCSI 报错,通常是线缆、lane 映射或时钟问题。
  • VI:负责“搬运和基础格式转换”。它把 NVCSI 的输出按指定格式写入内存,支持裁剪、缩放、像素格式转换。VI 不负责图像质量增强。
  • ISP:负责“图像质量”。去马赛克、白平衡、降噪、Gamma、色彩矩阵等都在这里完成。只有 RAW 数据才需要 ISP;YUV 数据可以绕过 ISP 直接由 VI 写内存。
在 Jetson 上,ISP 通常由硬件单元(如 Orin 的 ISP)或软件库(如 Argus)驱动。使用 nvargus-daemon 时,RAW 摄像头会自动走 ISP 路径;如果使用 V4L2 直接抓取,可能拿到的是未处理的 RAW 数据,需要自行处理。

五、实际配置中的关键检查点

当你把摄像头接到 Jetson 后,建议按以下顺序确认通路是否正常:

  1. 用 dmesg | grep -i csi 或 dmesg | grep -i nvcsi 查看 NVCSI 是否识别到传感器,是否有 lane 对齐错误。
  2. 用 v4l2-ctl --list-devices 确认 VI 是否创建了 video 节点。
  3. 用 v4l2-ctl --list-formats-ext -d /dev/video0 查看支持的格式和分辨率,确认是 RAW 还是 YUV。
  4. 如果是 RAW,确认 ISP 是否被正确加载;如果是 YUV,确认 VI 是否直接输出。
  5. 用 v4l2-ctl --stream-mmap --stream-count=30 -d /dev/video0 做一次简单抓流,观察是否有丢帧或超时。
多路采集时,不要只看单路能否出图。必须同时打开所有摄像头,观察总带宽是否溢出。常见现象是:单路正常,多路时某几路开始丢帧、时间戳跳变或 NVCSI 报 CRC 错误。此时应降低分辨率、帧率或像素位深,或减少同时工作的路数。