泰斗 GPS模块调试(1)

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

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

   https://wenku.baidu.com/view/5a990a6a79563c1ec5da7186.html

  BCC校验(异或校验)在线计算:http://www.ip33.com/bcc.html

  日期/时间:  http://leapsecond.com/java/gpsclock.htm

  • 本地时间是您的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:https://github.com/rtklibexplorer/RTKLIB

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源码阅读笔记:

https://zhuanlan.zhihu.com/p/78359579

二、GNSS-SDRLIB
1、GNSS-SDRLIB

https://github.com/taroz/GNSS-SDRLIB

2、

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

https://blog.csdn.net/eaglesoars/article/details/80787465

/*以下的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)可设置静止模式、行走模式、汽车模式、海上模式、飞行模式,通过设置这些参数来解决漂移问题。

发布了24 篇原创文章 · 获赞 46 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m0_37777700/article/details/103716244