泰斗 GPS模块调试(1)

本文详细介绍了GPS信息类型和数据包格式,包括GPGSV、GPGLL、GPRMC、GPVTG、GPGGA和GPGSA等常见NMEA语句的字段解析,探讨了GPS定位精度、漂移现象及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

GPS信息类型:
  • GPGSV:可见卫星信息
  • GPGLL:地理定位信息
  • GPRMC:推荐最小定位信息
  • GPVTG:地面速度信息
  • GPGGA:GPS定位信息
  • GPGSA:当前卫星信息

GPS数据包格式+数据解析_gps 数据_jwq2011的博客-CSDN博客

   泰斗 GPS :https://topsemic.com/wp-content/uploads/2019/02/GPS模块使用经验分享.pdf

   GPS+北斗 N303双模导航定位模块用户手册

   百度文库安全验证

  BCC校验(异或校验)在线计算:BCC校验(异或校验)在线计算_ip33.com

  日期/时间:  GPS, UTC, and TAI Clocks

  • 本地时间是您的PC报告的日期/时间(通过网络浏览器查看)。如果您的PC时钟精确到一秒,则上面显示的其他时间刻度也将精确到一秒以内。
  • UTC(协调世界时),通常称为GMT(格林威治标准时间)或Zulu时间。当地时间与UTC的时区时数不同。
  • GPS,即全球定位系统时间,是由GPS地面控制站和GPS卫星本身中的原子钟实现的原子时标。GPS时间在1980年1月6日0时为零,由于不受leap秒干扰,因此GPS现在比UTC提前 18秒。
  • Loran-C(远程导航时间)是由Loran-C链发射器站点中的原子钟实现的原子时间标度。Loran时间在1958年1月1日0h时为零,并且由于不受leap秒干扰,因此现在比UTC早 27秒。
  • TAI,国际原子钟,是基于对SI秒的连续计数的国际原子钟。TAI目前比UTC领先 37秒。TAI总是比GPS领先19秒。

$BDGGA,144745.000,3906.1703,N,11720.8518,E,1,08,1.2,20.0,M,0.0,M,,*4B
$BDGLL,3906.1703,N,11720.8518,E,144745.000,A,A*47
$BDGSA,A,3,07,12,10,01,06,08,09,11,,,,,2.2,1.2,1.8*2A
$BDGSV,2,1,08,01,40,146,23,06,15,191,12,07,74,011,42,08,22,164,16*62
$BDGSV,2,2,08,09,32,213,24,10,58,303,41,11,60,115,31,12,27,045,47*62
$BDRMC,144745.000,A,3906.1703,N,11720.8518,E,0.00,354.69,251117,,,A*7C
$BDVTG,354.69,T,,M,0.00,N,0.00,K,A*21
$BDZDA,144745.000,25,11,2017,00,00*43
$GPTXT,01,01,01,ANTENNA OK*35

3906.1703,N,11720.8518,E,北纬39度06分10.218秒,东经117度20分51.108秒

3906.1704,N,11720.8518,E,北纬39度06分10.224秒,东经117度20分51.108秒

经度不变,维度增加0.0001,即0.006秒,换算成距离约为0.2米

纬度不变,经度增加0.0001,即0.006秒,换算成距离约为0.1米

原理

地球的子午线总长度大约40008km。平均:
纬度1度 = 大约111km 
纬度1分 = 大约1.85km 
纬度1秒 = 大约30.9m 

假设地球为一半径为R的表面光滑圆球体,
表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600
表面上同一纬线圈上相差1"两点间的距离为 2πR×cos(纬度)/360/3600

当R取半径平均值6371km时,
地球表面上同一经线圈上相差1"两点间的距离约为30.887m
地球表面上同一纬线圈上相差1"两点间的距离约为30.887m×cos(纬度)

北斗较gps信号质量差些,精度也是,天线一定要朝上,开阔无阻碍定位效果才好;gps要好一些

北斗支持短报文,不过北斗二代只有军方能用,北斗一代用的超少,成本高,覆盖范围小

卫星导航开源代码解析

