2

我正在尝试从 pixhawk 中获取 GPS 时间。我发现了很多关于此类的讨论,但似乎都没有解决。有更新吗?

这个人和这个人都被告知只使用系统时间(不是UTC)我也尝试获取GLOBAL_POSITION_INT_COV,但发现它不可用。

是一个关于从未解决的长期开发讨论(大约 2013 年)

另一个开发人员讨论引用了一堆这样的拉取请求 - 但看起来他们中的任何一个都没有进入过,或者我错了吗?

非常感谢!

4

2 回答 2

3

如您的第二个链接中所述,ArduPilot 在SYSTEM_TIME消息中发送 unix 时间。您没有提及您使用的是什么语言,但是在 Python 中,可以使用该datetime模块轻松地将 unix 时间转换为 UTC。

@vehicle.on_message('SYSTEM_TIME')
def listener(self, name, message):
    unix_time = (int) (message.time_unix_usec/1000000)
    print(datetime.datetime.fromtimestamp( unix_time ))
于 2016-07-18T02:02:04.643 回答
0

MAVLink 消息中报告的 GPS 时间分为两部分:GPS 周数和自该周开始以来的毫秒数。此外,需要知道 GPS 周何时开始(1980 年 1 月 6 日)。

这里有一些对我来说似乎很好用的 javascript 代码(可以很容易地移植到其他语言):

// no. of milliseconds in a date since midnight of
// January 1, 1970, according to UTC time;
// months are zero-based, but days are 1-based
var GPS_EPOCH_MILLIS = (new Date(1980, 0, 6, 0, 0, 0, 0)).getTime();

// all the leap seconds that have been defined so far;
// must keep this list current!
var leapSecondsMillis = [
    (new Date(1981, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1982, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1983, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1985, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1988, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1990, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1991, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1992, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1993, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1994, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1996, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1997, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(1999, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(2006, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(2009, 0, 1, 0, 0, 0, 0)).getTime(),
    (new Date(2012, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(2015, 6, 1, 0, 0, 0, 0)).getTime(),
    (new Date(2017, 0, 1, 0, 0, 0, 0)).getTime()
];

// convert GPS time to a date & time object
var gpsTimeToDate = function(gpsWeek, millisIntoGPSWeek) {
    return new Date(gpsTimeToMillis(gpsWeek, millisIntoGPSWeek));
};

// 604,800 seconds in a week (60 x 60 x 24 x 7)
var gpsTimeToMillis = function(gpsWeek, millisIntoGPSWeek) {
    var millis = GPS_EPOCH_MILLIS + (gpsWeek * 604800000) + millisIntoGPSWeek; 

    // add leap seconds as appropriate
    for (var leap in leapSecondsMillis)
        if (millis >= leap)
            millis -= 1000;

    return millis;
};
于 2018-06-04T17:43:29.303 回答