简介
在高级驾驶辅助系统(ADAS)场景中,时间同步是一个至关重要的需求,因为它确保了系统中所有传感器和处理单元的数据在时间上是一致的。准确的时间同步允许系统准确地重建和理解车辆周围的环境,这对于决策制定和执行动作至关重要。
具体比如,各个传感器的时钟有偏差,各种传感器的采样频率也不一致,当前激光典型采样频率为10HZ,相机为30fps,高精度组合导航为100HZ。没有准确的时钟同步,各传感器在哪一帧进行融合,在哪里进行插值都没法进行判断。两个传感器即使采样频率一致,其每帧数据的采样点也一般不一致。
除了自动驾驶域需要精确的时钟信息外,其他域相关功能同样也需要。大屏上实时高精地图显示;驾驶员实时疲劳检测;实时的流媒体后视镜显示;车辆与路侧RSU之间的实时信息交互,无一不需要全域架构内的精确时间同步。
名词缩写
缩写 解释
GPS Global Positioning System
RTC Real_Time Clock
PHC PTP hardware clock
PTP precision time protocol
MCU Microcontroller Unit
UART Universal Asynchronous Receiver/Transmitter
CAN Controller Area Network
PPS Pulse Per Second
NMEA National Marine Electronics Association
NTP Network Time Protocol
J5时间同步介绍
J5时间同步主要功能¶
J5时间同步主要用于从外部时间源获取时间,同步J5的RTC时间、PHC时间、Linux系统时间;
根据时间源的不同,可以将时间同步分为以下几种方式:
● GPS时间同步:从GPS获取时间,同步Linux系统时间、RTC时间、PHC时间;
● MCU时间同步:从MCU获取时间,同步Linux系统时间、RTC时间、PHC时间;
● gPTP时间同步:从gPTP master获取时间,同步Linux系统时间、RTC时间、PHC时间,J5也可以作为gPTP master对外提供时间同步服务;
● NTP时间同步:从NTP服务器获取时间,同步系统时间,J5也可以作为NTP server对外提供时间同步服务;
J5时间同步性能¶
J5各种时间同步方式的误差如下表所示:
时间源 同步后的误差
GPS 系统时间和UTC时间:1ms以内;RTC和UTC时间:100us以内;PHC和UTC时间:100us以内
MCU 系统时间和MCU时间:1ms以内;RTC和MCU时间:100us以内;PHC和MCU时间:100us以内
gPTP master 系统时间和PHC时间:1ms以内;RTC和PHC时间:100us以内;Slave/Master PHC时间:100us以内
NTP server 误差受到网络条件影响,Internet上绝大多数的地方其精度可以达到1- 50ms
J5时间同步软件架构图
上图为J5时间同步的软件架构图,图中的各个软件的功能如下表所示:
软件 功能
Hobot timesync service GPS同步RTC和PHC;AP-SYNC同步RTC和PHC;将系统时间和时间源差发送给chronyd
chronyd 通过NTP协议同步Linux系统时间;提供NTP server服务;接收offset,同步Linux系统时间
ptp4l 通过gPTP协议同步PHC时间;将RTC时间和PHC时间进行同步;提供gPTPmaster服务
phc2sys 将Linux系统时间和PHC时间进行同步
gpsd 从串口读取GPS数据,对GPS数据进行解析
J5时间同步原理简介
GPS时间同步原理
上图为GPS时间同步软件架构图,各个软件的作用如下:
软件 功能
GPSD 从串口读取GPS数据,解析出时间戳
Hobot timesync service:timesync 同步RTC时间;同步PHC时间;将PPS时间和UTC时间差发给chronyd
chronyd 接收时间差,同步系统时间
GPS工作流程
上图为GPS工作流程图,GPS每秒发出一个PPS,然后开始通过串口输出数据,例如NMEA数据。NMEA数据带有时间信息,经纬度信息。
GPS同步RTC原理
上图为GPS同步RTC的原理,GPS PPS是GPS模块发出的秒脉冲信号,每秒一次。
● 图中第一个PPS到来时,GPS时间是t,RTC时间是x,也就是t和x是同一时刻的时间。GPS会将PPS上升沿时的时间t通过串口发送给J5。并且由于GPS PPS连接到J5的gps_pps引脚,因此上升沿会传递给RTC,RTC会将上升沿触发的时间x记录到snapshot寄存器,这样J5就拿到了RTC和GPS在同一时刻的时间x和t,就可以计算两者的时间差。对于RTC时间同步来说,这个时间差的测量只是为了判断授时之后误差是多少,用于判断时间同步的准确度。
● 软件检测到第一个GPS PPS上升沿之后,通过串口读取到GPS的时间t。此时将t+1设置到RTC的given寄存器。given寄存器的时间不会立即生效,等到下一次PPS到来,硬件会自动将given寄存器的时间设置为RTC时间。(RTC和PHC各自的授时方式不同,是因为硬件实现不同,RTC不支持通过设置offset的方式调整时间。)
● 上图中,第二个PPS上升沿到来时,GPS时间是t+1,RTC的时间是t+1,因此RTC和GPS的时间完成同步。
● 这个同步过程每秒都会进行。
GPS同步PHC原理
● 假设第一个PPS到来时,GPS时间是t,PHC时间是x,GPS会将PPS上升沿时的时间t通过串口发送出去。并且由于GPS PPS连接到J5的gps_pps引脚,因此上升沿会传递给PHC,PHC会将上升沿触发的时间记录到snapshot寄存器,这样就拿到了PHC和GPS在同一时刻的时间,就可以计算两者的时间差。
● 软件检测到第一个GPS PPS上升沿之后,通过串口读取到GPS的时间t。并且从PHC的snapshot寄存器读取PHC时间x。计算时间差为t-x,也就是PHC时间比GPS时间慢t-x,将t-x设置到PHC的寄存器,PHC硬件上会将PHC的当前时间加上t-x,这样就实现了PHC时间和GPS时间的同步。
● 这个同步过程每秒都会进行。
GPS同步系统时间原理
上图为GPS同步Linux系统时间的原理。
● 假设第一个PPS到来时,GPS时间是t,Linux系统时间是x,GPS会将PPS上升沿时的时间t通过串口发送出去。并且由于GPS PPS连接到J5的gps_pps引脚,因此上升沿产生中断,PPS驱动的中断服务函数会记录系统时间x,应用程序可以调用函数接口读取时间x。
● 软件检测到第一个GPS PPS上升沿之后,通过串口读取到GPS的时间t。并且从PPS设备读取Linux系统时间x,计算Linux系统时间和GPS时间的差t-x,将时间差通过本地socket发送给chronyd,chronyd根据时间差调整Linux系统时间,完成时间同步。
MCU时间同步原理
软件架构图
上图为MCU时间同步软件架构图,各个软件的作用如下:
软件 功能
Hobot timesync service:timesync 同步RTC时间;同步PHC时间;将PPS时间和MCU时间的差发给chronyd
chronyd 接收时间差 同步系统时间
MCU工作流程
上图为MCU工作流程图,MCU每秒发出一个AP-SYNC秒脉冲(和GPS_PPS类似,都是秒脉冲,只是名称不同),然后开始通过CAN输出时间戳。
MCU同步RTC原理
上图为MCU同步RTC的原理,AP-SYNC是MCU发出的秒脉冲信号,每秒一次。
● 假设第一个AP-SYNC到来时,MCU时间是t,RTC时间是x,MCU会将AP-SYNC上升沿时的时间t通过CAN发送出去。并且由于AP-SYNC连接到J5的ap_sync引脚,因此上升沿会传递给RTC,RTC会将上升沿触发的时间记录到snapshot寄存器,这样就拿到了RTC和MCU在同一时刻的时间,就可以计算两者的时间差。
● 软件检测到第一个AP-SYNC上升沿之后,通过CAN读取到MCU的时间t。此时将t+1设置到RTC的given寄存器。given寄存器的时间不会立即生效,等到下一次AP-SYNC到来,硬件会自动将given寄存器的时间设置为RTC时间。
● 上图中,第二个AP-SYNC上升沿到来时,MCU时间是t+1,RTC的时间是t+1,因此RTC和MCU的时间完成同步。
● 这个同步过程每秒都会进行。
MCU同步PHC原理
上图为MCU同步PHC的原理。
● 假设第一个AP-SYNC到来时,MCU时间是t,PHC时间是x,MCU会将AP-SYNC上升沿时的时间t通过CAN发送出去。并且由于AP-SYNC连接到J5的ap_sync引脚,因此上升沿会传递给PHC,PHC会将上升沿触发的时间记录到snapshot寄存器,这样就拿到了PHC和MCU在同一时刻的时间,就可以计算两者的时间差。
● 软件检测到第一个AP-SYNC上升沿之后,通过CAN读取到MCU的时间t。并且从PHC的snapshot寄存器读取PHC时间x。计算时间差为t-x,也就是PHC时间比MCU时间慢t-x,将t-x设置到PHC的寄存器,PHC硬件上会将PHC的当前时间加上t-x,这样就实现了PHC时间和MCU时间的同步。
● 这个同步过程每秒都会进行。
MCU同步系统时间原理
上图为MCU同步Linux系统时间的原理。
● 假设第一个AP-SYNC到来时,MCU时间是t,Linux系统时间是x,MCU会将AP-SYNC上升沿时的时间t通过CAN发送出去。并且由于AP-SYNC连接到J5的ap_sync引脚,因此上升沿产生中断,PPS驱动的中断服务函数会记录系统时间x,应用程序可以调用函数接口读取时间x。
● 软件检测到第一个AP-SYNC上升沿之后,通过CAN读取到MCU的时间t。并且从PPS设备读取Linux系统时间x,计算Linux系统时间和MCU时间的差t-x,将时间差通过本地socket发送给chronyd,chronyd根据时间差调整Linux系统时间,完成时间同步。
gPTP时间同步原理
软件架构图
上图为gPTP时间同步的软件架构图,各个软件的功能如下表所示:
软件 功能
ptp4l 通过gptp协议同步的PHC时间;将RTC和gPTP slave端的PHC时间同步
phc2sys 将系统时间和PHC时间同步
gPTP同步PHC时间
ptp4l通过gPTP协议来测量J5和gPTP master的时间差,得到时间差之后,调用ETH驱动的接口,设置PHC时间。下面简要介绍gPTP如何测量时间差。
gPTP采用P2P机制进行延时测量。P2P机制是利用延时请求Pdelay_Req报文、延时响应Pdelay_Resp报文和Pdelay_Resp_Follow_Up报文,计算两个支持P2P机制的通信端口之间的路径延时。延时的计算方法为:
delay = [(T2 - T1) + (T4 - T3)]/2
master周期性发送Sync和Follow报文,slave收到Sync和Follow报文之后就可以计算出offset,知道了offset slave就可调整自己的时间,offset计算方法如下:
offset = T2 - T1 - delay
gPTP同步RTC时间
● J5的ethernet模块每秒发出一个秒脉冲(图中的ETH-PPS),假设第一个秒脉冲上升沿时间是8:29:58,RTC时间是7:23:21,PHC硬件会记录ETH-PPS上升沿时PHC时间到snapshot寄存器。
● 软件检测到ETH-PPS上升沿之后,读取PHC snapshot寄存器的时间,将时间加1秒,写到RTC的given寄存器。等到下一次ETH-PPS上升沿到来之后,RTC的时间就会变为8:29:59,和PHC时间一致。
gPTP同步Linux系统时间
phc2sys调用ioctl函数的PTP_SYS_OFFSET命令获取系统时间和PHC时间的差,然后调整系统时间。
NTP时间同步原理
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。
使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。
对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。
NTP最典型的授时方式是Client/Server方式。如下图所示,客户机首先向服务器发送一个NTP 包,其中包含了该包离开客户机的时间戳T1,当服务器接收到该包时,依次填入包到达的时间戳T2、包离开的时间戳T3,然后立即把包返回给客户机。客户机在接收到响应包时,记录包返回的时间戳T4。客户机用上述4个时间参数就能够计算出2个关键参数:NTP包的往返延迟d和客户机与服务器之间的时钟偏差t。客户机使用时钟偏差来调整本地时钟,以使其时间与服务器时间一致。
通过下面的公式计算时间差:
T2 = T1 + d + t
T4 = T3 + d - t
t = [(T2 - T1) - (T4 - T3)]/2
d = [(T2 - T1) + (T4 - T3)]/2
时间同步用到的软件
GPSD
gpsd是一个解析GPS数据的程序,解析GPS模块输出的NMEA数据,将解析到的数据封装成结构体,通过进程间通信(socket或者共享内存)机制提供给其他进程。
/system/usr/bin/gpsd -b -n -p /dev/ttyS0 -s 115200
GPSD帮助信息:https://gpsd.gitlab.io/gpsd/gpsd.html
chronyd
chrony 是网络时间协议 (NTP) 的通用实现。它可以将系统时钟与 NTP 服务器、参考时钟(例如 GPS 接收器)进行时间同步。它还可以作为 NTPv4 (RFC 5905) 服务器,为网络中的其他计算机提供时间服务。
chrony 中包含两个程序,chronyd 是一个可以在启动时启动的守护程序,chronyc 是一个命令行界面程序,可用于监控 chronyd 的性能并在运行时更改各种操作参数。
使用方法
chronyd提供什么功能,主要通过配置文件进行配置。
chronyd默认的配置文件是/etc/chrony.conf,直接运行chronyd命令,chronyd就会使用默认 的配置文件,如果想让chronyd使用其他的配置文件,使用-f参数即可。
例如,执行:chronyd -f /userdata/chrony.conf,chronyd就会使用 /userdata/chrony.conf作为配置文件。
配置文件示例1:
makestep 0.1 -1
pool pool.ntp.org iburst maxsources 3
allow
上面的配置文件是配置chronyd和ntp服务器进行时间同步,各个参数的含义如下:
makestep 0.1 -1:表示,如果系统时间和NTP服务器时间差大于0.1s,就快速调节系统时间,如果时间差小于0.1s,就通过调整系统时间的频率,缓慢调整时间。-1表示不限制快速调整时间的次数。
pool:指定一个NTP服务器池,maxsources指定从NTP池中使用的NTP服务器的数量。
allow:允许其他的NTP客户端和自己进行同步。
配置文件示例2:
makestep 0.1 -1
refclock SOCK /var/run/chrony.ttyS0.sock poll 0 dpoll 0
refclock SOCK:表示从本地socket获取时间。
poll: 从时间源获取的时间不会立即使用,而是先存储到缓冲区,缓冲区大小是2^poll,然后将缓冲区的时间戳进行滤波,再进行使用。这里设置poll为0,代表缓冲区的大小是1,可以存储一个时间戳。
dpoll:有些时间源需要通过轮询方式获取时间,这里定义的轮询间隔为2^dpoll,dpoll为0,代表轮询间隔是1s。
关于配置文件详细的帮助信息,可以参考:https://chrony.tuxfamily.org/doc/4.2/chrony.conf.html
chronyc可以用来查询时间同步状态:
查询时间是否同步:执行chronyc sources -v,输入命令之后可以看到如下打印:说明J5已经和NTP服务器同步上了,误差是-141us。
root@:~# chronyc sources -v
210 Number of sources = 1
.-- Source mode ‘^’ = server, ‘=’ = peer, ‘#’ = local clock.
/ .- Source state ‘*’ = current synced, ‘+’ = combined , ‘-’ = not combined,
| / ‘?’ = unreachable, ‘x’ = time may be in error, ‘~’ = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | |
MS Name/IP address Stratum Poll Reach LastRx Last sample
^* 192.168.3.12 3 6 377 20 -128us[ -141us] +/- 26ms
chrony帮助信息:https://chrony.tuxfamily.org/
Linuxptp
该软件包含两个程序:ptp4l和phc2sys。这两个软件结合使用,就可以实现从master获取时间,同步J5的PHC时间、RTC时间和Linux系统时间。
ptp4l使用方法
ptp4l支持gptp功能,可以作为master,也可以作为slave;如果作为slave,可以从master获取时间,同步J5的PHC时间和RTC时间。
可以通过ptp4l –h查看帮助信息:
root@:~# ptp4l --h
ptp4l: option ‘–hwts_filter’ requires an argument
usage: ptp4l [options]
Delay Mechanism
-A Auto, starting with E2E
-E E2E, delay request-response (default)
-P P2P, peer delay mechanism
Network Transport
-2 IEEE 802.3
-4 UDP IPV4 (default)
-6 UDP IPV6
Time Stamping
-H HARDWARE (default)
-S SOFTWARE
-L LEGACY HW
Other Options
-f [file] read configuration from ‘file’
-i [dev] interface device to use, for example ‘eth0’
(may be specified multiple times)
-p [dev] Clock device to use, default auto
(ignored for SOFTWARE/LEGACY HW time stamping)
-d [pps dev] eth pps device to use
-s slave only mode (overrides configuration file)
-l [num] set the logging level to ‘num’
-m print messages to stdout
-q do not print messages to the syslog
-v prints the software version and exits
-h prints this message and exits
ptp4l可以通过-f参数指定配置文件。
配置文件按段划分,空行和#开头的行会被忽略。
有三种段类型:
- [global]段,用来配置program选项,clock选项,默认port选项。
- port段使用被配置的网口的名字,如[eth0]段,其配置的选项会覆盖[global]段中默认port选项。port段可以为空内容,作用只是指定网口,这样命令行中不必使用-i选项。
- [unicast_master_table]段,配置单播table。
配置文件的详细信息可以参考:https://linuxptp.nwtime.org/documentation/ptp4l/
phc2sys使用方法
phc2sys运行后,可以将Linux系统时间,设置为J5的PHC时间。
可以通过phc2sys –h查看使用说明:
root@:~# phc2sys -h
usage: phc2sys [options]
automatic configuration:
-a turn on autoconfiguration
-r synchronize system (realtime) clock
repeat -r to consider it also as a time source
manual configuration:
-c [dev|name] slave clock (CLOCK_REALTIME)
-d [dev] master PPS device
-s [dev|name] master clock
-O [offset] slave-master time offset (0)
-w wait for ptp4l
common options:
-f [file] configuration file
-E [pi|linreg] clock servo (pi)
-P [kp] proportional constant (0.7)
-I [ki] integration constant (0.3)
-S [step] step threshold (disabled)
-F [step] step threshold only on start (0.00002)
-R [rate] slave clock update rate in HZ (1.0)
-N [num] number of master clock readings per update (5)
-L [limit] sanity frequency limit in ppb (200000000)
-M [num] NTP SHM segment number (0)
-u [num] number of clock updates in summary stats (0)
-n [num] domain number (0)
-x apply leap seconds by servo instead of kernel
-z [path] server address for UDS (/var/run/ptp4l)
-l [num] set the logging level to ‘num’ (6)
-t [tag] add tag to log messages
-m print messages to stdout
-q do not print messages to the syslog
-v prints the software version and exits
-h prints this message and exits