找回密码
 注册
查看: 3494|回复: 15

想发起一个开放的GPS软件的项目

[复制链接]
发表于 2005-7-26 17:34:50 | 显示全部楼层 |阅读模式
国内GPS导航的软件用的较多的是灵图、城际通或OZI,其中前二个主要是入门的人试用,因为他带地图,可以实现路径的自动选择,功能比较强大和直观。但他们的一个巨大的问题是因为国情的原因,他们出厂时的地图就是不精准的,所以很多时候按他们标识的路径行走会出问题,同时他们的价格也很贵,灵图的将近900块。
OZI一般就是水平比较高的人用的(其实也蛮简单的,只是很多用的人并不太了解软件的操作而己),他不带自己的地图,使用普通的图片的,而不是矢量数据,有一个好处是可以自己在扫描的地图上制作适合自己的地图或通过行车轨迹制作地图,价格在800人民币左右,国内并没有销售,通常是盗版的。
Linux平台下用GPSDRIVE,ROADMAP等,也是试有普通的图片,而不是矢量数据的。他们通常不能在WINDOWS平台下使用,同时也他们的地图投影和国内的有一定区别(当然这个区别可以很方便的解决)。GPSDRIVE己经停止了开发,ROADMAP我二次都没有编译通过。
我的想法是用GTK开发一个GPS软件,能在LINUX和WINDOWS平台下使用。
相关的网站如下:
http://gpsd.berlios.de/
http://roadmap.digitalomaha.net/index.html
http://www.gpsdrive.cc/

同志们提提想法!
发表于 2005-7-26 17:46:21 | 显示全部楼层
呵呵,还是那句老话。

号召没什么意思。写出设计文档,就算某人不做了,其它人也能接手。
回复

使用道具 举报

发表于 2005-7-26 17:56:08 | 显示全部楼层
这个这个……这些软件是不是要在GPS接收机上用的?
另外那些数据从哪来啊……
回复

使用道具 举报

 楼主| 发表于 2005-7-26 20:37:30 | 显示全部楼层
是的,要用GPS机接收数据的,不过如果使用GPSD就可以不用考虑这一层了。
回复

使用道具 举报

发表于 2005-7-27 08:54:35 | 显示全部楼层
gps(哽屁死) 不懂
kan多介绍一下
这个东西主要是需要一个地图吧?
回复

使用道具 举报

 楼主| 发表于 2005-7-27 09:02:29 | 显示全部楼层
WSM,不一定的,有些有地图,有些就是一个软件,要自己去找地图。
有地图的一般都是做成矢量地图的,能买到,不过价格不菲。像灵图,城际通什么的就是这样子的。不过,就这们国家来说,地图通常不准的,一方面国家掌握地图资源的,另一方面我们国家的建设太快了。还有一些就是用扫描的图片的,在上面自己动手编辑一些信息上去,来使用,好处就是地图不用钱,可以在网上找到,而且可以自己随时更改。
下面的帖子中讲了几款LINUX下GPS的内容:http://www.linuxforums.org/news/article-24818.html
回复

使用道具 举报

 楼主| 发表于 2005-7-27 09:06:27 | 显示全部楼层
[quote:f77c83236b="kakuyou"]呵呵,还是那句老话。

号召没什么意思。写出设计文档,就算某人不做了,其它人也能接手。[/quote]
没有经过什么分析就做出一个设计,通常是二个结果,一个是做出来的东西很滥甚至根本不实用,另一个通常就设计是不对在做无用功。

Linux下很多软件通常是一个搞出设计的,结果就是软件很难用。Linux下软件是很多,好用的很少。
回复

使用道具 举报

发表于 2005-7-27 09:24:27 | 显示全部楼层
[quote:e4c56913e2="Kan"][quote:e4c56913e2="kakuyou"]呵呵,还是那句老话。

号召没什么意思。写出设计文档,就算某人不做了,其它人也能接手。[/quote]
没有经过什么分析就做出一个设计,通常是二个结果,一个是做出来的东西很滥甚至根本不实用,另一个通常就设计是不对在做无用功。

Linux下很多软件通常是一个搞出设计的,结果就是软件很难用。Linux下软件是很多,好用的很少。[/quote]

因为大部分人不懂gps(包括小生),你先写出一个设计文档,列出参考资料,拿
出来给大家review,订正,再review,定稿。

