Получение неверных данных с GPS

Я пытался реализовать программу для распечатки моих GPS-координат. Однако я получаю данные, которые не имеют никакого смысла.

файлы моего класса:

class GpsHandler
{
public:
    GpsHandler(const std::string& gpsDaemonIpAddress, uint16_t updateRate);

    ~GpsHandler();

    void initialize();
    void printoutData();
private:
    std::shared_ptr<gpsmm> m_gpsRec;
    struct gps_data_t*     m_currentGpsData;
};


GpsHandler::GpsHandler(const std::string& gpsDaemonIpAddress, uint16_t updateRate)
m_gpsRec(std::make_shared<gpsmm>(gpsDaemonIpAddress.c_str(), DEFAULT_GPSD_PORT)),
s_updaterate(updateRate)
{}

void GpsHandler::initialize()

{
    if (m_gpsRec->stream(WATCH_ENABLE | WATCH_JSON) == nullptr) {
        LOG4CPLUS_ERROR(m_logger, "No GPSD daemon running");
        throw std::runtime_error("No GPSD daemon running");
    }

    if (!m_gpsRec->is_open()) {
        LOG4CPLUS_ERROR(m_logger, "Open connection to gps daemon failed");
        throw std::runtime_error("Open connection to gps daemon failed");
    }
}

void GpsHandler::printoutData()
{
    if (!m_gpsRec->waiting(50000)) {
        LOG4CPLUS_WARN(m_logger, "Wait for gps daemon failed");
    }

    if ((m_currentGpsData = m_gpsRec->read()) != nullptr) {
        if (m_currentGpsData->set & ONLINE_SET) {
            LOG4CPLUS_INFO_FMT(m_logger, "Online: %lf", m_currentGpsData->online);
        }

        if (m_currentGpsData->set & TIME_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "Time: %lf", m_currentGpsData->fix.time);

        if (m_currentGpsData->set & LATLON_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "LATLON: lat/lon: %lf %lf", m_currentGpsData->fix.latitude, m_currentGpsData->fix.longitude);

        if (m_currentGpsData->set & ALTITUDE_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "ALTITUDE: altitude: %lf  U: climb: %lf\n", m_currentGpsData->fix.altitude, m_currentGpsData->fix.climb);

        if (m_currentGpsData->set & SPEED_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "SPEED: %lf\n", m_currentGpsData->fix.speed);

        if (m_currentGpsData->set & TRACK_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "TRACK: track: %lf\n", m_currentGpsData->fix.track);

        if (m_currentGpsData->set & STATUS_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "STATUS: status: %d\n", m_currentGpsData->status);

        if (m_currentGpsData->set & MODE_SET)
            LOG4CPLUS_INFO_FMT(m_logger, "MODE: mode: %d\n", m_currentGpsData->fix.mode);

    } else {
        LOG4CPLUS_INFO(m_logger, "error reading ");
    }
}


моя основная программа:

int main(int argc, char* argv[])
{
    try {
        QCoreApplication app(argc, argv);

        int sleepStep = 500000;
        std::shared_ptr<GpsHandler> m_gpsHandler;
        m_gpsHandler = std::make_shared<GpsHandler>("local  host ip address", 2); 
                      
        m_gpsHandler->initialize();

        while (!m_signalcaught) {
            m_gpsHandler->printoutData();
             usleep(sleepStep);
}
 } catch (std::exception& e) {
    }
    return 0;
} 

и это образец вывода, который я получаю:

введите здесь описание изображения

Одним из наблюдений является то, что проанализированное значение долготы на самом деле является значением высоты (427 м), проанализированное значение высоты колеблется абсурдным образом. проанализированное значение широты на самом деле является моим значением долготы. проанализированная отметка времени не изменяется и неверна.

Спасибо


person Hesham.K    schedule 08.02.2021    source источник
comment
@john Спасибо за ваш комментарий. Я использую эти библиотеки, используя функцию read(). вот репозиторий github для библиотек: github.com/ukyg9e5r6k7gubiekd6/gpsd/blob /мастер/libgpsmm.h   -  person Hesham.K    schedule 08.02.2021
comment
Вы ничего не инициализируете m_gpsHandler.   -  person Mike Vine    schedule 08.02.2021
comment
@MikeVine на самом деле да, но я забыл включить его в этот пример кода. В моем оригинале я использую некоторые файлы конфигурации и так далее, и я не хотел усложнять это. Однако сейчас он более-менее обновлен.   -  person Hesham.K    schedule 08.02.2021


Ответы (1)


Это была проблема разных версий библиотек. Некоторые изменения в структуре gps_data были введены в более новой версии libgpsmm (3.22), а я использовал более старую. Поэтому я получил неверные данные.

person Hesham.K    schedule 12.02.2021