如何解决从 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;
}
这是我得到的示例输出:
其中一个观察是解析出来的经度值实际上是高度值(427m) 解析的高度值以一种荒谬的方式波动。 解析的纬度值实际上是我的经度值。 解析的时间戳没有改变,也不正确。
谢谢
解决方法
这是不同库版本的问题。 gps_data 结构的一些变化是在较新版本的 libgpsmm (3.22) 中引入的,而我使用的是旧版本。因此,我得到了错误的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。