c++ - GPSD读数hdop

标签 c++ c gps gpsd

提前谢谢您,

这是如何从 gpsd(版本 gpsd-2.37)的观察者模式获取 hdop 和其他数据的正确方法吗?

下面的代码工作正常,但我没有使用 gpsd 的经验,并且不确定我调用函数的方式是否:

  • gps_query(gpsHandle, "w+\n");

  • gps_query( gpsHandle, "q\n");

  • gpsProcess( &newGpsData ) -> gps_poll( &newGpsData )

正确。

编辑#1: 我添加了 gpsd 内部流的日志记录,所以我发现,当我运行时 "gps_query( gpsHandle, "q\n");" 它将添加一行 “GPSD,Q=9 0.00 3.73 1.89 2.82 6.52” 到它,“gps_unpack”将用

解析它
sscanf(sp, "Q=%d %lf %lf %lf %lf %lf",
               &gpsdata->satellites_used,
               &gpsdata->pdop,
               &gpsdata->hdop,
               &gpsdata->vdop,
               &gpsdata->tdop,
               &gpsdata->gdop);

谢谢
一月

gps_query(gpsHandle, "w+\n");      // Place in watcher mode
for (;;)
    {
        if ( gpsProcess( &newGpsData ) )
        {
            syslog( LOG_INFO, "jlazar gpsProcess reported event, "
                    "online = %d, status = %d, sats = %d, used = %d",
                    (int)newGpsData.online, newGpsData.status, newGpsData.satellites, newGpsData.satellites_used );
            syslog( LOG_INFO, "jlazar gpsProcess if pdop=%f, hdop=%f, vdop=%f, tdop=%f, gdop=%f",
                    newGpsData.pdop, newGpsData.hdop, newGpsData.vdop, newGpsData.tdop, newGpsData.gdop );
            // double pdop, hdop, vdop, tdop, gdop; /* Dilution of precision */
            pthread_mutex_lock( &gpsInfo_mutex );

            gpsInfoCache.online          = (newGpsData.online != 0);
            gpsInfoCache.status          = newGpsData.status;               // Assumes GPS_SERVICE_STATUS_* constants in gps_services.h match STATUS_* constants in gps.h
            gpsInfoCache.satellites_used = newGpsData.satellites_used;
            gpsInfoCache.satellites      = newGpsData.satellites;
            gpsInfoCache.ROCCorrection = getAverageROCCorrection( getROCCorrection( newGpsData.hdop ) );

            if ( gpsInfoCache.status != GPS_SERVICE_STATUS_NO_FIX )
            {
                time_t gpsTime;
                struct tm tmTime;
                /* Convert latitude */
                latlon                  = newGpsData.fix.latitude;
                latlon                 *= DEG_TO_MSEC;  /* convert to milliseconds */
                gpsInfoCache.lat_msec   = (int)(latlon);
                /* Convert longitude */
                latlon                  = newGpsData.fix.longitude;
                latlon                 *= DEG_TO_MSEC;  /* convert to milliseconds */
                gpsInfoCache.lon_msec   = (int)(latlon);

                gpsInfoCache.heading    = (int)newGpsData.fix.track;
                gpsInfoCache.velocity   = (int)(newGpsData.fix.speed * MPS_TO_KNOTS * 1000);
                gpsInfoCache.avgVelocity = getAverageSpeed(gpsInfoCache.velocity);

                gpsTime                 = (time_t)newGpsData.fix.time;
                gmtime_r(&gpsTime, &tmTime);
// syslog( LOG_INFO, "pollGpsd() Got Fix %d, %d", gpsInfoCache.lat_msec, gpsInfoCache.lon_msec );
            }
            else
            {
                gpsInfoCache.lat_msec   = 0;
                gpsInfoCache.lon_msec   = 0;
                gpsInfoCache.avgVelocity = getAverageSpeed(0);

//                  syslog( LOG_INFO, "pollGpsd() Got No Fix" );
            }

            pthread_mutex_unlock( &gpsInfo_mutex );
        }

        gps_query( gpsHandle, "q\n" ); // a count of satellites used in the last fix, and  five  dimensionless  dilution-of-precision  (DOP) numbers  --  spherical,  horizontal,  vertical,  time, and total geometric
        sleepMs( 1000 );
    }

最佳答案

这适用于新的 GPSD 版本吗?因为他们转向了 JSON 接口(interface)来与 gpsd 通信。

如果您正在使用旧版本,请尝试查看 libgps.c 和 gps_unpack 函数。

gps_unpack 将格式化消息发送给应用程序。尝试 grep hdop 信息,它必须是卫星信息结构之一。

关于c++ - GPSD读数hdop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19448134/

相关文章:

c++ - 为什么这个 c++ 数组运算符的读取变体在一个类中没有被调用

c - 将字符串插入链表结构

c++ - 不同库中的相同符号和链接顺序

java - 添加 AsyncTask - Android

java - android中如何确定位置?

c++ - weak_ptr 奇怪的复制构造函数

c++ - 错误 : cannot convert Elem to Elem* for argument 1 to void addHead(Elem*, 元素 *)

c++ - 指针容器上的 std::for_each

检查井字棋中对角线是否获胜

vba - Excel VBA打开文件夹并获取其中每个文件的GPS信息(Exif)