Были ли какие-либо из этих попыток получить время GPS в mavlink успешными?

dronekit-python mavlink

767 просмотра

2 ответа

1 Репутация автора

Я пытаюсь вывести время GPS из ястреба. Я нашел кучу дискуссий на эту тему, но ни одна из них, похоже, не была решена. Есть ли обновление?

Этому парню и этому парню сказали, что нужно использовать только системное время (не UTC). Я также попытался получить GLOBAL_POSITION_INT_COV, но обнаружил, что оно недоступно.

Вот длинная дискуссия разработчика о том, что никогда не было решено (около 2013)

Другое обсуждение разработчиков, которое ссылается на кучу запросов на получение таких запросов, но не похоже, что кто-либо из них когда-либо делал это, или я ошибаюсь?

Большое спасибо!

Автор: r4space Источник Размещён: 17.07.2016 10:05

Ответы (2)


1 плюс

340 Репутация автора

Как отмечено в вашей второй ссылке, ArduPilot отправляет unix time в SYSTEM_TIMEсообщении. Вы не упомянули, какой язык вы используете, но в Python время unix можно легко преобразовать в UTC с помощью datetimeмодуля.

@vehicle.on_message('SYSTEM_TIME')
def listener(self, name, message):
    unix_time = (int) (message.time_unix_usec/1000000)
    print(datetime.datetime.fromtimestamp( unix_time ))
Автор: squilter Размещён: 18.07.2016 02:02

0 плюса

1 Репутация автора

Время GPS, сообщаемое в сообщениях MAVLink, состоит из двух частей: номер недели GPS и число миллисекунд с начала этой недели. Кроме того, необходимо знать, когда начались недели GPS (6 января 1980 г.).

Вот немного кода 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;
};
Автор: Will Bain Размещён: 04.06.2018 05:43
Вопросы из категории :
32x32