代码之家  ›  专栏  ›  技术社区  ›  Farshad Z

从USB GPS解码GPS坐标

  •  0
  • Farshad Z  · 技术社区  · 7 年前

    我有GPS/GLONASS U-BLOX 7。当我运行U-Center应用程序时,它可以显示纬度和经度。然而,我需要从串口解码这个值(在python代码中添加它们)。 我的问题是我找不到对接的工作原理。U-Center应用程序正在接收这些数据。当我搜索NMEA命令时,似乎缺少一些数据。但我想知道U-Center是如何解码Lat和Long的。

    有人有主意吗?

    以下是我的GPS数据从串行端口的输出:

    08:58:08  $GPRMC,085808.00,V,,,,,,,211217,,,N*76    
    08:58:08  $GPVTG,,,,,,,,,N*30  
    08:58:08  $GPGGA,085808.00,,,,,0,00,99.99,,,,,,*6B  
    08:58:08  $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30  
    08:58:08  $GPGSV,3,1,10,03,83,342,,09,14,211,,11,35,165,,12,02,352,*78  
    08:58:08  $GPGSV,3,2,10,14,21,046,,17,42,279,,19,33,304,,22,67,073,*7B
    08:58:08  $GPGSV,3,3,10,23,46,197,,32,01,042,*72
    08:58:08  $GPGLL,,,,,085808.00,V,N*47
    08:58:09  $GPRMC,085809.00,V,,,,,,,211217,,,N*77
    08:58:09  $GPVTG,,,,,,,,,N*30
    08:58:09  $GPGGA,085809.00,,,,,0,00,99.99,,,,,,*6A
    08:58:09  $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
    08:58:09  $GPGSV,3,1,10,03,83,342,,09,14,211,,11,35,165,,12,02,352,*78
    08:58:09  $GPGSV,3,2,10,14,21,046,,17,42,279,13,19,33,304,,22,67,073,*79   
    08:58:09  $GPGSV,3,3,10,23,46,197,,32,01,042,*72   
    08:58:09  $GPGLL,,,,,085809.00,V,N*46   
    08:58:10  $GPRMC,085810.00,V,,,,,,,211217,,,N*7F   
    08:58:10  $GPVTG,,,,,,,,,N*30   
    08:58:10  $GPGGA,085810.00,,,,,0,00,99.99,,,,,,*62  
    08:58:10  $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30    
    08:58:10  $GPGSV,3,1,10,03,83,342,,09,14,211,,11,35,165,,12,02,352,*78    
    08:58:10  $GPGSV,3,2,10,14,21,046,,17,42,279,,19,33,304,,22,67,073,*7B     
    08:58:10  $GPGSV,3,3,10,23,46,197,,32,01,042,*72     
    08:58:10  $GPGLL,,,,,085810.00,V,N*4E    
    08:58:11  $GPRMC,085811.00,V,,,,,,,211217,,,N*7E    
    08:58:11  $GPVTG,,,,,,,,,N*30    
    08:58:11  $GPGGA,085811.00,,,,,0,00,99.99,,,,,,*63     
    08:58:11  $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30    
    08:58:11  $GPGSV,3,1,10,03,83,342,,09,14,211,,11,35,165,,12,02,352,*78    
    08:58:11  $GPGSV,3,2,10,14,21,046,,17,42,279,17,19,33,304,,22,67,073,*7D  
    08:58:11  $GPGSV,3,3,10,23,46,197,,32,01,042,*72    
    08:58:11  $GPGLL,,,,,085811.00,V,N*4F     
    08:58:12  $GPRMC,085812.00,V,,,,,,,211217,,,N*7D     
    08:58:12  $GPVTG,,,,,,,,,N*30     
    08:58:12  $GPGGA,085812.00,,,,,0,00,99.99,,,,,,*60    
    08:58:12  $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30    
    08:58:12  $GPGSV,3,1,10,03,83,344,,09,14,211,,11,35,165,,12,02,352,*7E     
    08:58:12  $GPGSV,3,2,10,14,21,046,,17,42,279,,19,33,304,,22,67,073,*7B   
    08:58:12  $GPGSV,3,3,10,23,46,197,,32,01,042,*72       
    08:58:12  $GPGLL,,,,,085812.00,V,N*4C    
    08:58:13  $GPRMC,085813.00,V,,,,,,,211217,,,N*7C   
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Mika Sundland    7 年前

    您的日志中有以下NMEA句子:

    • RMC公司
    • VTG公司
    • GGA公司
    • GSV公司
    • GLL公司

    (标签前面的GP字母是通话者ID,与此处无关。)

    VTG是一个包含速度和航向的句子,与此处无关。GSV显示视图中的卫星数量,不能用于提取位置。

    因此,当您想要查找经度和纬度时,可以在RMC、GGA和GLL之间进行选择。它们通常具有以下格式:

    RMC :

    $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
    
    Where:
         RMC          Recommended Minimum sentence C
         123519       Fix taken at 12:35:19 UTC
         A            Status A=active or V=Void.
         4807.038,N   Latitude 48 deg 07.038' N
         01131.000,E  Longitude 11 deg 31.000' E
         022.4        Speed over the ground in knots
         084.4        Track angle in degrees True
         230394       Date - 23rd of March 1994
         003.1,W      Magnetic Variation
         *6A          The checksum data, always begins with *
    

    如果我们将定义与您的一句话相匹配:

    $GPRMC,085808.00,V,,,,,,,211217,,,N*76

    我们可以看到,修正是在UTC时间08:58进行的,但信号现在无效(无效)。字段为空,因为您没有修复程序。如果您确实有一个补丁,您将看到与定义中类似的数字。

    GGA :

     $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
    
    Where:
         GGA          Global Positioning System Fix Data
         123519       Fix taken at 12:35:19 UTC
         4807.038,N   Latitude 48 deg 07.038' N
         01131.000,E  Longitude 11 deg 31.000' E
         1            Fix quality: 0 = invalid
                                   1 = GPS fix (SPS)
                                   2 = DGPS fix
                                   3 = PPS fix
                       4 = Real Time Kinematic
                       5 = Float RTK
                                   6 = estimated (dead reckoning) (2.3 feature)
                       7 = Manual input mode
                       8 = Simulation mode
         08           Number of satellites being tracked
         0.9          Horizontal dilution of position
         545.4,M      Altitude, Meters, above mean sea level
         46.9,M       Height of geoid (mean sea level) above WGS84
                          ellipsoid
         (empty field) time in seconds since last DGPS update
         (empty field) DGPS station ID number
         *47          the checksum data, always begins with *
    

    如果我们将定义与您的一句话相匹配:

    $GPGGA,085808.00,,,,,0,00,99.99,,,,,,*6B

    我们可以看到修复质量为0,而您没有修复。GPS单元在经度和纬度字段中发送空白值。

    GLL :

      $GPGLL,4916.45,N,12311.12,W,225444,A,*1D
    
    Where:
         GLL          Geographic position, Latitude and Longitude
         4916.46,N    Latitude 49 deg. 16.45 min. North
         12311.12,W   Longitude 123 deg. 11.12 min. West
         225444       Fix taken at 22:54:44 UTC
         A            Data Active or V (void)
         *iD          checksum data
    

    如果我们将定义与您的一句话相匹配:

    $GPGLL,,,,,085808.00,V,N*47

    这句话也是 无效的 ,表示不发送经度或纬度。


    因此,当您开始接收正确的数据时,日志将更像我列出的定义。数据活动标志将从 五、 A. 字段将具有值,而不是为空。你可能必须到外面去,得到一个好的信号,这才会发生。要提取数据,您必须在RMC、GGA或GLL语句中进行选择:它们都包含您要查找的内容。

    为了实际解析Python中的数据,可以使用一个库,例如 pynmea2 , micropyGPS 或者类似的东西。或者你可以自己写逻辑。

    自己编写逻辑应该很简单。只需将电报拆分为 , 作为拆分字符。最后一个字段也必须拆分为 * 分隔字段和校验和。

        2
  •  0
  •   Farshad Z    7 年前

    嗯,在进行了更多测试之后,我发现在某个时间点,它会收到如下GPGLL: $GPGLL,4908.59700,北,00912.84108,东,122829.00,A,A*6A 使用NMEA格式,我可以提取我的Lat和Lon,但我仍然不知道U-Center是如何获得该值的,但我假设它们显示了最后接收到的位置。 如果有人有任何想法,如果你能与我分享,我将不胜感激。 谢谢