时间戳和采集时间之间的差距:
最佳状态:数据被采集的那一刻被打上时间戳
可接受:数据采集和被打时间戳之间有固定时延
困难:变化的时延
时间同步
最佳:硬件同步
可接受:不同的传感器有相同的时钟(例如,在系统时钟下运行),但是不同传感器采集频率不同
困难:不同传感器有不同的时钟
时间校准
1)首先保证时钟源是一致的
因为时钟源都有钟漂,而且每个时钟源钟漂不同,所以即使把各个传感器时间戳在初始时刻对齐,运行一段时间之后,之前对齐的结果就会偏离。解决这个问题的办法就是在硬件上把时钟源统一,常见的做法是做一个脉冲发生器,所有传感器都被这个脉冲触发,每次触发都校正一次自己的时钟,这样就可以消除时钟源的累计误差。
在自动驾驶的传感器配置里,GNSS是一个必备的传感器,它自带秒脉冲发生器,所以可以直接使用。而且GNSS信号能够达到定位要求时,自身时钟也会受到卫星上原子钟的校正,从而进一步提高精度。大家可能对GNSS的定位功能比较熟悉,其实它的授时功能是和定位同等重要的功能,现在很多系统里都已经改变说法,不再把这类东西只称作定位系统,而是称作定位授时系统。感兴趣的可以自行去搜一些资料看看。
2)获取同一时刻的信息
在解决硬件同步以后,我们只能保证 时间差没有累计漂移了,但是各个传感器的采集时刻并不是相同的。比如,在kitti数据集了,雷达和IMU都是10HZ,也就是100ms的周期,但是雷达每次采集的时间要比IMU慢个几十毫秒,当我们想获得在雷达采集时刻的车体角速度和加速度信息时,就要根据雷达前后时刻的IMU信息,通过插值计算出一个等效值(匀速模型),这就是获取同一时刻信息的含义。由于kitti已经做好了第一步,所以我们本次的工作就是围绕第二步来做的。
考虑延迟和无序测量的滤波器处理:
(延迟和无序是指,带有t1时刻时间戳的数据,在t2时刻才被我们系统接收,但时间戳本身没有任何问题)
(而标定中,我们对时间的标定,实际是要解决这个时间戳和真正的采集时间不一样的问题)
由于传输和计算延迟,必须考虑到测量延迟和无序。
解决的办法是,我们按照时间顺序维护两个滤波器和一个固定长度的缓冲区(缓冲区里存放是滤波器状态、滤波器测量值和IMU数据)。
滤波器-1:计算出实时PVA(位置 速度和方向)及其协方差通过执行时间更新并在接收到新的IMU数据时即时整合IMU数据。
滤波器-2对延迟测量进行处理。
0)当接收到t1处的新测量数据时,我们执行以下操作。
1)从缓冲器中获取t1处的滤波状态。更新滤波器-2中的滤波状态。
2)在滤波器-2中执行t1处的测量更新。
3)利用缓冲区中的IMU数据在filter-2中执行时间更新,直到到达当前时间(tnow)。或者我们在t2处停止(如果在缓冲区的t2处发现了另一个测量,其中t2比t1晚。这样t1和t2处的测量数据就会以错误的顺序接收)
4)如果t2处有另一个测量,在t2处执行测量更新。然后重复步骤3,发现更多的测量结果接收顺序错误。
5)当我们完成时间更新,到达当前时间时,过滤器的状态在缓冲区中,过滤器-1的状态根据新的结果从t1开始更新到当前时间。
注意 这里的测量,指lidar的数据或gnss的数据(或者其他传感器),也就是图里面的矩形和星号。
现在我们来尝试进行这个过程:
滤波器1实时的根据新来的imu测量对其状态和协方差进行更新。
时间来到t1时,lidar得到了数据,这个数据被打上了t1的时间戳,但并不是在t1就被融合系统接收到,而是在之后的时刻t3被接受
时间来到t2,gnss得到了数据,这个数据被打上了t2的时间戳,但并不是在t2就被融合系统接收到,而是在之后的时刻t4被接受
其中t4反而比t3更前。
现在开始:
刚才的0)当接收到t1处的新测量数据时
什么叫接受到t1处的新测量数据呢?实际上 我们是在t3时刻接收到这个数据,我们发现这个数据的时间戳是t1,这叫“接收到t1时刻的新测量数据”,此时当前时刻为t3
1)从缓冲器中获取t1处的滤波状态。更新滤波器-2中的滤波状态。
现在时刻是t3,但我们接收到了t1时刻的数据,所以我们从缓冲器里拿一下之前t1时候的滤波器状态,把这个状态给滤波器2
2)在滤波器-2中执行t1处的测量更新。
用刚才提取到的t1时刻的滤波器状态,在其基础上使用新拿来的测量,对滤波器状态进行更新
3)利用缓冲区中的IMU数据在filter-2中执行时间更新,直到到达当前时间(tnow)。
用刚才更新后的滤波器状态,从缓冲区里拿一下t1之后的那些imu数据,进行imu数据的更新(实际上应该叫预测),直至一步步的到达当前时间t3,如果一路顺利,那就成功,但现在,在一路预测上我们发现,当预测到t2时,这里还有一个传感器的测量。这意味着,我们发现了一对测量数据被以错误的顺序接收,所以我们不要直接预测到当前时间t3,而是预测到t2时刻就停止
4)如果t2处有另一个测量,在t2处执行测量更新。然后重复步骤3,发现更多的测量结果接收顺序错误。
t2这里有一个测量,所以我们用刚才滤波器预测到t2时刻的状态,在其基础上用t2时刻的测量对滤波器状态进行更新,然后重复步骤三
5)当我们完成时间更新,到达当前时间时,过滤器的状态在缓冲区中,过滤器-1的状态根据新的结果从t1开始更新到当前时间。
我们结束了这个循环,现在,滤波器2也更新到当前时间t3了,我们将这个状态存在缓存区里,并且把滤波器1从t1到t3的状态都更新一遍
最终,滤波器1始终是实时的更新着,每当我们收到了一个测量(比如t3时刻),我们就用滤波器2(我更愿意称其为「暂存滤波器」)来进行测量的更新,从而就可以解决传感器接受的时延甚至是无序问题