一种可设定周期的高精度GNSS时间同步方法
技术领域
本发明主要涉及全球卫星导航系统GNSS和时间同步领域,具体涉及一种自动驾驶域控系统中的高精度GNSS时间同步方法。
背景技术
随着汽车电子技术的日益发展,人们对于汽车智能网联化的需求也在逐步上升,自动驾驶技术也应运而生,对于自动驾驶技术的实现,涉及到感知、决策、规划等多个方面。由于道路环境的复杂多变,汽车在行驶过程中需要提前构建车辆周边环境地图进行自我定位,这其中涉及到域控系统间的精确时间同步,从而规划形式轨迹。
已知的网络时间同步NTP,采用客服端服务端的模式,通过计算机网络报文的交换,实现了时间同步功能,但由于网络传输路径的不确定性,通过以太网实现的单向网络授时是不可靠的。PTP作为一种主从式时间同步系统,采用硬件时间戳,减少了对网络资源的使用,提高了同步系统的可靠性,但其时间同步的精度只达到亚微秒级。
基于NTP和PTP的不足之处,时间同步方法需要一种既能保证可靠性和实时性,又能够提升同步精度的方法,且成本较低,易于实现,能够广泛应用于自动驾驶域控系统中。
发明内容
发明目的:为了克服上述现有技术的不足,本发明提供了一种可设定周期的高精度GNSS时间同步方法,可周期性同步系统时间,提高了时间同步的精度与可靠性。
技术方案:本发明公开一种可设定周期的高精度GNSS时间同步方法,通过PPS脉冲与高精度时间报文UBX-NAV-PVT去同步系统时间,包括如下步骤:
步骤1:获取GNSS接收机输出的PPS秒脉冲信号,解析以晶振为时钟源的系统内部时间戳和脉冲序列号;
步骤2:根据脉冲序列号和设定的时间同步周期,判定当前是否到达时间同步时刻;
步骤3:通过UART串口通信读取GNSS接收机输出的高精度时间报文UBX-NAV-PVT,解析时间报文中的UTC时间;
步骤4:计算PPS脉冲时间戳与解析完时间报文之间所用时间补偿量,与并与解析出UTC时间相加,解算出向系统同步的时间,进行时间同步。
进一步地,所述步骤3中读取GNSS接收机输出的高精度时间报文UBX-NAV-PVT需要如下硬件支持:
全球卫星导航系统GNSS接收机,用以输出PPS脉冲和GNSS时间报文UBX-NAV-PVT;
GNSS接收机天线,用以接收卫星实时发送的信号;
UART串口模块,将GNSS接收机映射为Linux内核系统中的设备节点/dev/ttyUSB0;
GNSS接收机天线接收卫星发送的信号,并将卫星信号转发给GNSS接收机;GNSS接收机收到信号后,生成高精度的UBX-NAV-PVT时间报文;UART串口模块将GNSS接收机和Linux域控系统进行硬件连接,即在硬件驱动上,将GNSS接收机映射为内核中的设备节点/dev/ttyUSB0。
进一步地,所述UART串口模块需要进行UART串口通信配置,具体包括:
UART串口通信配置,设置波特率、数据位、校验位和停止位;
通过串口下发配置指令到内核空间中设备节点/dev/ttyUSB0的读缓冲区,使其输出高精度的GNSS时间报文UBX-NAV-PVT;
通过访问节点/dev/ttyUSB0的写缓冲区,间接读取GNSS接收机输出的时间报文;
其中,UBX-NAV-PVT报文表示GNSS的时间、速度和位置解。
进一步地,所述步骤1中获取PPS秒脉冲信号具体包括:
通过拉低GNSS接收机天线的引脚电平,使其每秒输出PPS脉冲信号,其频率为1Hz;
PPS脉冲以GPIO作为PPS信号源,通过注册GPIO中断的方式,记录引脚电平变化,当PPS脉冲到来时,访问脉冲节点/dev/pps0即可获取PPS脉冲信号,获取PPS发送时刻的系统时间戳和序列号等信息。
进一步地,所述步骤2中设定时间同步周期,判定当前是否到达时间同步时刻的方法包括:
时间同步程序启动时,输入时间同步的周期,通过PPS脉冲信号中提供的序列号,对设定同步周期进行模运算,通过下述公式的结果来判定是否要执行时间同步;
result=sequence%period
其中,sequence表示PPS脉冲序列号,period表示同步周期,result表示模运算结果。
进一步地,所述步骤3中接收和提取高精度的GNSS时间报文的方法包括:
利用生产者消费者异步处理模式,接收和提取高精度的GNSS时间报文UBX-NAV-PVT,其中生产者表示实时读取GNSS报文数据,将数据追加到环形队列中,消费者表示实时提取UBX-NAV-PVT时间报文,采用环形队列的先进先出原则,通过判断队列中时间报文的帧头、Class、ID、长度关键字,提取UBX-NAV-PVT时间报文。
进一步地,所述步骤3中解析高精度时间报文UBX-NAV-PVT的方法为:
定义时间报文结构体类型,其中包含年、月、日、时、分、秒和纳秒时间信息,利用类型的本质是指示编译器如何解释一段内存空间这一特性,将提取出的十六进制UBX-NAV-PVT时间报文执行memcpy内存拷贝运算,使用已定义的结构体类型来解释该十六进制报文,进而解析UBX-NAV-PVT报文中的UTC时间。
进一步地,所述步骤4中解算系统同步时间的方法为:
计算读取、提取和解析时间报文过程所用的时间补偿量,与UBX-NAV-PVT时间报文所提供的时间相加,通过下述公式表示向域控系统的授时;
timestamp=pvt_time+Δt
其中,pvt_time表示高精度的GNSS时间,Δt表示补偿时间,timestamp表示向域控系统同步的时间。
进一步地,所述步骤4中还包括:将UTC时间转换为Linux系统时间,将UBX-NAV-PVT时间报文中解析出的UTC时间,转换为可同步到域控上的Linux系统时间,然后,将域控系统的授时时钟由默认时区转换为东八区北京时间。
有益效果:
1、本发明对GNSS接收机进行预处理,通过注册GPIO中断和下发配置指令的方式,使GNSS接收机输出PPS脉冲信号和高精度的UBX-NAV-PVT时间报文,提供域控系统所需同步的基准时间。采用高精度的GNSS时间报文UBX-NAV-PVT作为统一的时间源,并加以解析时间报文所用的时间补偿量,得到系统所需同步的UTC时间,为各个域控系统提供了基准时间,域控系统根据此基准时间,来较准各自的时钟时间,解决了由于时钟晶振导致的不同域控系统间的时间偏差问题。另外,本发明选择了UBX-NAV-PVT时间报文,其时间精度能够达到纳秒级别,且UBX-NAV-PVT是十六进制的报文,通过硬件支持实现UBX-NAV-PVT时间报文的获取与解析。
2、本发明利用时区转换,GNSS接收机输出的UBX-NAV-PVT时间报文,是默认的0时区,本发明将其转换为东八区北京时间,便于适配当前时间系统。
3、本发明通过访问PPS脉冲节点/dev/pps0,获取PPS脉冲信号中的域控系统时间戳和当前的序列号信息。考虑时间报文的解析过程会产生耗时,因此,系统时间戳将用于计算时间补偿量。脉冲序列号用来和本发明设定的时间同步周期进行模运算,计算执行时间同步的时刻,从而达到实现周期性时间同步的目的。
4、本发明通过生产者消费者异步处理模式,一方面,生产者端访问GNSS串口节点/dev/ttyUSB0,将实时读取的GNSS数据追加到环形队列;另一方面,消费者端从环形队列列头部提取时间报文UBX-NAV-PVT。通过异步处理模式,避免了串口通信阻塞现象的发生,与同步处理模式相比,提高了时间同步的可靠性,降低不必要的耗时。同时使用环形队列先进先出的原则,减少了对内存的拷贝,降低了CPU负载,也提高了时间同步的效率。
附图说明
图1是本发明提供的一种时间同步流程图;
图2是本发明提供的一种时间同步框架原理图;
图3是本发明提供的一种时间同步GNSS接收机输出数据原理图;
图4是本发明提供的一种时间同步串口通信流程图;
图5是本发明提供的一种PPS脉冲信号获取示意图;
图6是本发明提供的一种时间报文UBX-NAV-PVT结构原理图;
图7是本发明提供的一种时间报文UBX-NAV-PVT解析原理图。
具体实施方式
为了清晰表述本发明所解决的技术问题和实施方案,下面结合附图对本发明做进一步的详细说明。
如图1所示,本发明公开了一种可设定周期的高精度GNSS时间同步方法,通过PPS脉冲与高精度时间报文UBX-NAV-PVT去同步系统时间,使用了GNSS接收机和Linux系统。全球卫星导航系统GNSS除了广为人知的定位功能外,还有一个鲜少人知但非常重要的授时功能。目前自动驾驶汽车都配置了标准的GNSS接收机,其内置高精度原子时钟,GNSS接收机通过实时解算卫星信号,可输出高精度的时钟信号。Linux系统通过读取GNSS接收机的输出来实现周期性时间同步。
自动驾驶域控中各系统都有自己的内部时钟,但由于每个时钟的晶振不同,导致各系统之间存在时间偏差,因此,需要统一各域控系统的时间源,如图2所示的时间同步框架原理,本发明利用GNSS时间作为统一的时间源,为各域控系统提供基准时间。本发明具体方法包括如下步骤:
步骤1:获取GNSS接收机输出的PPS秒脉冲信号,解析以晶振为时钟源的系统内部时间戳和脉冲序列号。
通过拉低GNSS接收机天线的引脚电平,使其每秒输出PPS脉冲信号,其频率为1Hz。
PPS脉冲以GPIO作为PPS信号源,通过注册GPIO中断的方式,记录引脚电平变化,同时下发脉冲输出指令UBX-CFG-TP,当PPS脉冲到来时,访问脉冲节点/dev/pps0即可获取PPS脉冲信号,获取PPS发送时刻的系统时间戳和序列号Sequence等信息。
步骤2:根据脉冲序列号和设定的时间同步周期,判定当前是否到达时间同步时刻。
将同步周期Period动态注入时间同步程序中,周期性同步系统时间的目的在于纠正各域控系统间的时间偏差。通过访问PPS脉冲节点/dev/pps0的方式,每秒获取PPS脉冲信号中的系统时间戳和序列号Sequence等信息,脉冲信号的获取如图5所示,将当前脉冲序列号Sequence与同步周期Period进行模运算,当结果为0时,到达时间同步时刻。
时间同步程序启动时,输入时间同步的周期,通过PPS脉冲信号中提供的序列号,对设定同步周期进行模运算,通过下述公式的结果来判定是否要执行时间同步:
result=sequence%period
其中,sequence表示PPS脉冲序列号,period表示同步周期,result表示模运算结果。
步骤3:通过UART串口通信读取GNSS接收机输出的高精度时间报文UBX-NAV-PVT,解析时间报文中的UTC时间。
3.1)读取GNSS接收机输出的高精度时间报文UBX-NAV-PVT需要如下硬件支持:
全球卫星导航系统GNSS接收机,用以输出PPS脉冲和GNSS时间报文UBX-NAV-PVT。
GNSS接收机天线,用以接收卫星实时发送的信号。
UART串口模块,将GNSS接收机映射为Linux内核系统中的设备节点/dev/ttyUSB0。
GNSS接收机天线接收卫星发送的信号,并将卫星信号转发给GNSS接收机;GNSS接收机收到信号后,生成高精度的UBX-NAV-PVT时间报文;UART串口模块将GNSS接收机和Linux域控系统进行硬件连接,即在硬件驱动上,将GNSS接收机映射为内核中的设备节点/dev/ttyUSB0。
3.2)UART串口模块需要进行UART串口通信配置,具体包括:
UART串口通信配置,设置波特率、数据位、校验位和停止位。
通过串口下发配置指令到内核空间中设备节点/dev/ttyUSB0的读缓冲区,使其输出高精度的GNSS时间报文UBX-NAV-PVT。
通过访问节点/dev/ttyUSB0的写缓冲区,间接读取GNSS接收机输出的时间报文。其中,UBX-NAV-PVT报文表示GNSS的时间、速度和位置解。
对于GNSS报文的输出,本发明通过UART串口通信的方式,实时读取GNSS报文,实现流程如图4所示,设置UART串口的波特率为38400bps,数据位、校验位和停止位分别为8、N、1。
3.3)接收和提取高精度的GNSS时间报文的方法包括:
建立生产者消费者异步处理模式,生产者通过访问串口节点/dev/pps0的方式,将实时读取的十六进制GNSS报文追加入环形队列中;消费者则根据环形队列先进先出的原则,利用UBX-NAV-PVT帧头、Class、ID、长度等关键字,从队列头开始提取UBX-NAV-PVT时间报文。报文结构原理如图6所示,其中报文帧头为0xB562,Class为0x01,ID为0x07,长度占100字节。
3.4)解析高精度时间报文UBX-NAV-PVT的方法为:
UBX-NAV-PVT包含了时间、位置和速度解,本发明只取该报文中的时间解,根据UBX-NAV-PVT协议定义时间报文结构体类型,报文的有效时间负载如表1所示,该结构体类型中包含了时间报文中的年、月、日、时、分、秒和纳秒等UTC时间,利用类型的本质是指示编译器如何解释一段内存空间这一特性,将提取出的十六进制UBX-NAV-PVT时间报文,执行memcpy内存拷贝运算,编译器将十六进制的UBX-NAV-PVT时间报文强制解释为定义的结构体类型,解析原理如图7所示,进而解析出具体的UTC时间。
表1时间报文UBX-NAV-PVT有效负载结构
Byte offset |
Type |
Name |
Unit |
Description |
0 |
U4 |
iTOW |
ms |
GPS time of week of the navigation |
4 |
U2 |
year |
y |
Year(UTC) |
6 |
U1 |
month |
month |
Month,range 1..12(UTC) |
7 |
U1 |
day |
d |
Day ofmonth,range 1..31(UTC) |
8 |
U1 |
hour |
h |
Hour of day,range 0..23(UTC) |
9 |
U1 |
min |
min |
Minute ofhour,range 0..59(UTC) |
10 |
U1 |
sec |
S |
Seconds ofthe minutes,range 0..60(UTC) |
12 |
U2 |
reserved |
- |
Reserved |
16 |
I4 |
nano |
ns |
Fraction of second,range-1e9..1e9(UTC) |
步骤4:计算PPS脉冲时间戳与解析完时间报文之间所用时间补偿量,与并与解析出UTC时间相加,解算出向系统同步的时间,进行时间同步。
由于PPS脉冲与UBX-NAV-PVT时间报文的发送在同一时刻,误差仅在纳秒级别,计算时间同步所需的时间补偿量,即报文发送时刻到报文解析完毕时刻期间所用的时间,将该补偿时间与UBX-NAV-PVT时间报文所提供的时间相加,解算得到UTC同步时间,通过下述公式表示向域控系统的授时;
timestamp=pvt_time+Δt
其中,pvt_time表示高精度的GNSS时间,Δt表示补偿时间,timestamp表示向域控系统同步的时间。
解算完成的UTC时间是无法直接同步到域控系统上的,因此,需要将UTC时间转换为Linux所能接受的系统时间,同时将授时时区转换为东八区北京时间,并通过系统调用,将当前时间同步程序从用户态转为内核态,由内核将转换后的Linux系统时间同步给域控系统,至此实现高精度的时间同步功能,解决自动驾驶域控中各系统由于不同的晶振而导致的时间偏差,并提高了时间同步的可靠性和精确度。
通过硬件驱动为GNSS接收机映射对应的节点,用来输出PPS脉冲信号和GNSS报文数据,如图3所示,PPS秒脉冲信号与UBX-NAV-PVT时间报文在同一时刻发送,误差为纳秒级别。脉冲宽度一般为10-100ms,UBX-NAV-PVT是一条包含纳秒的高精度时间报文。
若汽车行驶在卫星信号较差的路段,例如隧道、地下车库等复杂地段,可能导致PPS脉冲信号的丢失,此时,通过向GNSS接收机配置模拟脉冲的方式,使得PPS脉冲信号持续输出,与卫星信号较优时无异。当汽车驶离卫星信号较差地段时,恢复输出真实PPS脉冲信号。
以上所述仅为本发明的技术实现及特点,但不用于限制本发明,对于本领域的技术人员,本发明方案可以有各种修改和变化,在不脱离本发明原理的前提下,还可以实现其他的时间解算方案,这类修改也应包含在本发明的保护范围之内。