как преобразовать время GPS, состоящее из времени, недель и дополнительных секунд в метку времени UTC - PullRequest
0 голосов
/ 04 ноября 2019

Я получаю эти данные от встроенного в мое транспортное средство GPS:

INS_Time::INS_Time_Millisec[ms]   # example of the value: 295584830.0
INS_Time::INS_Time_Week[Week]  # example of the value: 2077.0
INS_Time::Leap_seconds[s]  # example of the value: 18.0

мне нужна временная метка UTC, поэтому я предполагаю, что мне нужно объединить все эти разные времена из GPS, чтобы получить временную метку UTC, ноЯ не знаю, как это должно быть сделано. Я был бы благодарен, если бы кто-нибудь мог мне помочь в этом.

example of the result I want to have: 1572430625230

Я использую Python 3.7, если есть библиотека для этого, было бы очень полезно, иначе я ищу также Алгоритм длясделай это

1 Ответ

2 голосов
/ 04 ноября 2019

Мое предположение:

Согласно https://en.wikipedia.org/wiki/Epoch_(computing)#Notable_epoch_dates_in_computing, эпоха GPS - 6 января 1980 года, GPS counts weeks (a week is defined to start on Sunday) and 6 January is the first Sunday of 1980

И согласно http://leapsecond.com/java/gpsclock.htm, GPS time was zero at 0h 6-Jan-1980 and since it is not perturbed by leap seconds GPS is now ahead of UTC by 18 seconds.

Итак, мы должны определить gps_epoch и вычесть заданные високосные секунды, чтобы иметь utc datetime

from datetime import datetime, timedelta
import pytz

def gps_datetime(time_week, time_ms, leap_seconds):
    gps_epoch = datetime(1980, 1, 6, tzinfo=pytz.utc)
    # gps_time - utc_time = leap_seconds
    return gps_epoch + timedelta(weeks=time_week, milliseconds=time_ms, seconds=-leap_seconds)

В вашем примере

>>>gps_datetime(2077, 295584830.0,18.0)
datetime.datetime(2019, 10, 30, 10, 6, 6, 830000, tzinfo=<UTC>)
>>>gps_datetime(2077, 295584830.0,18.0).timestamp()
1572429966.83  

Но яЯ довольно далеко от ожидаемого результата (1572430625230, даже если он выражен в мс)

Не забудьте pip install pytz

...