泰斗 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
$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
<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
<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
<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
<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:校验值
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)可设置静止模式、行走模式、汽车模式、海上模式、飞行模式,通过设置这些参数来解决漂移问题。