为什么要时间同步
在高级驾驶辅助系统(ADAS)场景中,时间同步是一个至关重要的需求,因为它确保了系统中所有传感器和处理单元的数据在时间上是一致的。准确的时间同步允许系统准确地重建和理解车辆周围的环境,这对于决策制定和执行动作至关重要。
具体比如,各个传感器的时钟有偏差,各种传感器的采样频率也不一致,当前激光典型采样频率为10HZ,相机为30fps,高精度组合导航为100HZ。没有准确的时钟同步,各传感器在哪一帧进行融合,在哪里进行插值都没法进行判断。两个传感器即使采样频率一致,其每帧数据的采样点也一般不一致。
除了自动驾驶域需要精确的时钟信息外,其他域相关功能同样也需要。大屏上实时高精地图显示;驾驶员实时疲劳检测;实时的流媒体后视镜显示;车辆与路侧RSU之间的实时信息交互,无一不需要全域架构内的精确时间同步。
如何进行时间同步
时钟源的选择
要实现时间同步,首先需要时钟源。
例如选择GPS作为时钟源,自动驾驶系统目前绝大多数标配高精度GNSS接收机,而GNSS中导航卫星内置高精度原子钟,GNSS接收机通过解算导航卫星信号,可以获得超高精度的时钟信号。
原子钟是人类目前最精确的时间测量仪器,原子在不同能级之间”跃迁”,且由高能级跃迁到低能级时,会释放电磁波。而对同一种原子来说,这种频率是固定的,且不受温度和压力影响,只与自身能量有关,称之为”共振频率”。通过一些物理手段,获得共振频率的准确物理值。并以此值作为产生时间信号的基本节拍,即丈量时间的基本单位。
主时钟选择
在ADAS的系统中,通常在一个域控内的ECU之间需要进行时间同步。这样可以方便各个传感器之间进行融合,保证车辆控制的时效性等。譬如经常会遇到在一个SOC上运行图像感知,另外一个SOC或者MCU运行雷达感知,这些融合、控制又在其他的SOC或者MCU上,甚至它们有可能不在同一个控制器上。这样多个SOC和多个MCU之间,甚至多个控制器之间就构成了一个域控系统。
在一个域控系统内,主时钟可以来至域控系统外部,也可以只在内部闭环。具体选择需要看整个域控系统的依赖,是否闭环就能实现,譬如图像和雷达都是域控内直接处理,如果内部直接处理,主时钟源可以考虑内部。当然选择外部也可以,保证融合和时效性的目标不变。
以外部时钟为例,我们会选择GPS作为主时钟。有时使用GPS时间同步需要接串口和PPS,如果将GPS模块发出的PPS和串口数据可以给到所有的传感器,并且所有传感器都支持GPS时间同步,那我们就不需要选择主时钟了。但是有时候这种方法可操作性差,我们会在域控系统内部选一个SOC或者MCU做主时钟,主时钟直接和GPS进行时间同步,然后主时钟再同步给其他SOC或者MCU。
时间的分发
常用时间同步方案的示意图
主时钟通过gptp协议将时间同中央网关发送到所有的slave节点,这样就实现了全局的时间同步。实际应用中,可以根据我们提供的各种时间同步功能,灵活选择具体的时间同步方式。
J5作为时间源方案
MCU作为时间源方案
上图两种方案分别为:
- MCU作为时间源,MCU支持gPTP
- MCU作为时间源,MCU不支持gPTP
APSYNC时间同步对MCU有两点要求: - MCU发出的APSYNC上升沿的间隔必须固定,这个误差影响J5 RTC的时间同步;
- MCU能准确记录自己的APSYNC上升沿发出的时间,这个影响J5系统时间、RTC时间、PHC时间的同步;
时间同步方案举例
如上图所示,HU通过NTP协议,从5G网络获取时间,然后HU作为master,通过网口连接到板子。HU内部有RTC,没有5G信号的时候可以从RTC获取时间。板子上有一个J5芯片,一个MCU和另外一个SOC。
● 首先J5的eth0划分为两个vlan(记为vlan1和vlan2),eth0.vlan1作为gptp slave和HU进行时间同步,eth0.vlan2作为gptp master。
● MCU和SOC作为gptp slave和J5的eth0.vlan2进行gptp时间同步。
各种时间同步方案中有哪些问题,遇到的问题的解决方法
NTP时间同步
● 缺点:误差较大,ms级别;
● 解决:对于要求很高精度的时间同步,不建议用NTP;
gPTP时间同步
这个需要网卡支持硬件时间戳,需要交换机支持gPTP协议;
● 缺点:需要硬件支持;
● 解决:需要提供支持gptp协议的硬件,例如雷达、MCU、switch等要支持gPTP协议
APSYNC时间同步(和MCU进行同步)
需要MCU发出的PPS间隔是1s,并且MCU拿到的PPS上升沿的时间是准确的。
● 缺点:要求MCU提供准确的时间戳和PPS;
● 需要优化MCU侧;
GPS时间同步
● 缺点:出现GPS没信号的时候,就无法同步了,到信号恢复再恢复同步,没信号的时候会累积误差。
● 解决:这个需要GPS支持在没信号的时候还能输出PPS,并且GPS内部的晶振比较稳定。
○ ZED-F9P 内部有晶振,支持在没有信号的时候还能输出PPS。
有关硬件的简介
ETH PHC
对GPS、APSYNC授时提供的硬件支持
以下是PHC的snapshot源,都是脉冲信号,上升沿到来,PHC(也就是网卡的硬件时间) 当前时间会被记录到寄存器。
GPS-PPS、Lidar、AP-SYNC都是外接的脉冲信号,J5有三个引脚:GPS-PPS、Lidar、AP-SYNC分别对应这三种脉冲信号。
PHC_snapshot_source snapshot源
0 RTC
1 GPS-PPS
2 Lidar-SYNC
3 AP-SYNC
对ptp提供的支持
ptp的事件消息(EVENT Message)进出网卡的时候,MAC层会记录硬件时间戳。
RTC
对GPS、APSYNC授时提供的硬件支持
以下是RTC的given源,都是PPS脉冲,上升沿到来,RTC given寄存器的值会被设置为RTC的当前时间。
rtc_given_source snapshot源
0 soft (读写寄存启触发)
1 GPS-PPS
2 Lidar-SYNC
3 AP-SYNC
4 ETH-PPS0
5 ETH-PPS1
6 ETH-PPS2
7 ETH-PPS3
注意:其中ETH-PPS0、ETH-PPS1、ETH-PPS2、ETH-PPS3只能由ETH0发出,ETH1不能发出PPS。
以下是RTC的snapshot源,都是PPS脉冲,上升沿到来,RTC 当前时间会被记录到snapshot寄存器。
rtc_snapshot_source snapshot源
0 AP-SYNC
1 GPS-PPS
2 Lidar-SYNC
PPS
PPS简介
J5支持外接PPS信号,GPS-PPS、Lidar、AP-SYNC,这三个PPS的特性如下:
● 每个PPS上升沿都会触发中断,三个PPS有各自独立的中断号;
● J5提供PPS驱动程序:./drivers/pps/clients/hobot-pps.c,这个驱动程序的功能为:当PPS中断到来之后,获取系统时间,唤醒应用层程序,将系统时间发给应用层。
Linux内核查看PPS的方法
root@j5dvb:/sys/class/pps# ls
pps0 pps1 pps2 pps3 pps4
上面可以看到5个PPS,如何知道哪个PPS对应GPS_PPS?
root@j5dvb:/sys/devices/virtual/pps/pps2# cat name
soc:gps_pps.-1
如何知道每个PPS是不是有输入?
root@j5dvb:/sys/devices/virtual/pps/pps2# cat assert
1669790170.998286896#10589
root@j5dvb:/sys/devices/virtual/pps/pps2# cat assert
1669790171.998291237#10590
root@j5dvb:/sys/devices/virtual/pps/pps2# cat assert
1669790172.998287244#10591
root@j5dvb:/sys/devices/virtual/pps/pps2# cat assert
1669790173.998290042#10592
root@j5dvb:/sys/devices/virtual/pps/pps2# cat assert
1669790174.998286841#10593
cat assert就可以获得PPS上升沿到来的时间戳,通过查看时间戳是否在变化,可以知道是否有PPS输入。