c++ - 从 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),解析出的海拔值以一种荒谬的方式波动。解析的纬度值实际上是我的经度值。解析的时间戳不会改变并且不正确。
谢谢
解决方案
这是不同库版本的问题。在较新版本的 libgpsmm (3.22) 中引入了 gps_data 结构的一些更改,而我使用的是旧版本。因此,我得到了错误的数据。
推荐阅读
- android - Android base64 PDF打印选项
- entity-framework - 如何有效地遍历所有行并在 EF Core 中应用更新?
- javascript - Ajax 调用不等待变量刷新
- angular - 为什么迭代 ViewChildren QueryList 只显示一个数组元素?
- amazon-web-services - 如何使用 CloudFormation 为多个日志组创建 AWS CloudWatch 订阅过滤器
- php - 如何在 MYSQL Point 中存储两个 API 值
- python - 如何重新排序一个 numpy 数组(矩阵),使得 Matrix = [ Identity | Residue ](只是移动列)
- javascript - 我怎样才能第二次使用停止?
- android - 无法在 Kotlin 的电子邮件编写器中获取“粗体”HTML 文本
- python - Matplotlib 子图轴在绘制数据后改变大小