Были ли какие-либо из этих попыток получить время GPS в mavlink успешными?
Я пытаюсь вывести время GPS из ястреба. Я нашел кучу дискуссий по этому поводу, но ни одна из них, похоже, не была решена. Есть ли обновление?
Этому парню и этому парню сказали, что нужно использовать только системное время (не UTC). Я также пытался получить GLOBAL_POSITION_INT_COV, но обнаружил, что оно недоступно.
Вот длинная дискуссия разработчика о том, что никогда не было решено (около 2013)
Другое обсуждение разработчиков, которое ссылается на кучу запросов на получение таких запросов, но не похоже, что кто-либо из них когда-либо делал это, или я ошибаюсь?
Большое спасибо!
2 ответа
Как отмечено в вашей второй ссылке, ArduPilot отправляет время Unix в 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 ))
Время 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;
};