01 同步方案
激光雷达与GPS时间同步主要有三种方案,即PPS+GPRMC、PTP、gPTP
PPS+GPRMC
GNSS输出两条信息,一条是时间周期为1s的同步脉冲信号PPS,脉冲宽度5ms~100ms;一条是通过标准串口输出GPRMC标准的时间同步报文。
同步脉冲前沿时刻与GPRMC报文的发送在同一时刻,误差为ns级别,误差可以忽略。GPRMC是一条包含UTC时间(精确到秒),经纬度定位数据的标准格式报文。
PPS秒脉冲为物理电平输出,接收及处理PPS信号的时间在ns级别,依旧可以忽略。但GPRMC数据一般通过波特率9600的串口发送,发送、接收、处理时间tx在ms级别,是时间同步的关键。
以下是使用PPS+GPRMC进行时间同步的原理。
(1)设备收到PPS秒脉冲信号后,将内部以晶振为时钟源的系统时间里的毫秒及以下时间清零,并由此开始计算毫秒时间。
(2)当收到GPRMC数据后,提取报文里的时、分、秒、年、月、日UTC时间。
(3)将收到秒脉冲到解析出GPRMC中UTC时间所用的时间tx,与UTC整秒时间相加,同步给系统时间,至此已完成一次时间同步。下一秒再进行相同的过程,每秒准确校准一次。
聪明的人可能已经恍然大悟,激光雷达需要进行时间同步,就做两根线接上这两个物理接口就妥了,这种方式是可以的,也是很多厂商在用的方案,但是PPS+GPRMC存在如下问题。
(1)PPS是一个低功率的脉冲电平信号,驱动电流少的只有0.5mA,多的也就20mA,带几个同步节点(激光雷达和其他需要时间同步的节点),十几个就很困难了。
(2)PPS是无屏蔽的单线脉冲信号,十几根PPS线穿梭在车内,极易受到车内恶劣电磁环境的干扰,届时根本无法区分出是干扰脉冲还是同步脉冲。
(3)GPRMC通过RS232串口发送同步报文,RS232是一种1对1的全双工通信形式,也可以通过主从形式实现1对几数据传输。但对十几,实属罕见,只能通过试验验证到底可不可行。但至少线束工程师是打死不愿答应的。
(4)当时钟源丢失的时候,所有需要时间同步的设备都一下子没有了主心骨,每个小弟都可以自立门户,没有二当家的及时站出来,主持大局。这对功能安全要求极高的自动驾驶系统来说,根本无法接受。
PTP
因此基于单纯的PPS和GPRMC实现整个自动驾驶系统的时间同步,具有理论可行性,但并不具有实际可操作性。
而基于网络的高精度时间同步协议PTP(Precision Time Protocol,1588 V2),同步精度可以达到亚微秒级。这对于主干网络为以太网的全域架构来说,简直是万事具备,只欠各域控制器的硬件PHY芯片支持了。
PTP是一种主从式的时间同步系统,采用硬件时间戳,因此可以大幅减少软件处理时间。同时PTP可运行在L2层(MAC层)和L4层(UDP层),运行在L2层网络时,直接在MAC层进行报文解析,不用经过四层UDP协议栈,从而大幅减少协议栈驻留时间,进一步提高时间同步精度,对于自动驾驶系统来说非常友善。
全域架构下的一种架构方案如下图。
设备中运行PTP协议的网络端口称为PTP端口,PTP主端口用来发布时间,PTP从端口用来接收时间。同时定义了三种时钟节点,边界时钟节点(BC,Boundary Clock)、普通时钟节点(OC,Ordinary Clock)和透明时钟节点(TC,Transparent clock)。
(1)边界时钟节点拥有多个PTP端口,其中一个用来同步上游设备时间,其余端口用来向下游设备发送时间。当边界时钟节点的上游时间同步设备是GNSS接收机时,此时的边界时钟节点就是一个主时钟节点(最优时钟)。
(2)普通时钟节点只有一个PTP端口,用来同步上游时钟节点的时间。
(3)透明时钟,人如其名,具有多个PTP端口,收到什么时间,转发什么时间,不进行协议解析,内部不参与时间同步。PTP通过在主从设备之间交互同步报文,并记录下报文发送时间,从而计算网络传输延迟和主从设备间时钟的偏差。
PTP定义了四条同步报文:Sync、Follow_Up、Delay_Req、Delay_Resp,精确同步过程如下。
(1)PTP主端口向从端口发送Sync报文,同步记录下Sync发送的时间t1。从端口收到Sync报文后,记录下收到的时间t2。
(2)紧接着主端口将t1时间放到Follow_Up报文发送给从端口,从端口收到此报文后就可以解析出t1,并由此得到第一个方程式:t1+网络延时+时钟偏差=t2。
(3)从端口向主端口发送Delay_Req报文,同步记录下Delay_Req发送的时间t3。主端口收到报文后,记录下收到的时间t4。
(4)紧接着主端口将t4时间放到Delay_Resp报文发送给从端口,从端口收到此报文后就可以解析出t4,并由此得到第一个方程式:t3+网络延时-时钟偏差=t4。两个未知数,两个方程组,应用初中数学知识可以解出:网络延时=[(t2-t1)+(t4-t1)]/2,时钟偏差=[(t2-t1)-(t4-t3)]/2。
gPTP
gPTP(generalized Precision Time Protocol,广义精确时间同步协议),基于PTP(IEEE 1588v2)协议进行了一系列优化,形成了更具有针对性的时间同步机制,可以实现μs级的同步精度。
gPTP定义有两种设备类型,Time-aware-end Station和Time-aware Bridge。每种设备都具有本地时钟,本地时钟都是通过晶振的振荡周期进行度量的,设备内部硬件计数器负责对振荡周期进行计数。设备中用来发布时间同步报文的网络端口称为主端口,用来接收时间同步报文的端口称为从端口。
(1)Time-aware-end Station,既可以作为主时钟,也可以作为从时钟。
(2)Time-aware Bridge,既可以作为主时钟,也可以作为桥接设备,类似交换机。桥接类设备在收到gPTP报文后,会请报文搓个澡,然后再送出去。而报文在桥接设备内搓澡消耗的时间,称为驻留时间。gPTP要求桥接设备必须具有测量驻留时间的能力。
下图展示了一个简单的gPTP系统,包含一个时钟源、1个主时钟,2个桥接设备,4个从时钟。主时钟是系统内的时间基准,一般具有更高精度的本地时钟,同时需要能够被高精度准时钟源授时。主时钟在系统内可以动态分配,也可以预先分配(对于车载固定拓扑应用场景,多采用预先分配的原则)。
gPTP中规定的主时钟动态分配机制为BMCA(Best Master Clock Algorithm,最佳主时钟选择算法)。系统上电唤醒之后,系统所有设备都可以通过发送一条报文来参与主时钟竞选,报文中含有各自设备的时钟信息。每一个参选设备都会比较自己的时钟信息和其它设备的时钟信息,并判断是否具有优势,如果不具有,则退出竞选,直到综合能力最强的武林盟主诞生。
02 同步过程
gPTP定义有两类报文,事件类型报文(包括Sync、Pdelay_Req、Pdelay_Resp三条)和一般类型报文(包括Follow_UP、Pdelay_Resp_Follow_UP二条)。gPTP定义设备工作在网络七层模型中的第二层数据链路层的MAC(Media Acess Control,媒介访问控制)子层。
当设备MAC层接收或发送事件类型报文时,会触发对硬件计数器进行采样,从而获得时钟振荡周期计数值,结合时钟振荡频率及基准时间,可获得此时的时间戳。而一般类型报文仅用来携带信息,不会触发内部硬件计数器的采样操作。
时钟偏差测量
gPTP定义的五条报文中,Sync和Follow_UP为一组报文,周期发送,主要用来测量时钟偏差。Sync由主端口发送,在报文离开主端口MAC层时,触发主端口记录此时的时间戳t1。从端口MAC层收到Sync报文后会记录此时的时间戳t2。随后,主端口将t1值附到Follow_UP报文里发送给从端口。
如果没有网络传输延迟或延迟、可以忽略,则从端口将本地时钟值加上时钟偏差(t1-t2的值)就完成时间同步,也就没有后面的碎碎念了。但是对于μs级时间同步精度的gPTP来说,传输延迟显然无法视若不见。
传输延迟测量
gPTP采用P2P(Peer to Peer)的方法来测量传输延迟。在P2P方法中,测量的是相邻设备间的传输延迟,报文不允许跨设备传输,这也就要求gPTP网络内的所有设备都需要支持gPTP功能。同时定义一组独立的报文专门负责传输延迟测量,分别为周期发送的Pdelay_Req、Pdelay_Resp和Pdelay_Resp_Follow_UP。
从端口首先发送Pdelay_Req报文,标志传输延迟测量的开始,在报文离开从端口MAC层时,触发从端口记录此时的时间戳t3。主端口MAC层收到Pdelay_Req报文后会记录此时的时间戳t4,随后,主端口通过Pdelay_Resp报文将值t4发送给从端口,同时在Pdelay_Resp报文离开主端口的MAC层时,触发主端口记录此时的时间戳t5,从端口MAC层收到Pdelay_Resp报文后记录此时的时间戳t6。随后,相同的套路,主端口通过Pdelay_Resp_Follow_Up报文将值t5发送给从端口。至此,一次传输延迟测量过程已经结束。在假设路径传输延迟是对称的前提下,可由如下公式计算相邻设备间的传输延迟。
频率同步
上文的传输延迟测量是基于从端口与主端口的时钟振荡频率一致的前提下得到的。现在我们考虑一下如果主从端口时钟振荡频率不一致的时候,会导致什么灵异事件发生。假设从端口的时钟振荡频率是25MHz,则一个时钟振荡周期是40ns。主端口的时钟振荡频率是100MHz,则一个时钟时钟振荡周期是10ns。
假设在一次传输延迟测量过程中,从端口在t6和t3时刻记录的振荡周期差值若为200个振荡周期。由于主端口的时钟频率是从端口的4倍,因此从端口收到t5和t4时刻的振荡周期差值大概800个。以从端口的40ns一个时钟振荡周期为基准进行计算的话,传输延迟则为-24μs([200x40-800x40]/2)。传输不仅没有延迟,反而提前知道了,从端口大仙无疑了。
除了主从端口时钟振荡频率的先天不一致,温度、老化等原因也会导致晶振振荡频率的不稳定。为了解决频率不同步的问题,gPTP通过频率同步来实现从端口对主端口的时钟振荡频率同步。
频率同步复用传输延迟测量过程的Pdelay_Resp和Pdelay_Resp_Follow_UP报文。通过采用两组答复,最终可以获得t5,t6,t9,t10的值,由下面公式可得主从端口的频率比。
主从端口频率同步的情况下,频率比等于1。如果大于1,说明主端口走得快,如果小于1,说明主端口走的慢。从端口根据频率比的值,调整自己的时基,从而获得正确的时间戳。