登录
首页 >  科技周边 >  人工智能

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

来源:51CTO.COM

时间:2023-05-18 10:10:13 489浏览 收藏

有志者,事竟成!如果你在学习科技周边,那么本文《一文聊聊激光雷达与相机标定的时间戳同步问题》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

01 相机特性-曝光和读出

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

叠曝光和非交叠曝光相比,交叠曝光可以减少曝光时间对出图时间的影响。

"Non-overlapping exposure" refers to conducting the exposure and readout of the current frame completely before initiating the exposure and readout of the next frame.。非交叠曝光帧周期大于曝光时间与帧读出时间的和。

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

内触发模式非交叠曝光

“交叠曝光”是指在当前帧进行曝光时,同时进行前一帧的读出过程,即下一帧已经开始曝光,从而出现的重叠现象。交叠曝光帧周期小于等于曝光时间与帧读出时间的和。

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

内触发模式交叠曝光

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

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

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

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

外触发模式:相机通过外部给出的信号采集图像。可以通过软触发或硬件触发来产生外部信号,它们可以是软件信号也可以是硬件信号。外触发模式如图:

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

外触发模式

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

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

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

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

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

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

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

03 触发输出

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

当相机的曝光发生时,会立即发出一个高电平有效的Strobe信号。后文我们主要使用该信号对Lidar等其他传感器进行硬触发。这里有一个Strobe的预输出的概念。Strobe信号早于曝光生效。其工作原理为延迟曝光先进行Strobe输出。该功能可应用于响应比较慢的外部设备。Strobe预输出时序如图所示。(后面会讲为啥要延迟曝光)。

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

Strobe信号预输出时序

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

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

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

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

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

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

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

配置该模式时注意四点:

  1. 上升沿 or 下降沿的触发方式;
  2. 有效电平宽度,电平幅值,你要知道能触发 Lidar 的最低幅值;
  3. Strobe 预输出;
  4. 两边电平信号是否一样,3v or 5v 是否需要升压;

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

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

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

如果处理一帧数据所需时间超过0.5秒,线程1会读取下一帧数据,从而导致线程2的数据出现混乱。因此线程2需要在处理每一帧之前等待剩余时间(1/fps-当前帧处理时间),并保证单帧处理时间小于0.5秒。

以上就是《一文聊聊激光雷达与相机标定的时间戳同步问题》的详细内容,更多关于技术,雷达的资料请关注golang学习网公众号!

声明:本文转载于:51CTO.COM 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>