注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

讀萬卷書,行萬里路

开心快乐的方式有很多种,寻找自己的快乐方式

 
 
 

日志

 
 

全球定位系统(GPS)定位数据的提取  

2007-01-26 13:52:44|  分类: 我的网络 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

引言


随着卫星导航技术的飞速发展,现已基本取代了无线电导航、天文导航等传统导航技术,已成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物
理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用——在弹道导弹、野战指挥系统、精确弹道测量以及军用地图快速测绘等领域均大量采用了卫星导航定位技术。有鉴于卫星导航技术在民用和军事领域的重要意义,使其得到了许多国家的关注。应用最广的是美国的GPS全球定位系统,以前由于美军人为施加了SA干扰,使美军之外的用户只能得到位置精度100米,授时精度340纳秒的服务。但随着1995年俄罗斯GLONASS全球导航卫星系统的组建完毕和欧洲GALILEO导航卫星系统计划、日本区域性导航卫星系统计划的启动,使美国政府迫于竞争压力于2000年5月1日午夜撤销对GPS的SA干扰,使位置精度提升到20米,授时精度提高到40纳秒,并承诺加速星座改善,增加两个民用频率。尽管GLONASS系统没有进行SA干扰,但由于其目前不能独立组网,须与GPS联用,故应用远没有GPS普及。此外尽管我国也于2000年10月31日和12月21日成功发射了第一颗和第二颗导航定位试验卫星并建立了我国第一代卫星导航定位系统——“北斗导航系统”,但由于起步晚也没有得到广泛应用。目前在我国应用最多的还是美国的GPS系统,仅渔船就有10万余条装备了GPS接收机,占全部渔船的1/3。本文就针对当前比较普及的GPS系统,对其卫星定位信息的接收及其定位参数的提取的实现方法予以介绍。


1 定位信息的接收


通常GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成。由于GPS定位信息内容较少,因此多用RS-232串口将定位信息(NEMA0183语句)从GPS接收机传送到计算机中进行信息提取处理。从串口读取数据有多种方法,在此直接使用 Win32 API函数对其进行编程处理。在Windows下不允许直接对硬件端口进行控制操作,所有的端口均被视为“文件”,因此在对串口进行侦听之前需要通过打开文件来打开串口,并对其进行相关参数配置:


m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); //以异步方式打开COM1口

SetCommMask (m_hCom, EV_RXCHAR ) ; //添加或修改Windows所报告的事件列表

SetupComm (m_hCom,READBUFLEN/*读缓冲*/,WRITEBUFLEN/*写缓冲*/); // 初始化通讯设备参数

// 清除缓冲信息

PurgeComm (m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;

// 对异步I/O进行设置

CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //接收两连续字节的最大时间间隔

CommTimeOuts.ReadTotalTimeoutMultiplier =0; //接收每字节的平均允许时间

CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //接收时间常数

SetCommTimeouts (m_hCom , &CommTimeOuts) ;

//获取并设置串口

GetCommState ( m_hCom, &dcb) ;

dcb.BaudRate = CBR_4800;

dcb.ByteSize = 8;

dcb.Parity = ODDPARITY;

dcb.StopBits = ONESTOPBIT ;

SetCommState( m_hCom, &dcb);


在成功打开并设置通讯口后,可采取轮询串口和事件触发两种方式对数据进行接收处理,本文在此采取效率比较高的事件触发方式进行接收处理,通过等待EV_RXCHAR事件的发生来启动ReadFile函数完成对GPS定位信息的接收:


while(true){

WaitCommEvent (m_hCom,&dwEvtMask,NULL);

if (dwEvtMask&EV_RXCHAR == EV_RXCHAR)

if(ComStat.cbInQue>0)

ReadFile(m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead);

}


2 提取定位数据


GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据。同其他通讯协议类似,对GPS进行信息提取必须首先明确其帧结构,然后才能根据其结构完成对各定位信息的提取。对于本文所使用的GARMIN GPS天线板,其发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有“$GPGGA”、“$GPGSA”、“$GPGSV”以及“$GPRMC”等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从“$GPRMC”帧中获取得到,该帧的结构及各字段释义如下:


$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh<CR><LF>


<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 度

  评论这张
 
阅读(698)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017