小生说的是真的打算延续下去,否则什么资料都没有,剩下一堆source,基本
上就只能半途而废了。
回复

使用道具 举报

 楼主| 发表于 2005-7-27 09:30:03 | 显示全部楼层
GPS的定位原理

   GPS 的定位是利用卫星基本三角定位原理,GPS接收装置以测量无线电信号的传输时间来量测距离,以距离来判定卫星在太空中的位置,这是一种高轨道与精密定位的观测方式。假设卫星在11,000英哩高处,测量我们的距离,首先以11,000英哩为半径,以此卫星为圆心画一圆,而我们位置正处于球面上。再假设第二颗卫星距离我们12,000英哩,而我们正处于这二颗球所交集的圆周上。现在我们再以第三颗卫星做精密定位,假设高度13,000 英哩,我们即可进一步缩小范围到二点位置上,但其中一点为非我们所在的位置极有可能在太空中的某一点,因此,我们舍弃这一点参考点,选择另一点为位置参考点。

     如果要获得更精确的定位,则必定要再测量第四个颗卫星,从基本物理的观念上来说,以讯号传输的时间乘以速度即是我们与卫星的距离,我们将此测得的距离称为虚拟距离,在GPS的测量上,我们测的是无线信号,速度几乎达18万6千英哩/Sec的光速,而时间却短的惊人,甚至只要0.06秒,时间的测量需要二个不同的时表,一个时表装置于卫星上以记录无线电信号传送的时间,另一个时表则装置在接收器上,用以记录无线电信号接收的时间,虽然卫星传送信号至接收器的时间极短,但时间上并不同步,假设卫星与接收器同时发出声音给我们,我们会听到二种不同的声音,这是因为卫星从 11,000英哩远的地方传来,所以会有延迟的时间,因此,我们可以延迟接收器的时间,从此延迟的时间╳速度,就是接收器到卫星的距离,此即为GPS 的基本定位原理。
    在一般状况下,卫星传送伪乱码(Psendo Random Code.) 信号,伪乱码是GPS最基本的部份,其实它是最复杂的,它是一串 0 与 1 的脉冲讯号,由于他是如此复杂,以致于看起来像杂乱的讯号一般,这也就是我们称为伪乱码的原因。
    为什么要将编码设计如此复杂呢?让我们为您说明如下:
    复杂的格式能让我们确定接收器所得的讯号并不会碰巧与一些不相干的讯号同步,也就是说这种复杂的讯号格式不可能与存在于大自然中的杂散讯号相同,每个卫星都有其独一无二的伪乱码(PRC),此种编码方式才不致与其它讯号相混淆,事实上,PRC也给了美国国防部 (DoD)控制此系统的方法,而为什么将PRC设计的如此复杂还有一个重要的原因,就是为了使GPS变得更经济,这种码利用信息论放大GPS讯号,而不需要如同电视天线般的大碟天线来接收卫星讯号,您可能好奇为什么电视天线不也如此设计,来舍弃这种大碟天线呢?其中的原因便在于速度。
    一般而言,GPS卫星传送两种频率的载波 L1 (Link 1) 载波的频率为1575.42 MHZ,L2 (Link 2) 载波的频率为1227.60MHZ。
    这两种载波可修正电离层迟滞效应的误差,在载波上除了状态讯息之外,并调制了 2个供定时的伪乱码(PRC):
   1. C/A码 (Coarse Acqusition Code),频率为 1.023 MHZ,仅在L1载波上作调变,每1023位重复一次,以 1 MHZ 的资料作调度,提供给一般民间使用。但基于国家安全的考量,美国国防部刻意以无线电讯号干扰卫星上的原子钟,并宣告一些不准确的轨道参数来造成定位误差。这即是所谓的SA (Selective Availability)效应。
   2.P码 (Precise Code),频率为10.23MHZ,每七天重复一次可同时采用L1及L2载波变,主要提供军事用途P码的频率大约是C/A码的10倍不但更为精确,也更不易被干扰,另外美国国防部增加了一种 A.S.码 (Anti - Spoofing),以将 P码加密之后转换成 Y码,一般用户无法译码,因此必须加装译码器,才可取得较高精度的观测量,况使用P(Y) 码必须经过相关单位的核准,因此,这种伪乱码大部份只提供军方来使用,现在美国也发展展频技术,将可防止各种讯号的干扰。
   

   GPS的精度
    GPS 所使用的精度可分为标准定位精度(SPS)及精密定位精度(PPS)二种:
    1.标准定位精度(Standard Position System,简称SPS)
