激光雷达与相机标定的时间戳同步问题

作者 | Range  编辑 | 古月居

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

后台回复【相机标定】获取超详细的单目双目相机模型介绍、内外参标定算法原理视频!

相机和激光雷达之间的时间戳同步问题一直是实时跑SLAM的先决条件。本文试图以最清晰的思路去讲明白这个事情。

开始本文之前,先介绍几个基本概念。

相机特性-曝光和读出

相机获取一帧图像分为曝光和读出两个阶段。相机使用的传感器不同,相机的曝光时间和读出时间的重叠关系也有所不同,分为交叠曝光非交叠曝光两种。交叠曝光和非交叠曝光相比,交叠曝光可以减少曝光时间对出图时间的影响。

非交叠曝光是指当前帧的曝光和读出都完成后,再进行下一帧的曝光和读出。非交叠曝光帧周期大于曝光时间与帧读出时间的和。

b4bf93033e64002d631d71ad3c267029.png

内触发模式非交叠曝光

交叠曝光是指当前帧的曝光和前一帧的读出过程有重叠,即前一帧读出的同时,下一帧已经开始曝光。交叠曝光帧周期小于等于曝光时间与帧读出时间的和。

33174fb2418411f50996017d1c52d2cb.png

内触发模式交叠曝光

对!上一段就是为了告诉你:后文叙述中无论当前帧曝光时间和上一帧的读出时间是否重叠都不要惊讶。

图像采集:触发模式(外部输入)

相机的触发模式分为内触发模式和外触发模式 2 种。

  • 内触发模式:相机通过设备内部给出的信号采集图像。

  • 外触发模式:相机通过外部给出的信号采集图像。外部信号可以是软件信号,也可以是硬件信号,主要包含软触发和硬件触发。外触发模式如图:

23fb2cc1a57526d7c57d9b561b34ea7e.png

外触发模式

软触发:触发信号由软件发出(也可以利用相机SDK提供的API接口进行软触发)。

硬件触发:外部设备通过相机的 I/O 接口与相机进行连接,触发脉冲信号由外部设备给到相机进行采图。其实是直接对相机内部寄存器进行读写。下图是海康相机的电源IO的6-pin线缆:

871d808b39973cb3c731092bfa17cea8.jpeg

812628d363278a0b3d8de35ec187360f.jpeg

8ad6b5da761db61a66aff1c81d6a588e.jpeg

海康相机电源及IO接口(6-pin Hirose)

其中,海康相机有1个光耦隔离输入Line0+,1个可配置输入输出Line2+,可选择一个配置为输入信号。

 触发输出

相机触发输出信号为开关信号,可用于控制报警灯、光源、PLC等外部设备。触发输出信号可通过Strobe 信号实现。

相机的曝光发生时,会立即输出一个Strobe信号,该信号为高电平有效。后文我们主要使用该信号对Lidar等其他传感器进行硬触发。这里有一个Strobe的预输出的概念。

Strobe信号早于曝光生效。其工作原理为延迟曝光先进行Strobe输出。该功能可应用于响应比较慢的外部设备。Strobe预输出时序如图所示。(后面会讲为啥要延迟曝光)

d5e6b6cc172fe1599d3a01655253cceb.png

Strobe信号预输出时序

现在我们回到正题吧,现在讲起来就很快了。

要同步相机和激光雷达的时间戳主要有三个方式,硬触发、软触发、软触发+硬触发。下面我以手绘示意图的形式一一介绍。

先说硬触发吧。一个MCU产生脉冲信号对三个传感器设备进行硬触发。

2efbe874f1079e11a024186379c39dd2.jpeg

对于软触发+硬触发来说,可以先用相机SDK的API对一个相机进行软触发,然后利用相机的外触发信号Strobe对雷达和相机等其他传感器进行硬触发。

9b9a0984f26b322e083f7920b588f436.jpeg

这里需要注意一个问题,如果进行软触发的第一个相机在曝光的同时发出Strobe信号,其他被硬触发的传感器总归是晚了一步,不能完全同步。因此引出了之前Strobe的预输出的概念,即先进行Strobe输出再延迟曝光。

配置该模式时注意四点:

1.上升沿or下降沿的触发方式;

2.有效电平宽度,电平幅值,你要知道能触发Lidar的最低幅值;

3.Strobe预输出

4.两边电平信号是否一样,3v or 5v是否需要升压...

最后讲讲不被推荐的软触发。

首先调用API操作相比于硬触发(对传感器内部寄存器直接进行读写操作)明显是慢了,执行第二句命令API(2)前API(1)就已经花了些时间。

//读取lidar和image数据的线程1
while(1)
{
API(1); //软触发第一个sensor
API(2); //软触发第二个sensor
//假设脉冲周期为0.5s
}
//处理数据线程2
for(i=0;i<nimage;i++)
{  
    t1 = getTickCount();
//部分程序有互斥锁
    t2 = getTickCount();
    Time = (t2 - t1) / getTickFrequency(); //当前帧处理时间
    sleep(1/fps-Time);
}

如上图示意,如果处理单帧数据的时间超过0.5s,线程1就会读到下一帧数据,就会导致线程2数据混乱。因此线程2单帧处理时间需要小于0.5s,且每帧需要等待(1/fps-当前帧处理时间)。

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、规划控制、模型部署落地、自动驾驶仿真测试、硬件配置、AI求职交流等方向;

加入我们:自动驾驶之心技术交流群汇总!

自动驾驶之心【知识星球】

想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球(三天内无条件退款),日常分享论文+代码,这里汇聚行业和学术界大佬,前沿技术方向尽在掌握中,期待交流!

c519e9dbbd05fe2151183589c2bd52d9.jpeg

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值