一、RTKLIB
1、github:GitHub - rtklibexplorer/RTKLIB: A version of RTKLIB optimized for single and dual frequency low cost GPS receivers, especially u-blox receivers. It is based on RTKLIB 2.4.3 and is kept reasonably closely synced to that branch. Documentation for RTKLIB is available at rtklib.com. This software is provided “AS IS” without any warranties of any kind so please be careful, especially if using it in any kind of real-time application. Binaries and tutorials for this code, and sample GPS data sets at :

http://rtkexplorer.com/

2、RTKLIB源码之一:单点定位解析

https://www.zybuluo.com/taqikema/note/1101465#matmul

3、从零开始解读RTKLIB:

https://blog.csdn.net/sylvia0726/article/category/7517595

4、RTKLIB源码阅读笔记:

你似乎来到了没有知识存在的荒原 - 知乎

二、GNSS-SDRLIB
1、GNSS-SDRLIB

GitHub - taroz/GNSS-SDRLIB: An Open Source GNSS Software Defined Radio Library

2、

三、网络资源:
1、 开源的GNSS软件接收机工程汇总

开源的GNSS软件接收机工程汇总_gnsstk_平林陌陌如烟织的博客-CSDN博客

/*以下的XX可能为以下三种情况
BD  北斗模式
GP  GPS模式
GN  双模模式
BD北斗导航系统,中国
GPS(全球定位系统),美国
GLONASS(全球轨道导航卫星系统),前苏联
Galileo-ENSS(欧洲导航卫星系统,即伽利略计划),欧盟
*/

/*推荐定位信息数据格式 $XXRMC
$GPRMC,030551.000,A,3906.2586,N,11720.3131,E,0.00,138.07,150718,,,A*6B

$XXRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF> 
<1> 世界时间UTC时间,hhmmss(时分秒)格式 北京时间(BTC),BTC和UTC差了8个小时
<2> 定位状态,A=有效定位,V=无效定位 
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
<4> 纬度半球N(北半球)或S(南半球) 
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
<6> 经度半球E(东经)或W(西经) 
<7> 地面速率(000.0~999.9节,前面的0也将被传输) 
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输) 
<9> UTC日期,ddmmyy(日月年)格式 
<10> 磁偏角(000.0~180.0度,前面的0也将被传输) 
<11> 磁偏角方向,E(东)或W(西) 
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

*/

/*
当前卫星信息 $XXGGA	//GPS定位数据

$GPGGA,030551.000,3906.2586,N,11720.3131,E,1,11,0.9,-6.7,M,0.0,M,,*4B

$XXGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)   
各部分所对应的含义为:    
(1)定位UTC时间:05时09分01秒   
(2)纬度(格式ddmm.mmmm:即dd度,mm.mmmm分);   
(3)N/S(北纬或南纬):北纬39度31.4449分;   
(4)经度(格式dddmm.mmmm:即ddd度,mm.mmmm分);   
(5)E/W(东经或西经):东经116度43.5123分;   
(6)质量因子(0=没有定位,1=实时GPS,2=差分GPS):1=实时GPS;   
(7)可使用的卫星数(0~8):可使用的卫星数=07;   
(8)水平精度因子(1.0~99.9);水平精度因子=1.4;   
(9)天线高程(海平面,-9999.9~99999.9,单位:m);天线高程=76.2m);    
(10)大地椭球面相对海平面的高度(-999.9~9999.9,单位:m):-7.0m;    
(11)差分GPS数据年龄,实时GPS时无:无;  //差分GPS数据期限(RTCMSC-104),最后设立RTCM传送的秒数量  
(12)差分基准站号(0000~1023),实时GPS时无:无;    
*总和校验域;   
hh 总和校验数:65    
(CR)(LF)回车,换行。
*/

/*
GPVTG 地面速度信息   
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh 
  <1> 以正北为参考基准的地面航向(000~359度,前面的0也将被传输) 
  <2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输) 
  <3> 地面速率(000.0~999.9节,前面的0也将被传输) 
  <4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输) 
  <5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效
*/

/*
可见卫星信息 $XXGSV
$XXGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,…<4>,<5>,<6>,<7>*hh<CR><LF> 
<1> GSV语句的总数 //总的GSV语句电文数;2; 
<2> 本句GSV的编号 //当前GSV语句号:1;
<3> 可见卫星的总数(00~12,前面的0也将被传输) 
<4> PRN码(伪随机噪声码)(01~32,前面的0也将被传输) 
<5> 卫星仰角(00~90度,前面的0也将被传输) 
<6> 卫星方位角(000~359度,前面的0也将被传输) 
<7> 信噪比(00~99dB,没有跟踪到卫星时为空,前面的0也将被传输) 
注:<4>,<5>,<6>,<7>信息将按照每颗卫星进行循环显示,每条GSV语句最多可以显示4颗卫星的信息。其他卫星信息将在下一序列的NMEA0183语句中输出。
*/