使用C/A码来定位观测,通常可达100m之内的误差,这是在SA(Selective Availability)开启状态之下,当SA关闭时,此差可降至30m左右,这是由于自然界中存在着许多差的因素,为了提高GPS的精度,我们可利用差分定位(Differential GPS)技术来做校正,通常精度可到2m至5m左右,甚至可达到次米级单位的程度。
    2.精密定位精度(Precis Position System,简称PPS)
要达到PPS的精密定位精度,则必须使用P(Y)码才可达到,一般而言,PPS在水平方向通常可达到15m左右的精度,在垂直方向可达25m的精度,但由于P(Y)码取得不易,因此,目前要做精度定位观测,大多数使用者仍以C/A码配合DGPS来使用。
    上述我们谈到,影响精度的原因是由于讯号在传送过程中,会受到自然界中各物质媒介的干扰,因此,我们在计算精度时,必须考虑这些干扰因素,接着我再为您做一些自然界中干扰误差的介绍:
    1.大气层上的延迟误差
当GPS讯号经过电离层(Ionosphere)上一些带电性的粒子及对流层(Troposphere)上的水汽时,讯号便会产生角度的偏离而产生迟滞的现象。
2.多路径讯号传送误差 (Multipath Error)
GPS讯号传送并非从卫星上直接到达地面接收器,在到达接收器时,通常会经过各种地面物质的反射,因此会有一种讯号多复位位的叠合误差,这种情形就类似您有时在电视上会看到影像重叠不合的鬼影现象,即是此种误差效应的影响。
    3.卫星时表误差 (Ephemeris Error)
   即使卫星是非常的精密复杂,它可以计算出一些极微小的讯息信息,如原子钟(Cesium) 即是如此一个精准的装置,但是精准并不代表完美,因此仍会有一些微小的误差产生,即使卫星的定位会持续的被监控着,但并不是每一秒都处于被监视的状态之中,这期间一旦有微小的定位误差或卫星星历的误差产生,便会影响到接受器在定位计算时的准确性。
    4.几何精度稀释(Geometric Dilution of Precision,简称GDOP)
  几何精度稀释听起来相当的复杂抽象,其实它的原理非常的简单,在上述我们所提到的,一个接收器可以在同一时间得到许多颗卫星定位信息,但在精密定位上,只要四颗卫星讯号即已足够了,一个好的接收器便可判断如何在这些卫星讯号当中去撷取较可靠的讯号来计算,如果接收器所选取的讯号当中,有二颗卫星距离甚近,二颗卫星讯号在角度较小的地方会有一个重叠的区域产生,随着距离愈近,此区域便愈大,影响精度的误差亦愈大。如果选取的卫星彼此相距有一段距离,则讯号相交之处便较为明确,误差当然就缩减了不少。

    DGPS 原理
  目前 GPS 系统提供的定位精度是优于 10 米,而为得到更高的定位精度,我们通常采用差分 GPS 技术:将一台 GPS 接收机安置在基准站上进行观测。根据基准站已知精密坐标,计算出基准站到卫星的距离改正数,并由基准站实时将这一数据发送出去。用户接收机在进行 GPS 观测的同时,也接收到基准站发出的改正数,并对其定位结果进行改正,从而提高定位精度。 差分 GPS 分为两大类:伪距差分和载波相位差分。

    1 . 伪距差分原理
    这是应用最广的一种差分。在基准站上,观测所有卫星,根据基准站已知坐标和各卫星的坐标,求出每颗卫星每一时刻到基准站的真实距离。再与测得的伪距比较,得出伪距改正数,将其传输至用户接收机,提高定位精度。 这种差分,能得到米级定位精度,如沿海广泛使用的“信标差分”。

    2 .载波相位差分原理
    载波相位差分技术又称 RTK ( Real Time Kinematic )技术,是实时处理两个测站载波相位观测量的差分方法。即是将基准站采集的载波相位发给用户接收机,进行求差解算坐标。载波相位差分可使定位精度达到厘米级。大量应用于动态需要高精度位置的领域 。
回复

使用道具 举报

 楼主| 发表于 2005-7-27 09:30:45 | 显示全部楼层
