多路 Camera 及与 Lidar 同步
简述
在多路 Camera 接入使 用场景中,为满足算法或应用需求,一般有多路 Camera 同步需要,同时还有与 Lidar 同步的要求,可通过 ETH PPS 等方式进行同步。
S100上 LPWM 模块主要是给 Camera trigger 使用,能提供具有延时输出能力的 PWM 波形,用于校准 sensor 的曝光同步,同时其有多个外部 trigger 源可选,可支持与 MCU 或 GPS 设备时间同步。
本文档主要基于该 LPWM 模块的基本功能,描述其原理与使用方法,提供多路 Camera 与 Lidar 典型场景的同步方案,便于实际项目中参考使用。
本文档只基于一种 Camera 与 Lidar 的硬件连接方案,提供推荐方案作为参考,若使用其他硬件可参考本文档中的配置使用方式自行适配。
硬件通路
LPWM 模块
S100总共有3个 LPWM chip,每个 LPWM chip 下面有4个 LPWM 通道,请根据实际的硬件连接使用配置。
S100的 Camera 同步功能的主体实现依赖 LPWM 模块,其支持 S100多种 trigger 信号源,并产生多通道的可配置 PWM 信号,输出给外部 Camera 使用(可经 SerDes 转发),从而实现 trigger 源与 Camera 的 同步及所有多 Camera 之间的同步。
使用 LPWM 时主要需注意的是:
-
实际硬件连接配置使用的通道。
-
LPWM 的同步触发源选择: 支持 MCU RTC/PPS0/PPS1/ETH PPS0/ETH PPS1/MCU ETH PPS 等。
-
LPWM 基于同步触发源的 offset 偏移配置: 需求根据帧率要求、PPS 周期、相位要求等适配。
-
LPWM 目标信号波形: period,duty_time 等参数。
-
LPWM 的扩展功能: 缓慢同步 threshold,adjust_step 配置。
关于 LPWM 模块的功能及使用,更多可参考: LPWM使用
LPWM 同步源
LPWM 工作原理:LPWM 受 PPS 触发源 trigger,其作为 Trigger Bus 的 Target 侧设备,每个 LPWM 设备可独立配置选择 trigger 源。
收到 PPS 信号传输给 cam-trig 的过程如下图所示,PPS trigger 会连接到 LPWM 模块,触发 LPWM 输出,LPWM 的输出连接到 camera:
关于同步源 PPS 的功能说明,更多可参考: PPS说明
关于 LPWM 的 trigger 源使用,有注意如下:
-
多种外部 trigger 源为多选1,一个 LPWM 模块只能选其中一种使用。
-
不同的 LPWM 间通过外部 trigger 源来同步,选用同一源后可同步。
-
同一 LPWM 模块的不同 channel 使用同一 trigger 源,可配不同的 offset/period/duty 参数。
多路 Camera 同步连接
对于单 S100的 Camera 接入场景,其一般连接方式如下:
其中:
-
S100的 trigger 源可来自外部 GPS 设备,或网络 ETH PPS。
-
MCU 与 S100之间也可同步。
-
同 S100内的不同 LPWM 之间可选同一同步源实现。
-
不同的 DES 可以连接不同的 LPWM 通道。
-
SerDes 可通过 Link 线缆上的反向通道将 LPWM 信号透传到 Sensor 侧,连接为 FSYNC,做同步触发。
与 Lidar 连接配合
在有 Lidar 使用的场景中,有连接方案有如下:
其中:
-
S100的 trigger 源可来自外部 GPS 设备,或通 过网络授时等方式
-
Lidar 设备可以通过相应的授时(如 gPTP)方式,实现与 S100同源时钟对齐
-
Camera 同步是由通过 S100的 LPWM 输出触发给 DES,再分发给各 Camera 实现同步曝光/出图
-
Camera 数据输入到 S100内 CIM 模块时,会在 Frame Start 时刻打上时间戳记录该帧时间。
软件方案
Camera 与 Lidar 时间对齐需求
对于 Camera 与 Lidar 同时使用且有同步对齐的场景,其一般的功能需求有如下:
-
Lidar 与 S100间有时间同步,在同源时间轴上工作;
-
Lidar 可基于同步时间按需求启动周期性扫描,此处以10Hz(100ms 周期)为例,可在整百 ms 处开始扫描。
-
Camera 通过 LPWM 基于同步时间 PPS 作为触发源,触发每帧图像的曝光/读出,实现与 Lidar 扫描时间的对齐,此处以30fs 为例。
-
Camera 图像数据的时间戳需与 Lidar 数据的时间戳在同一时间轴,并有一定的对齐关系,以便融合使用。
其期望的时间对齐目标有如下:
在 PPS 整秒开始: LPWM 输出并曝光(若 offset 设为0)、Lidar 开始扫描(若 start 为0)。
此处软件方案适配上述连接图中实线连接的硬件方案:
-
S100与 Lidar 设备都连接网络交换机,通过网络实现时间同步。
-
Lidar 扫描频率为10Hz,在整百 ms 时刻开始扫描,数据带对齐时间戳。
-
多个 Camera 通过 SerDes 连接 S100,同时接有 LPWM,用于 Camera 的曝光同步的触发。
-
LPWM 的触发源使用 Acore 的 ETH PPS0。
LPWM 触发源选择
LPWM 模块有多种触发源可选,对于上述硬件连接方式,仍可有多种源可以选择,可参考: [LPWM 推荐使用配置]
本方案中使用 Acore ETH PPS0作为 LPWM 的触发源:
-
其与 Lidar 都使用网络同步,可使用 PHC 时间作为统一时间轴。
-
Acore ETH PPS 误差最小,建议优先使用。
对于使用 Acore ETH PPS0同步源,使用 fixed mode 时,其上升沿基于 PPS 整秒时间有一固定偏移536.871ms,需要在使用时按需求进行 offset 计算与配置,更多可参考: Acore ETH PPS说明
Camera 同步模式选择
Sensor 曝光输出一般有 Master 模式(主动曝光输出,按配置,只要开流自动出帧)与 Slave 模式(等待触发曝光输出、需 trigger 后才输出),对于一般运行默认使用 Master 模式运行,而要同步输出则使用 Slave 模式。
以下为 AR0820模组的 Slave 模式说明:以下以 AR0820为例说明。
同样的 slave 模式,还有多种同步方式,其中常用的为 shutter sync: 该模式在 trigger 后固定时间出图(可保证 FS 时间戳对齐),且下不会丢失 trigger 信号(即在出图过程中来了 trigger 信号,不会被忽略)。
配置有如下:
// 参见: source/hobot-camera/drivers/sensor/ar0820/inc/ar0820_setting.h
uint16_t ar0820_trigger_standard_setting[] = {
//0x301A, 0x0058, // RESET_REGISTER_RESET,RESET_REGISTER_STDBY_EOF
0x301A, 0x0958, // RESET_REGISTER_GPI_EN, FORCED_PLL_ON
0x31C6, 0x2000, // MASK_FRAMER_STANDBY
0x30B0, 0x8100, // PIXCLK_ON
0x30CE, 0x0000, // TRIGGER STANDARD MODE
0x30CE, 0x0000, // TRIGGER STANDARD MODE
};
uint16_t ar0820_trigger_shutter_sync_setting[] = {
//0x301A, 0x0058, // RESET_REGISTER_RESET,RESET_REGISTER_STDBY_EOF
0x301A, 0x095C, // RESET_REGISTER_GPI_EN, FORCED_PLL_ON, STREAM
0x31C6, 0x2000, // MASK_FRAMER_STANDBY
0x30B0, 0x8100, // PIXCLK_ON
0x30CE, 0x0120, // TRIGGER SHUTTER SYNC MODE
0x30CE, 0x0120, // TRIGGER SHUTTER SYNC MODE
};
uint16_t ar0820_trigger_gpio_setting[][8] = {
{
0x340A, 0x00EE, // GPIO0_INPUT_ENABLE
0x340A, 0x00EE, // GPIO0_INPUT_ENABLE
0x340C, 0x0002, // GPIO_ISEL
0x340E, 0x2100, // GPIO_OSEL
},
{
0x340A, 0x00DD, // GPIO1_INPUT_ENABLE
0x340A, 0x00DD, // GPIO1_INPUT_ENABLE
0x340C, 0x0008, // GPIO_ISEL
0x340E, 0x2100, // GPIO_OSEL
},
{
0x340A, 0x00BB, // GPIO2_INPUT_ENABLE
0x340A, 0x00BB, // GPIO2_INPUT_ENABLE
0x340C, 0x0020, // GPIO_ISEL
0x340E, 0x2010, // GPIO_OSEL
},
{
0x340A, 0x0077, // GPIO3_INPUT_ENABLE
0x340A, 0x0077, // GPIO3_INPUT_ENABLE
0x340C, 0x0080, // GPIO_ISEL
0x340E, 0x0210, // GPIO_OSEL
},
};
在实际使用时,根据 config_index 的使能同步功能(需要 sensor 库有相应的实现)。
此上仅为 AR0820的示例,其它 Camera 类似,此处 Camera 同步功能主要需配置:
Slave 模式:根据实际需要配置模组的 SYNC 模式。
FSYNC 选择: 根据模组实际硬件连接,选用正常的 GPIO 作为 FSYNC 使用。有的模组包含 ISP,只需要配置好 FSYNC 即可,不需要配置 Sensor 为 Slave 模式。
对于 Camera 的 FSYNC 信号输出,不同的模组可能有不同的特性,如:
-
FSYNC 信号只用于对齐曝光输出,并不能控制帧率,因此 LPWM 的周期需与实际帧率匹配设置。
-
可能是纯 Slave 模式,没有 FSYNC 信号就不出帧,也可能只是用于对齐,就算无 FSYNC 也会出帧。
-
需注意同步模式的选择,是同步曝光,还是同步出图?
-
若为同步曝光,则是曝光时刻同步,曝光完成后直接读图输出,出图时间受曝光时间影响,可能时间戳不完全一致。
-
若为出图同步,即曝光后在指定的同一时刻读图输出,可保证时间戳一致,本方案中使用出图同步方式。
-
不同的模组其曝光时间可能不同,因此在同步完成后输出的时间戳可能不一致。
推荐方案
Camera 与 Lidar 同步对齐方案
基于上述硬件连接与软件方案,有同步方案如下:
-
使用 Acore ETH PPS0触发。
-
Lidar 在整百 ms 时刻开始扫描,数据带对齐时间戳。
-
Camera(以 AR0820为例)使用 SHUTTER SYNC 出图同步,自动曝光。
-
通过 LPWM 的 offset 调整相位整百 ms,如30fps 适配 offset=463.129ms 对33.333ms 取余数=29.8ms。
-
Camera 在经 offset 正确配置后,可在整百 ms(每3帧)同步输出,与 Lidar 数据对齐。
Camera 配置
对于以下为单路 AR0820的同步配置:
{
"deserial_0": {
"deserial_name": "max96712",
"deserial_addr": "0x29",
"deserial_gpio": {
"camerr_pin": [4, 6, 8, 10],
"trig_pin": [5]
},
"poc": {
"poc_addr": "0x28",
"poc_map": "0x1320"
}
},
"port_0": {
"sensor_name": "ar0820std",
"serial_addr": "0x41",
"sensor_addr": "0x11",
"eeprom_addr": "0x51",
"sensor_mode": 5,
"fps": 30,
"width": 3840,
"height": 2160,
"extra_mode": 5,
"config_index": 512,
"deserial_index": 0,
"deserial_port": 0
}
}
此处同步的使能,主要通过 config_index 的 bit9(+512)完成:
{
"config_0":{
"port_0":{
"config_index":512,
},
}
}
Deserial 下的 trig_pin 是对硬件连接上 LPWM 连接的 MFP 索引的配置,需 deserial 库中进行相应的支持,同时在 json 中配置使用:
"deserial_gpio": {
"trig_pin": [5]
},
-
若一路 LPWM 同时触发多路 Camera,则只需配置一个索引值,如 MFP5:[5]。
-
若多路 LPWM 分别触发不同路 Camera,则需配置多个索引值对应多个 Link,如 MFP5-A,MFP14-B:[5,14]。