在开发自动驾驶感知系统(见下方链接)过程中,涉及到GPS接收器数据的采集与处理。本分主要分享GPS数据处理的多个问题,包括,但不限于:
若谷:Matlab串口通信读取GPS/镜头/雷达等设备的数据zhuanlan.zhihu.com$GPGGA,055258.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*7E
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055258.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*5B$GPGGA,055259.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*7F
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055259.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*5A$GPGGA,055300.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*72
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055300.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*57$GPGGA,055301.000,3027.4932,N,11424.2381,E,1,06,2.9,102.0,M,-13.6,M,,0000*79
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055301.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*56$GPGGA,055302.000,3027.4932,N,11424.2381,E,1,06,2.9,102.0,M,-13.6,M,,0000*7A
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPGSV,3,1,12,28,82,174,34,06,41,252,36,57,34,129,31,58,32,165,39*77
$GPGSV,3,2,12,30,13,199,39,02,10,244,36,01,14,046,21,03,39,063,26*78
$GPGSV,3,3,12,10,50,145,,12,44,316,,19,43,060,,08,18,305,*77
$GPRMC,055302.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*55
gps接收器硬件串口
% GPS_serialPort_deve
% 获取当前串口状态信息% 关闭此前创建的所有串口
delete(instrfindall)% instrhelp serial% 获取当前所有的串口号;
all_Ports = instrhwinfo('serial')
% 获取所有串口的名称
all_Ports.ObjectConstructorName%使用默认设置创建串口s
% 利用GPSInfo软件,获知当前目标GPS的串口是COM3
% 下列属性,是GPS硬件指定的
s = serial('COM4','BaudRate',4800,'DataBits',8,'Parity','none','StopBits',1, 'FlowControl','none')fopen(s); %打开串口
str = fscanf(s)
fclose(s);
delete(s);
clear s;
gps数据处理
% GPS_serialPort_deve
% 1. 获取当前串口状态信息
% 2. 获取gps 接收器数据
% 3. 解析GPS接收器数据
% https://blog.csdn.net/u010384390/article/details/93055319% 关闭此前创建的所有串口
delete(instrfindall)% instrhelp serial% 获取当前所有的串口号;
all_Ports = instrhwinfo('serial')
% 获取所有串口的名称
all_Ports.ObjectConstructorName%使用默认设置创建串口s
% 利用GPSInfo软件,获知当前目标GPS的串口是COM3
% 下列属性,是GPS硬件指定的
s = serial('COM4','BaudRate',4800,'DataBits',8,'Parity','none','StopBits',1, 'FlowControl','none')fopen(s); %打开串口
% Built-in function.k = datetime
kkk = [num2str(k.Year),'-',num2str(k.Month),'-',num2str(k.Day),'-',num2str(k.Hour),'-',num2str(k.Minute),'-gps_log.txt']gps_log_file = fopen(kkk,'a');%'A.txt'为文件名;'a'为打开方式:在打开的文件末端添加数据,若文件不存在则创建。
i_row = 0;
while i_row <1000i_row &#61; i_row&#43;1str &#61; fscanf(s)S &#61; regexp(str, &#39;,&#39;, &#39;split&#39;);% 只保存$GPGGA&#xff0c;以便获取时间授时、位置if strcmp(S(1),&#39;$GPGGA&#39;) % 解析fprintf(gps_log_file,&#39;%sn&#39;,str);%fp为文件句柄&#xff0c;指定要写入数据的文件。注意&#xff1a;%d后有空格。end
end
fclose(gps_log_file);%关闭文件。fclose(s);
delete(s);
clear s;
GPS协议标准目前常用到的是NMEA-0183&#xff0c;很显然&#xff0c;这是由NMEA发布的一个标准。
NMEA是National Marine Electronics Association &#xff0c;即美国国家海洋电子协会的缩写&#xff0c;NMEA是GPS的管理者&#xff0c;为方便GPS的推广应用&#xff0c;发布了一系列GPS协议的标准格式。
NMEA-0183就是GPS协议标准的一个&#xff0c;它的早期版本为NMEA-0180和NMEA-0182。虽然它现在仍然用得很多&#xff0c;但时光的车轮在前进&#xff0c;它将会逐渐被最新的NMEA 2000所替代。
NMEA&#xff0d;183是一个基于ASCII的串行通信协议&#xff0c;它由一个个的语句组成&#xff0c;理解起来很简单。下面对它的一些常用的语句进行举例说明&#xff0c;这些&#xff0c;是协议分析中会碰到的。这些常用的NMEA-0183语句如下&#xff1a;GPGGA&#xff08;定位信息&#xff09;
$GPGGA,HHMMSS.SS,DDMM.MMMM,S,DDDMM.MMMM,S,N,QQ,PP.P,SAAAAA.AA,M,±XXXX.XX,M,SSS,AAAA*CC
例&#xff1a;
$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,M,19.7,M,,,0000*1F
字段0&#xff1a;$GPGGA&#xff0c;语句ID&#xff0c;表明该语句为Global Positioning System Fix Data&#xff08;GGA&#xff09;GPS定位信息
字段1&#xff1a;UTC 时间&#xff0c;hhmmss.sss&#xff0c;时分秒格式
字段2&#xff1a;纬度ddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;
字段3&#xff1a;纬度N&#xff08;北纬&#xff09;或S&#xff08;南纬&#xff09;
字段4&#xff1a;经度dddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;
字段5&#xff1a;经度E&#xff08;东经&#xff09;或W&#xff08;西经&#xff09;
字段6&#xff1a;GPS状态&#xff0c;0&#61;不可用(FIX NOT valid)&#xff0c;1&#61;单点定位(GPS FIX)&#xff0c;2&#61;差分定位(DGPS)&#xff0c;3&#61;无效PPS&#xff0c;4&#61;实时差分定位&#xff08;RTK FIX&#xff09;&#xff0c;5&#61;RTK FLOAT&#xff0c;6&#61;正在估算
字段7&#xff1a;正在使用的卫星数量&#xff08;00 - 12&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段8&#xff1a;HDOP水平精度因子&#xff08;0.5 - 99.9&#xff09;
字段9&#xff1a;海拔高度&#xff08;-9999.9 - 99999.9&#xff09;
字段10&#xff1a;单位&#xff1a;M&#xff08;米&#xff09;
字段11&#xff1a;地球椭球面相对大地水准面的高度 WGS84水准面划分
字段12&#xff1a;WGS84水准面划分单位&#xff1a;M&#xff08;米&#xff09;
字段13&#xff1a;差分时间&#xff08;从接收到差分信号开始的秒数&#xff0c;如果不是差分定位将为空&#xff09;
字段14&#xff1a;差分站ID号0000 - 1023&#xff08;前导位数不足则补0&#xff0c;如果不是差分定位将为空&#xff09;
字段15&#xff1a;校验值
GPGSA&#xff08;当前卫星信息&#xff09;
$GPGSA,A,B,CC,DD,EE,FF,GG,HH,II,JJ,KK,MM,NN,OO,P.P,Q.Q,R.R*CC
例&#xff1a;
$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
字段0&#xff1a;$GPGSA&#xff0c;语句ID&#xff0c;表明该语句为GPS DOP and Active Satellites&#xff08;GSA&#xff09;当前卫星信息
字段1&#xff1a;定位模式(选择2D/3D)&#xff0c;A&#61;自动选择&#xff0c;M&#61;手动选择
字段2&#xff1a;定位类型&#xff0c;1&#61;未定位&#xff0c;2&#61;2D定位&#xff0c;3&#61;3D定位
字段3&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第1信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段4&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第2信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段5&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第3信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段6&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第4信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段7&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第5信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段8&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第6信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段9&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第7信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段10&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第8信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段11&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第9信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段12&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第10信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段13&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第11信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段14&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第12信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段15&#xff1a;PDOP综合位置精度因子&#xff08;0.5 - 99.9&#xff09;
字段16&#xff1a;HDOP水平精度因子&#xff08;0.5 - 99.9&#xff09;
字段17&#xff1a;VDOP垂直精度因子&#xff08;0.5 - 99.9&#xff09;
字段18&#xff1a;校验值
GPGSV(可见卫星信息)
$GPGSV,T,M,N,II,EE,AAA,SS,…II,EE,AAA,SS,*CC
例&#xff1a;
$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
字段0&#xff1a;$GPGSV&#xff0c;语句ID&#xff0c;表明该语句为GPS Satellites in View&#xff08;GSV&#xff09;可见卫星信息
字段1&#xff1a;本次GSV语句的总数目&#xff08;1 - 3&#xff09;
字段2&#xff1a;本条GSV语句是本次GSV语句的第几条&#xff08;1 - 3&#xff09;
字段3&#xff1a;当前可见卫星总数&#xff08;00 - 12&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段4&#xff1a;PRN 码&#xff08;伪随机噪声码&#xff09;&#xff08;01 - 32&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段5&#xff1a;卫星仰角&#xff08;00 - 90&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段6&#xff1a;卫星方位角&#xff08;00 - 359&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段7&#xff1a;信噪比&#xff08;00&#xff0d;99&#xff09;dbHz
字段8&#xff1a;PRN 码&#xff08;伪随机噪声码&#xff09;&#xff08;01 - 32&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段9&#xff1a;卫星仰角&#xff08;00 - 90&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段10&#xff1a;卫星方位角&#xff08;00 - 359&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段11&#xff1a;信噪比&#xff08;00&#xff0d;99&#xff09;dbHz
字段12&#xff1a;PRN 码&#xff08;伪随机噪声码&#xff09;&#xff08;01 - 32&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段13&#xff1a;卫星仰角&#xff08;00 - 90&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段14&#xff1a;卫星方位角&#xff08;00 - 359&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段15&#xff1a;信噪比&#xff08;00&#xff0d;99&#xff09;dbHz
字段16&#xff1a;校验值
GPRMC&#xff08;推荐定位信息数据格式&#xff09;
$GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V*CC
例&#xff1a;
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
字段0&#xff1a;$GPRMC&#xff0c;语句ID&#xff0c;表明该语句为Recommended Minimum Specific GPS/TRANSIT Data&#xff08;RMC&#xff09;推荐最小定位信息
字段1&#xff1a;UTC时间&#xff0c;hhmmss.sss格式
字段2&#xff1a;状态&#xff0c;A&#61;定位&#xff0c;V&#61;未定位
字段3&#xff1a;纬度ddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;
字段4&#xff1a;纬度N&#xff08;北纬&#xff09;或S&#xff08;南纬&#xff09;
字段5&#xff1a;经度dddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;
字段6&#xff1a;经度E&#xff08;东经&#xff09;或W&#xff08;西经&#xff09;
字段7&#xff1a;速度&#xff0c;节&#xff0c;Knots
字段8&#xff1a;方位角&#xff0c;度
字段9&#xff1a;UTC日期&#xff0c;DDMMYY格式
字段10&#xff1a;磁偏角&#xff0c;&#xff08;000 - 180&#xff09;度&#xff08;前导位数不足则补0&#xff09;
字段11&#xff1a;磁偏角方向&#xff0c;E&#61;东W&#61;西
字段16&#xff1a;校验值
GPVTG&#xff08;地面速度信息&#xff09;
$GPVTG,TTT,C,TTT,C,GGG.GG,U,GGG,GG,U*CC
例&#xff1a;
$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
字段0&#xff1a;$GPVTG&#xff0c;语句ID&#xff0c;表明该语句为Track Made Good and Ground Speed&#xff08;VTG&#xff09;地面速度信息
字段1&#xff1a;运动角度&#xff0c;000 - 359&#xff0c;&#xff08;前导位数不足则补0&#xff09;
字段2&#xff1a;T&#61;真北参照系
字段3&#xff1a;运动角度&#xff0c;000 - 359&#xff0c;&#xff08;前导位数不足则补0&#xff09;
字段4&#xff1a;M&#61;磁北参照系
字段5&#xff1a;水平运动速度&#xff08;0.00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段6&#xff1a;N&#61;节&#xff0c;Knots
字段7&#xff1a;水平运动速度&#xff08;0.00&#xff09;&#xff08;前导位数不足则补0&#xff09;
字段8&#xff1a;K&#61;公里/时&#xff0c;km/h
字段9&#xff1a;校验值
GPGLL&#xff08;地理定位信息&#xff09;
$GPGLL,DDMM.MMMM,S,DDDMM.MMMM,S,HHMMSS.SS,S*CC
例&#xff1a;
$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
字段0&#xff1a;$GPGLL&#xff0c;语句ID&#xff0c;表明该语句为Geographic Position&#xff08;GLL&#xff09;地理定位信息
字段1&#xff1a;纬度ddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;
字段2&#xff1a;纬度N&#xff08;北纬&#xff09;或S&#xff08;南纬&#xff09;
字段3&#xff1a;经度dddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;
字段4&#xff1a;经度E&#xff08;东经&#xff09;或W&#xff08;西经&#xff09;
字段5&#xff1a;UTC时间&#xff0c;hhmmss.sss格式
字段6&#xff1a;状态&#xff0c;A&#61;定位&#xff0c;V&#61;未定位
字段7&#xff1a;校验值