1)什么是GPS
       
2)GPS原理
3)GPS硬件
       
4)空间分辨率和时间分辨率
5)快鸟卫星技术参数
       
6)VC++实现GPS全球定位系统定位数据的提取
7)GPS硬件在VC++6.0中利用串行通信控件
         
           
什么是GPS

----------------------------------------------------------------------------
  随着科学的发展GPS已经不是一个陌生的名词了,GPS在海湾战争中大显身手并给人以深刻的印象,但是有谁能了解GPS的真正含义呢?
GPS 是有美国国防部( U.S. Department of Defense --DOD)开发的一套基于卫星的无线导航系统。无论是陆地、海洋还是太空用户都可以通过GPS系统全天侯、一天24小时、全球任何位置的精确定位他们的三维坐标、速度和时间,其定位精度比目前以及可以预见的将来任何无线导航系统都要高!
GPS 包括三个基本部分:
①太空部分
②控制部分
③用户部分
  GPS 的工作概念是基于卫星的距离修正。用户通过测量到太空各可视卫星的距离来计算他们的当前位置,卫星的左右相当于精确的已知参考点。每颗 GPS 卫星时刻发布其位置和时间数据信号,用户接收机可以测量每颗卫星信号到接收机的时间延迟,根据信号传输的速度就可以计算出接收机到不同卫星的距离。同时收集到至少四颗卫星的数据时就可以解算出三维坐标、速度和时间。

GPS原理

----------------------------------------------------------------------------
  GPS接收机可接收到可用于授时的准确至纳秒级的时间信息;用于预报未来几个月内卫星所处概略位置的预报星历;用于计算定位时所需卫星坐标的广播星历,精度为几米至几十米(各个卫星不同,随时变化);以及GPS系统信息,如卫星状况等。

  GPS接收机对码的量测就可得到卫星到接收机的距离,由于含有接收机卫星钟的误差及大气传播误差,故称为伪距。对0A码测得的伪距称为UA码伪距,精度约为20米左右,对P码测得的伪距称为P码伪距,精度约为2米左右。
  
   GPS接收机对收到的卫星信号,进行解码或采用其它技术,将调制在载波上的信息去掉后,就可以恢复载波。严格而言,载波相位应被称为载波拍频相位,它是收到的受多普勒频移影响的卫星信号载波相位与接收机本机振荡产生信号相位之差。一般在接收机钟确定的历元时刻量测,保持对卫星信号的跟踪,就可记录下相位的变化值,但开始观测时的接收机和卫星振荡器的相位初值是不知道的,起始历元的相位整数也是不知道的,即整周模糊度,只能在数据处理中作为参数解算。相位观测值的精度高至毫米,但前提是解出整周模糊度,因此只有在相对定位、并有一段连续观测值时才能使用相位观测值,而要达到优于米 级的定位精度也只能采用相位观测值。
  
  按定位方式,GPS定位分为单点定位和相对定位(差分定位)。单点定位就是根据一台接收机的观测数据来确定接收机位置的方式,它只能采用伪距观测量,可用于车船等的概略导航定位。相对定位(差分定位)是根据两台以上接收机的观测数据来确定观测点之间的相对位置的方法,它既可采用伪距观测量也可采用相位观测量,大地测量或工程测量均应采用相位观测值进行相对定位。

  在GPS观测量中包含了卫星和接收机的钟差、大气传播延迟、多路径效应等误差,在定位计算时还要受到卫星广播星历误差的影响,在进行相对定位时大部分公共误差被抵消或削弱,因此定位精度将大大提高,双频接收机可以根据两个频率的观测量抵消大气中电离层误差的主要部分,在精度要求高,接收机间距离较远时(大气有明显差别),应选用双频接收机。

  在定位观测时,若接收机相对于地球表面运动,则称为动态定位,如用于车船等概略导航定位的精度为30一100米的伪距单点定位,或用于城市车辆导航定位的米级精度的伪距差分定位,或用于测量放样等的厘米级 的相位差分定位(RTK),实时差分定位需要数据链将两个或多个站的观测数据实时传输到一起计算。在定位观测时,若接收机相对于地球表面静止,则称为静态定位,在进行控制网观测时,一般均采用这种方式由几台接收机同时观测,它能最太限度地发挥GPS的定位精度,专用于这种目的的接收机被称为大地型接收机,是接收机中性能最好的一类。目前,GPS已经能够达到地壳形变观测的精度要求,IGS的常年观测台站已经能构成毫米级的全球坐标框架。

