我需要使用libgps从Adafruit Ultimate GPS帽子(连接到Raspberry pi上)获取椭圆高度的帮助。这是我的代码的简化版本:
#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-> separation(根据gps.h标头文件,这是大地水准面分离,MSL-WGS84(米)),并使用它们来计算椭球高按照this link。
NMEA语句如下: $ GPGGA,002808.000,2734.6994,S,15305.9456,E,2,07,1.06,64.0,M,36.8,M,0000,0000 * 43,根据this link,大地水准面间距为36.8米。 但是gpsd_data-> separation值似乎总是零。我也尝试将lat,lon值传递给wgs84_separation函数,但它似乎并不准确(返回39.2而不是36.8)。如果没有其他方法可以获取椭球体高度,那么对我来说,正确获取大地水准面分离值非常重要,因为GPS会在飞行物体上飞行。