GPS中提取定位数据

 

      

      GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据。同其他通讯协议类似,对GPS进行信息提取必须首先明确其帧结构,然后才能根据其结构完成对各定位信息的提取。

       对于本文所使用的GARMIN   GPS天线板,其发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有"$GPGGA"、"$GPGSA"、"$GPGSV"以及"$GPRMC"等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。

       对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从"$GPRMC"帧中获取得到,该帧的结构及各字段释义如下:  
   
  $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh  
   
  <1>   当前位置的格林尼治时间,格式为hhmmss   

    
  <2>   状态,   A   为有效位置,   V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。  
   
  <3>   纬度,   格式为ddmm.mmmm  
   
  <4>   标明南北半球,   N   为北半球、S为南半球  
   
  <5>   径度,格式为dddmm.mmmm    
   
  <6>   标明东西半球,E为东半球、W为西半球  
   
  <7>   地面上的速度,范围为0.0到999.9  
   
  <8>   方位角,范围为000.0到   359.9   度  
   
  <9>   日期,   格式为ddmmyy     //此时间在前面所叙述的压缩算法中仅仅记一次

    
  <10>   地磁变化,从000.0到   180.0   度  
   
  <11>   地磁变化方向,为E   或   W   
    

其他帧格式:

GPRMC(建议使用最小GPS数据格式)
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11><CR><LF>
1)
标准定位时间(UTC time)格式:时时分分秒秒.秒秒秒(hhmmss.sss)。
2)
定位状态,A = 数据可用,V = 数据不可用。

3)
纬度,格式:度度分分.分分分分(ddmm.mmmm)。

4)
纬度区分,北半球(N)或南半球(S)。

5)
经度,格式:度度分分.分分分分。

6)
经度区分,东(E)半球或西(W)半球。
7)
相对位移速度, 0.0
1851.8 knots
8)
相对位移方向,000.0 359.9度。实际值。

9)
日期,格式:日日月月年年(ddmmyy)。

10)
磁极变量,000.0 180.0

11)
度数。

12) Checksum.(
检查位)


GPGSV
(所示卫星格式)
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,
<4>,<5>,<6>,<7>,<8><CR><LF>
1)
天空中收到讯号的卫星总数。

2)
定位的卫星总数。

3)
天空中的卫星总数,00 12

4)
卫星编号, 01 32
5)
卫星仰角, OO 90 度。

6)
卫星方位角, OOO 359 度。实际值。

7)
讯号噪声比(C/No), 00 99 dB;无表未接收到讯号。

8) Checksum.(
检查位
).

<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。


GPGSA
GPS精度指针及使用卫星格式)

$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF>
1)
模式 2M = 手动, A = 自动。
2)
模式 1:定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。

3) PRN
数字:01 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。

4) PDOP-
位置精度稀释 0.5 99.9.
5) HDOP-
水平精度稀释
0.5 to 99.9.
6) VDOP-
垂直精度稀释
0.5 to 99.9.
7) Checksum.(
检查位).  


  至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对"$GPRMC"帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码"$"来判断是否是帧头在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理

       下面就是对缓存Data中的数据进行解帧处理的主要代码,本文在此只关心时间(日期和时间)和地理坐标(经、纬度):  
for(int   i=0;i<DATALENGTH;I++){  
 if(Data[i]=='$')   file://帧头,SectionID为逗号计数器  
  SectionID=0;  
  if(Data[i]==10){   file://帧尾  
}  
 if(Data[i]==',')   file://逗号计数  
  SectionID++;  
 else   {  
  switch(SectionID){  
   case   1:   file://提取出时间  
    m_sTime+=Data[i];  
    break;  
   case   2:   file://判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)  
    if(Data[i]=='A')  
     GPSParam[m_nNumber].m_bValid=true;  
     break;  
   case   3:   file://提取出纬度  
     m_sPositionY+=Data[i];  
     break;  
   case   5:   file://提取出经度  
     m_sPositionX+=Data[i];  
     break;  
   case   9:   file://提取出日期  
     m_sDate+=Data[i];  
     break;  
     default:  
     break;  
  }  
 }  
}    
   
   
   
  现在已将所需信息提取到内存,即时间、日期以及经纬度分别保存在CString型变量   m_sTime、m_Data、m_sPositionY和m_sPositionX中。在实际应用中往往要根据需要对其做进一步的运算处理,比如从GPS接收机中获得的时间信息为格林尼治时间,因此需要在获取时间上加8小时才为我国标准时间。而且GPS使用的WGS-84坐标系也与我国采用的坐标系不同,有时也要对此加以变换。而这些变换运算必须通过数值运算完成,因此需要将前面获取的字符型变量转化为数值型变量,这部分工作可放在检测到帧尾完成:  
::strcpy(buf,m_sTime);    
str.Format("%c%c",buf[0],buf[1]);  
GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24;   file://提取出小时并转化为24小时制北京时间  
file://buf第2、3字节为分钟,4、5字节为秒,提取方法同上  
……  
::strcpy(buf,m_sDate);  
str.Format("%c%c",buf[0],buf[1]);   file://提取出月份  
file://buf第2、3字节为天,4、5字节为年,提取方法同上  
……  
::strcpy(buf,m_sPositionY);  
str.Format("%c%c",buf[0],buf[1]);  
PositionValue=atoi(str);    
str.Format("%c%c%c%c%c%c%c",buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8]);  
GPSParam[m_nNumber].m_dPositionY=PositionValue*60+atof(str);   file://提取出纬度  
……  
::strcpy(buf,m_sPositionX);  
if(m_sPositionX.GetLength()==10)   file://经度超过90度(如东经125度)  
{  
 str.Format("%c%c%c",buf[0],buf[1],buf[2]);  
 PositionValue=atoi(str);  
 str.Format("%c%c%c%c%c%c%c",buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);  
 GPSParam[m_nNumber].m_dPositionX=PositionValue*60+atof(str);   file://提取出经度(单位为分)  
}  
if(m_sPositionX.GetLength()==9)   file://经度未超过90度(如东经89度)  
{  
 file://处理方法同上,只是buf的第0、1字节为度数,2~9为分数。  
}     
    

    到此为止,已将时间和经纬度信息提取到GPS结构数组GPSParam中的各个变量中去,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值