GPS硬件

        Magellan GPS 315
MAGELLAN GPS 315体积小,重量轻,操作非常简便,存储容量极大,可存储近500个航迹点。具有CD-ROM驱动器以及笔记本电脑接口,极大地扩展了其陆、海导航的功能,麦哲伦GPS 315具有很强的接收能力,防水、防尘、防震,逆仰角显示屏幕,在夜间也可清楚显现导航画面。
        Pocket
Pocket是一种袖珍型,且坚固耐用和性价比高的GPS接收机。它通过一个手持式数据采集器再配以天宝公司的多种操作应用系统,就可以完成不同领域的GIS测绘工作者的各种要求。它结构紧凑、设计灵巧。可以配合天宝公司的BOB接收机完成实时差分导航和测量工作。
        Geo Explorer 3/3C
GeoExplorer 3/3c----手持式GPS成图和GIS数据采集/维护系统。它是成图和管理空间数据的理想工具。中文操作系统、高效的为GIS采集GPS数据、易于数据维护服务于现有GIS数据库、坚固及便携式设计。在自然资源绘图、环境研究、公用事业和城市资产数据库的建设和维护有广泛应用。
        ProXR/XRS
GPS Pathfinder Pro XR/XRS----实时GPS成图/GIS数据采集。天宝公司现提供两套系统(以是否具有实时差分技术而区别)。Pro XR系统配有最先进的GPS接收机,具有MSK信号实时差分处理能力。GPS Pathfinder Pro XRS 系统将一台GPS接收机、一台MSK信标差分接收机和一台卫星差分接收机封装在一起。
        Ag132
AgGPS132----DGPS 接收机和The Choice 技术的结合。该技术将一个GPS接收机、一个信标差分接收机和一个卫星差分接收机集成在同一外壳内。这些接收机通过一根电缆共用一个组合天线。这一配置极大的提高了差分GPS改正的精度、可靠性和可用性。





空间分辨率和时间分辨率

空间分辨率是相对于时间分辨率而言的。时间分辨率多用于仪器时基线性的分辨能力;由几何空间引起的分辨率称为空间分辨率。因为射线胶片照相检测或实时成像检测多在静止状态下进行,不涉及时间分辨率问题,所以在实时成像检测技术中所言分辨率就是指空间分辨率。



快鸟卫星技术参数


发射时间:2001年10月18日
运载火箭:Delta Ⅱ
发射地点:美国范登堡空军基地
轨道高度及倾角:450 km 98° 太阳同步
重访周期:1~3.5天
视角:沿轨道方向和垂直轨道方向均可调整
轨道周期:93.4分钟
每轨拍摄:约57景
幅宽&图像大小:主要景幅宽 星下点为16.5 km 可达到的地面宽度 544 km(中心点为卫星地面轨道,最大倾角30°)
定位精度:圆误差 23 m;线性误差 17 m(无地面控制点)
传感器分辨率&光谱波段:全色 星下点 61 cm黑白:445~990 nm多光谱 星下点2.44 m 蓝 450~520 nm 绿 520~600 nm红 630~690 nm近红外 760~900 nm
数据编码方式:11 bit/s
卫星姿态控制系统:三轴稳定/恒星跟踪稳定/惯性平台/飞轮/GPS
星上存储器:128 Gbit/s
卫星设计寿命:7年



VC++实现GPS全球定位系统定位数据的提取

作者: 郎锐 信息产业部电子第二十二研究所青岛分所
 
摘要: 本文提出了一种在VC下实现对GPS全球定位系统定位信息的接收以及对各定位参数数据的提取方法。

  引言

  卫星导航技术的飞速发展已逐渐取代了无线电导航、天文导航等传统导航技术,而成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用--在弹道导弹、野战指挥系统、精确弹道测量以及军用地图快速测绘等领域均大量采用了卫星导航定位技术。有鉴于卫星导航技术在民用和军事领域的重要意义,使其得到了许多国家的关注。我国也于 2000年10月31日和12月21日成功发射了第一颗和第二颗导航定位试验卫星并建立了我国第一代卫星导航定位系统--"北斗导航系统",但由于起步晚也没有得到广泛应用。目前在我国应用最多的还是美国的GPS系统。本文就针对当前比较普及的GPS系统,对其卫星定位信息的接收及其定位参数提取的实现方法予以介绍。

  定位信息的接收

  通常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); file://以异步方式打开COM1口
