Мне нужна помощь в получении эллипсоидальной высоты из шапки Adafruit Ultimate GPS (прикрепленной к Raspberry pi) с использованием libgps. Вот упрощенная версия моего кода:
#include <cstdlib>
#include <iostream>
#include <gps.h>
#include <libgpsmm.h>
#include <ctime>
using namespace std;
int main(int argc, char** argv)
{
gpsmm gps_rec("localhost", DEFAULT_GPSD_PORT);
if (gps_rec.stream(WATCH_ENABLE | WATCH_JSON) == NULL)
{
cerr << "No GPSD running.\n";
return 1;
}
for (;;)
{
struct gps_data_t *gpsd_data;
if (!gps_rec.waiting(1000000))
continue;
if ((gpsd_data = gps_rec.read()) == NULL)
{
cerr << "GPSD read error.\n";
return 1;
}
if(gpsd_data->status == STATUS_FIX && (gpsd_data->fix.mode == MODE_2D || gpsd_data->fix.mode == MODE_3D))
{
//Get Latitude, Longitude
double latitude = gpsd_data->fix.latitude;
double longitude = gpsd_data->fix.longitude;cout <<"latitude "<<latitude<<", longitude "<<longitude;
if(gpsd_data->fix.mode == MODE_3D)
{
double altitude = gpsd_data->fix.altitude;
double geoid = gpsd_data->separation;
//double geoid = wgs84_separation(latitude,longitude);
cout <<", altitude "<<altitude<<", geoid "<<geoid;
}
cout<<"\n";
}
}
return 0;
}
Я планировал получить разделение gpsd_data-> fix.altitude и gpsd_data-> (которое подразумевается как геоидальное разделение, MSL — WGS84 (метры) в соответствии с файлом заголовка gps.h) и использовать их для расчета высоты эллипсоида согласно эта ссылка.
NMEA предложения выглядят так:
$ GPGGA, 002808,000, 2734,6994, S, 15305,9456, E, 2,07, 1,06, 64,0, M, 36,8, M, 0000,0000 * 43, в котором говорится, что расстояние между геоидами составляет 36,8 метра согласно эта ссылка .
Но значение разделения gpsd_data-> всегда кажется нуль. Я также пытался передать значения lat, lon в функцию wgs84_separation, но, похоже, она не точна (возвращает 39.2 вместо 36.8). Если нет другого способа получить эллипсоидальную высоту, для меня важно правильно определить значение разделения геоидов, потому что GPS будет летать на летающем объекте.
Задача ещё не решена.
Других решений пока нет …