相机获取一帧图像分为曝光和读出两个阶段。相机使用的传感器不同,相机的曝光时间和读出时间的重叠关系也有所不同,分为交叠曝光和非交叠曝光两种。
叠曝光和非交叠曝光相比,交叠曝光可以减少曝光时间对出图时间的影响。
重写后的句子: 在完成当前帧的曝光和读出之后,才进行下一帧的曝光和读出,这就是非交叠曝光。非交叠曝光帧周期大于曝光时间与帧读出时间的和。
内触发模式非交叠曝光
重叠曝光指的是当前帧的曝光和前一帧的读出过程部分重叠,也就是说,下一帧的曝光已经开始,而前一帧的读出仍在进行。交叠曝光帧周期小于等于曝光时间与帧读出时间的和。
内触发模式交叠曝光
对!上一段就是为了告诉你:后文叙述中无论当前帧曝光时间和上一帧的读出时间是否重叠都不要惊讶。
相机的触发模式分为内触发模式和外触发模式 2 种。
内触发模式:相机通过设备内部给出的信号采集图像。
外触发模式:相机通过外部给出的信号采集图像。软触发和硬件触发是外部信号的两种主要形式,外部信号既可以是软件信号也可以是硬件信号。外触发模式如图:
外触发模式
软触发:触发信号由软件发出(也可以利用相机SDK提供的API接口进行软触发)。
当使用硬件触发时,相机会通过其 I/O 接口与外部设备连接,并且接收来自外部设备的触发脉冲信号来采集图像。其实是直接对相机内部寄存器进行读写。下图是海康相机的电源IO的6-pin线缆:
海康相机电源及IO接口(6-pin Hirose)
其中,海康相机有1个光耦隔离输入Line0+,1个可配置输入输出Line2+,可选择一个配置为输入信号。
相机的触发输出信号是开关信号,可用于控制外部设备,如报警灯、光源和PLC。触发输出信号可通过Strobe 信号实现。
当相机曝光时,会立即产生一个高有效电平的Strobe信号。后文我们主要使用该信号对Lidar等其他传感器进行硬触发。这里有一个Strobe的预输出的概念。Strobe信号早于曝光生效。其工作原理为延迟曝光先进行Strobe输出。该功能可应用于响应比较慢的外部设备。Strobe预输出时序如图所示。(后面会讲为啥要延迟曝光)。
Strobe信号预输出时序
现在我们回到正题吧,现在讲起来就很快了。
有三种主要的方式可以实现相机和激光雷达的时间戳同步:硬触发、软触发以及软触发并加以硬触发。下面我以手绘示意图的形式一一介绍。
先说硬触发吧。一个MCU产生脉冲信号对三个传感器设备进行硬触发。
对于软触发+硬触发来说,可以先用相机SDK的API对一个相机进行软触发,然后利用相机的外触发信号Strobe对雷达和相机等其他传感器进行硬触发。
这里需要注意一个问题,如果进行软触发的第一个相机在曝光的同时发出Strobe信号,其他被硬触发的传感器总归是晚了一步,不能完全同步。因此,引入了之前提出的预输出Strobe的概念,即在延迟曝光之前先进行Strobe输出。
配置该模式时注意四点:
最后讲讲不被推荐的软触发。
首先调用API操作相比于硬触发(对传感器内部寄存器直接进行读写操作)明显是慢了,执行第二句命令API(2)前API(1)就已经花了些时间。
<code>//读取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);}</code>
当处理单帧数据所需的时间超过0.5秒时,线程1将读取下一帧数据,从而导致线程2的数据混乱。线程2必须在0.5秒内完成单个帧的处理,并且在每一帧后需要等待(1/fps-当前帧处理时间)。
以上是一文聊聊激光雷达与相机标定的时间戳同步问题的详细内容。更多信息请关注PHP中文网其他相关文章!