SetCommMask (m_hCom, EV_RXCHAR ) ; file://添加或修改Windows所报告的事件列表
SetupComm (m_hCom,READBUFLEN/*读缓冲*/,WRITEBUFLEN/*写缓冲*/); // 初始化通讯设备参数
// 清除缓冲信息
PurgeComm (m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;
// 对异步I/O进行设置
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; file://接收两连续字节的最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier =0; file://接收每字节的平均允许时间
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; file://接收时间常数
SetCommTimeouts (m_hCom , &CommTimeOuts) ;
file://获取并设置串口
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);
}


 提取定位数据

  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"帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码"$"来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。下面就是对缓存Data中的数据进行解帧处理的主要代码,本文在此只关心时间(日期和时间)和地理坐标(经、纬度):
for(int i=0;i<DATALENGTH;I++){
 if(Data=='$') file://帧头,SectionID为逗号计数器
  SectionID=0;
  if(Data==10){ file://帧尾
}
 if(Data==',') file://逗号计数
  SectionID++;
 else {
  switch(SectionID){
   case 1: file://提取出时间
    m_sTime+=Data;
    break;
   case 2: file://判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)
    if(Data=='A')
     GPSParam[m_nNumber].m_bValid=true;
     break;
   case 3: file://提取出纬度
     m_sPositionY+=Data;
     break;
   case 5: file://提取出经度
     m_sPositionX+=Data;
     break;
   case 9: file://提取出日期
     m_sDate+=Data;
     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)+%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中的各个变量中去,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。

  小结

  本文结合主要的相关程序代码对GPS全球定位系统的定位导航信息的接收和参数数据的提取进行了讨论,同时也对串口的程序设计作了简要的讲述。通过本文的设计方法可以将GPS定位导航信息从GPS接收机完整接收,通过对定位参数的提取可将其应用于其他高层应用决策如各种GIS、RS系统等。本文程序在Windows 98下,由Microsoft Visual C++ 6.0编译通过。





GPS硬件在VC++6.0中利用串行通信控件

文:崔杰 梁计春 王国军 来源:VC知识库 时间:2003-8-20 11:49:01 点击:453
--------------------------------------------------------------------------------

目前,在用计算机进行数据传输时,常用的是串行通信方式。在Visual C++的编程中,既可以用Windows API函数进行串行通信编程,也可以利用环境自带的控件进行编程。利用 API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。

本文以Microsoft Communications Control(version 6.0)为例,介绍串行通信控件在VC++中的使用方法。

嵌入通信控件
使用串行通信控件前,首先要进行系统注册。
1、在建立新工程时,将ActiveX Controls复选框选中,表示本程序支持ActiveX 控件。
2、单击Project菜单,从中选择Add to Project,在弹出的对话框中单击Components and Controls选项,然后在弹出的对话框中再单击Registered ActiveX Controls选项。
3、在列表中选择Microsoft Communications Control (version6.0),形状为带有红色底座的黄色电话机。单击Insert按钮,确认后,会出现一个Confirm Classes对话框,其中列出了该控件的类名(CMSComm)、头文件名(MSComm.h)、执行文件名(MSComm.cpp)。
关闭此对话框,在程序主界面的控件列表中,可以看到该通信控件已被加入,拖动该控件就可以将其放入程序中。

编写通信程序
通信控件的工作原理类似于中断方式,当有通信事件发生时,如发送、接收数据,就会触发OnComm事件。在OnComm事件的处理函数中调用 GetCommEvent()函数,由该函数的返回值即可确定是什么类型的事件,并由此做出相应的处理。
下面以接收处理串口的GPS信号为例,说明该控件在编程中的具体应用。

利用MFC生成一个基于对话框的应用程序,对话框中的控件及其相应的消息与响应函数如下表所示。
利用MFC生成一个基于对话框的应用程序,对话框中的控件及其相应的消息与响应函数如下表所示。
控件名称         控件 ID         对应变量
通信控件         IDC_MSCOMM         m_Comm
接收按钮         IDC_BUTTON_RECEIVEGPSDATA         OnbuttonStartreceivegps()
GPS信号显示         IDC_EDIT_COMDATA         m_comdata
停止接收按钮         IDC_BUTTON_ENDRECEIVEGPSDATA         OnbuttonEndreceivegps()

设置控件各部分属性:

CommPort:1;
DTREnable:1;
InBufferSize:4096;
EOFEnable:TRUE;
Handshaking:nohandshaking;
InputMode:1-Binary;
NullDiscard:False;
Rthreshold:250;
RTSEnable:False;
Settings:9600,n,8,1;
Sthreshold:0。

部分程序如下:

//开始接收GPS信号
void CGpsDlg::OnButtonStartreceivegps()
{
//判断串口的状态,如果是关闭状态,则打开
if(!m_Comm.GetPortOpen() )
//打开串口
m_Comm.SetPortOpen(TRUE);
UpdateData(TRUE);
}
//停止接收GPS的信号
void CGpsDlg::OnButtonEndreceivegps();
{
//判断串口的状态,如果是打开状态,则关闭
if( m_Comm.GetPortOpen() )
m_Comm.SetPortOpen(FALSE);
UpdateData(FALSE);
}
//相应的OnComm事件处理
void CGpsDlg::OnComm()
{
m_comdata.Empty();
VARIANT m_input1;
COleSafeArray m_input2;
LONG length,i;
BYTE data[1024];
CString str;
//接收缓冲区内字符
if(m_Comm.GetCommEvent()== 2)
{
m_comdata.Empty();
//读取缓冲区内的数据
m_input1=m_Comm.GetInput();
//将VARIANT型变量转换为ColeSafeArray型变量
m_input2=m_input1;
//确定数据长度
length=m_input2.GetOneDimSize();
//将数据转换为BYTE型数组
for(i=0;i< length;i++)
m_input2.GetElement(&i,data+i);
//将数组转换为CString型变量
for(i=0;i< length;i++) {
char a=* (char *)(data+i);
str.Format(“%c",a);
m_comdata += str;
}
/*在上面的程序中,先将VARIANT型变量
转换为ColeSafeArray型变量,再将其转换为
BYTE型数组,然后将数组转换为CString型变量,
以满足不同的变量类型显示数据的需要。*/
//提取GPS信号
CString m_zjz;
m_zjz=m_comdata;
//寻找GPS信号的头标志
int s;
s=m_zjz.Find(“$GPRMC,");
CString m_gps;
//NUM为所提取GPS信号的长度
m_gps=m_zjz.Mid(s,NUM);
int x;
x=m_gps.GetLength();
//信号长度不符合要求,则拒绝接收
if (x != NUM) {
m_gps.Empty();
}
//寻找所需要的GPS信号的头标志
int y;
y=m_gps.Find(“$GPRMC,");
if (y != 0)
{
m_gps.Empty();
}
//m-gpsdata是已声明的类成员变量
m_gpsdata=m_gps;
}
}

这样就将GPS信号的数据流提取出来了。再通过简单的字符串操作就可以分别找出GPS信号中的经度、纬度以及相对应的格林威治时间等定位信息。

以上程序在Win98/95/NT、P133 PC机、ROCKWELL JUPITER GPS接收板环境下调试通过。
回复

使用道具 举报

 楼主| 发表于 2005-7-27 09:31:46 | 显示全部楼层
在网上找了点资料,发现公司里的电脑上的相关资料都让我删了,家里的笔记本里能更多内容,晚上发。
回复

使用道具 举报

发表于 2005-8-1 20:05:37 | 显示全部楼层
偶然发现此网站有很多有关GPS的软件:http://www.hope.com.tw/download/exe2.asp?U=SASE
回复

使用道具 举报

发表于 2005-8-9 13:33:55 | 显示全部楼层

国外的开源gps

http://home.earthlink.net/~cwkelley
回复

使用道具 举报

发表于 2005-8-9 17:01:53 | 显示全部楼层
不是据说中国正在和欧盟合作一个叫做“伽利略”的定位系统么?号称精度比GPS要高,呵呵,只是听说的
回复

使用道具 举报

发表于 2005-8-9 21:28:11 | 显示全部楼层
要是从战略考虑,不如作GPS干扰系统,^_^,谁也测不准
愚见愚见。
不过我挺支持大家一起做个项目。这样才有提高啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-8 05:50 , Processed in 0.027821 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表