/*
当前卫星信息 $XXGSA
$XXGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>,<6>*hh<CR><LF> 
<1> 模式,M=手动,A=自动 
<2> 定位类型,1=没有定位,2=2D定位,3=3D定位 
<3> PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。 
<4> PDOP位置精度因子(0.5~99.9) 
<5> HDOP水平精度因子(0.5~99.9) 
<6> VDOP垂直精度因子(0.5~99.9)
字段17:VDOP垂直精度因子(0.5 - 99.9)
字段18:校验值
*/

/*
地理定位信息 $XXGLL

$GPGLL,3906.2586,N,11720.3131,E,030551.000,A,A*5B

$XXGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*hh<CR><LF> 
<1> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输) 
<2> 纬度半球N(北半球)或S(南半球) 
<3> 经度dddmm.mmmm(度分)格式(前面的0也将被传输) 
<4> 经度半球E(东经)或W(西经) 
<5> UTC时间,hhmmss(时分秒)格式 
<6> 定位状态,A=有效定位,V=无效定位 
<7> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效) 
*/

$GPGGA
例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息
字段1:UTC 时间,hhmmss.sss,时分秒格式
字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段3:纬度N(北纬)或S(南纬)
字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段5:经度E(东经)或W(西经)
字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
字段8:HDOP水平精度因子(0.5 - 99.9)
字段9:海拔高度(-9999.9 - 99999.9)
字段10:地球椭球面相对大地水准面的高度
字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
字段13:校验值

$GPGLL
例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息
字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段2:纬度N(北纬)或S(南纬)
字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段4:经度E(东经)或W(西经)
字段5:UTC时间,hhmmss.sss格式
字段6:状态,A=定位,V=未定位
字段7:校验值

$GPGSA
例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息
字段1:定位模式,A=自动手动2D/3D,M=手动2D/3D
字段2:定位类型,1=未定位,2=2D定位,3=3D定位
字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段15:PDOP综合位置精度因子(0.5 - 99.9)
字段16:HDOP水平精度因子(0.5 - 99.9)
字段17:VDOP垂直精度因子(0.5 - 99.9)
字段18:校验值

$GPGSV
例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息
字段1:本次GSV语句的总数目(1 - 3)
字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)
字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)
字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段5:卫星仰角(00 - 90)度(前导位数不足则补0)
字段6:卫星方位角(00 - 359)度(前导位数不足则补0)
字段7:信噪比(00-99)dbHz
字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段9:卫星仰角(00 - 90)度(前导位数不足则补0)
字段10:卫星方位角(00 - 359)度(前导位数不足则补0)
字段11:信噪比(00-99)dbHz
字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段13:卫星仰角(00 - 90)度(前导位数不足则补0)
字段14:卫星方位角(00 - 359)度(前导位数不足则补0)
字段15:信噪比(00-99)dbHz
字段16:校验值


