如何使用libgps从GPSD获取椭球高?

时间:2018-09-26 01:33:05

标签: c++ gpsd

我需要使用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会在飞行物体上飞行。

0 个答案:

没有答案