$GPRMC
例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式
字段2:状态,A=定位,V=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度N(北纬)或S(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度E(东经)或W(西经)
字段7:速度,节,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东W=西
字段16:校验值

$GPVTG
例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地面速度信息
字段1:运动角度,000 - 359,(前导位数不足则补0)
字段2:T=真北参照系
字段3:运动角度,000 - 359,(前导位数不足则补0)
字段4:M=磁北参照系
字段5:水平运动速度(0.00)(前导位数不足则补0)
字段6:N=节,Knots
字段7:水平运动速度(0.00)(前导位数不足则补0)
字段8:K=公里/时,km/h
字段9:校验值

U-BLOX GPS 模块及GPRMC指令解析

https://www.cnblogs.com/pingwen/p/5225461.html

/*******************************************************************************
* Function Name  : 
* Description    : 对GPRMC数据包进行解析,找到经纬度数据
* Input          :  
* Output         :  
* Return         :  
*******************************************************************************/
uint8_t read_gps_data(uint8_t *gps_buf, uint8_t frame_len, uint8_t *weidu, uint8_t *jindu)
 {
     uint8_t *weidu_s = NULL;
     uint8_t *weidu_o = NULL;
     uint8_t *jingdu_o = NULL;
     uint8_t rtn =0;
     //GPRMC,133735.00,A,3949.63893,N,11616.48419,E,0.296,,120116,,,A*79
     weidu_s  = strstr(GPS_Frame_Buf, ",A,");
     weidu_o  = strstr(GPS_Frame_Buf, ",N,");
     jingdu_o = strstr(GPS_Frame_Buf, ",E,");
     if((weidu_s == NULL) || (weidu_o == NULL) ||(jingdu_o == NULL) )
     {
         rtn = FALSE;
     }
     else
     {
          memset(weidu_buf,0,sizeof(weidu_buf));
          memset(jindu_buf,0,sizeof(jindu_buf));
          memcpy(weidu_buf, weidu_s+3, (weidu_o-weidu_s-3));
          memcpy(jindu_buf, weidu_o+3, (jingdu_o-weidu_o-3));
          printf("\r\n---------------------------------------");
          printf("\r\nGet GPS Frame:\r\n%s\r\n", GPS_Frame_Buf);
          printf("\r\n---------------------------------------");
          rtn = TRUE;
     }
    return rtn;
}

实际使用中在软件中需要实现的常用功能

在目前手持项目中,正常的定位或导航系统,基本主要完成如下的功能:

读取当前坐标
使用报文:Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息

读取速度
使用报文:Track Made Good and Ground Speed(VTG)地面速度信息

读取方向
使用报文:Track Made Good and Ground Speed(VTG)地面速度信息
--注:速度和方向的计算这块,有一点需要注意,就是GPS接收机并非简单的将两次坐标相减进行计算,而是采用的多普勒效应进行处理,所以在实际应用中,速度和方向的计算会稍后一点延迟,因为信号是1秒接收一次,而且方向的计算还要根据前几秒的方向进行加权平均。

读取卫星数及状态
使用报文:GPS Satellites in View(GSV)可见卫星信息
          GPS DOP and Active Satellites(GSA)当前卫星信息

 GPS的误差

有很多种因素会影响到GPS的准确率,以下是一个GPS误差引入简表:
卫星时钟误差:0-1.5米
卫星轨道误差:1-5米
电离层引入的误差:0-30米
大气层引入的误差:0-30米
接收机本身的噪音:0-10米
多路反射:0-1米
总定位误差:大约28米

上述的简表,并不表示一定会存在这么大的误差,这是给出的最好及最差的范围,当然最好情况不能同时发生,最差的情况也不能同时发生。
实际在卫星的导航电文中,已经包含了大气层的修正参数,能够消除50%到70%的误差,而且这两年出的GPS的误差大致范围是10米或以内。
在现有情况下,民用级单台GPS接收机要想达到1m以内的精度是不可能实现的,原因除GPS本身精度外,还包括地图、定位点测绘、嵌入式设备的运行速度等,所以过度追求定位精度对于民用产品来说已无实际的意义。

GPS的漂移

漂移是GPS导航时需要处理的问题之一,漂移主要有两个方面,第一,速度过快,以至于GPS的响应时间短于当前运行速度,出现漂移;第二,在高大建筑密集或天气情况不好的地方,因为GPS信号经过多次的折、反射,造成信号误差,出现漂移。

解决GPS漂移主要从两方面入手:
一、主系统的设计主要减少在近距离内对GPS信号的干扰。
二、软件处理。软件处理主要集中在导航软件处完成,导航软件会将坐标定位在道路之内,如果GPS接收到的信号超出道路的半径范围将自动过滤这个数据,并根据上次的速度及方向推算出当前点的位置。

对于静态漂移,也有建议做软件判断:
1.检测到的状态为静止时,强制速度为0;
2.速度为0时,强制方向为0;
3.数据中的速度值为0时,就不去更新地图上的经纬度;
4.通过比较上次定位数据的经纬度差的绝对值(同时包括时间)再来判定是否有慢速移动;

另外有些GPS模块(UBLOX)可设置静止模式、行走模式、汽车模式、海上模式、飞行模式,通过设置这些参数来解决漂移问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值