编写GPS程序Word文档下载推荐.docx
- 文档编号:8604802
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:17
- 大小:90.31KB
编写GPS程序Word文档下载推荐.docx
《编写GPS程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编写GPS程序Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
如果接收器使用了这些信号来测量距离,那肯定会超出真实值。
很多高级的接收器解决这个问题采用的是仅利用头一条信号探测(最直接的路径),然后抛弃所有延时的信号。
(图2-4:
一个接收器遇到了“多路径”问题,经过反射的信号(红色)和直接辐射信号(绿色)一同被接收。
使用更加成熟的GPS接收器就可以解决所有的精度问题,这些接收器可以即时获取校正值,比如:
WAAS(北美洲)和EGNOS(欧洲)。
但是当这些问题与几何降低精度比较时仍会出现一些小问题,这些同样会造成一个足球场那么大的偏差。
幸好几何DOP是很容易用正确的编程技术管理。
几何降低精度(GeometricDilutionofPrecision)
GPS设备计算你的位置采用一种叫“3维多时段定量法(3-Dmultilateration)”,这个方法计算出一些圈的交点。
在GPS下,没有圈都以卫星为圆心,半径为卫星到GPS设备的距离。
理想状态下,这些圈将相交于同一点,从而得出唯一可能的解决方案来获取当前位置。
但是事实上,交点会组成一个不规则的形状的区域。
设备就在这个区域中的某一点,确定设备的位置必须从这么多方案中选择一个。
图2-4显示了一个由三颗卫星产生的区域(用部分$GPGSV语句)。
当前的位置可以灰色区域的任一点。
精度随着区域的变大而降低,这样就引出了本文的焦点:
精度的降低。
精度的监测与控制(或简写为DOP)是编写高精度应用程序的重点。
(图2-5:
GPS设备必须从很多种可能的解决方案里确定当前的位置。
DOP值有三种测量类型:
水平、垂直和说明(mean)。
水平DOP(或者HDOP)测量它和经纬度的关系作为精度,垂直DOP(或者VDOP)测量他和海拔的关系作为精度,说明DOP(也叫位置DOP,即PDOP),给出一个关于经纬度、海拔精度的完整等级。
没个DOP值都是1到50之间数值,其中50表示非常差的精度,1则表示很理想的精确度。
表2-1列出了我划分的一份精确的DOP值细目分类。
DOP分类描述
1
理想
这是最高的信任级别,应用程序可以在任何时候获取最高的精度。
2-3
极好
值得信任的级别,位置的测量相当精确,可以应用于绝大多数应用程序,但是有些非常敏感的应用程序就不行了。
4-6
好
这是用来做商业应用的最低等级。
位置的测量可以用来做线路导航建议。
7-8
中等
位置测量可以用来计算,但是质量还应该提高。
推荐用语天空观察。
9-20
中下
信任级别很低。
位置测量结果应该丢弃或者仅用于粗略估计当前位置。
21-50
差
在这个级别的测量结果是不精确的,大概会有半个足球场大的误差,应该丢弃。
(表2-1:
乔恩关于DOP值的描述。
回头看图2-5,三颗卫星确定一个大区域的不确定解决方案。
这个结果可以用两种方法来改进:
天家更多的卫星来定位,甚至用均匀分布在整个天上的卫星。
如果把结果改进到现在这个情况那么图2-5看起来像什么?
图2-6显示图2-5添加卫星以后的结果。
(图2-6:
三颗以上均匀分布的卫星被添加到图2-5中,从而创建一个高精度的区域,这里的精度损失就会降低。
现在我们已经了解了精度的机制,那么下一步就是要讲如何确定应用程序需要的真实精度。
就经验而论,一个HDOP值小于等于6才被推荐用于应用程序来给用户确定当前位置的建议。
例如,当HDOP值大于6时,车载导航系统告诉用户“现在朝左转”就应该忽略位置测量结果。
但是6就真的足够好了吗?
开发人员怎样在自己的应用程序里使用HDOP值去计算?
为了回答这类问题,我拿个简单方程来解释好了:
GPS设备精度×
DOP=最大允许误差
这个方程使用DOP作为误差的因素之一,同时结合GPS设备的精度得出最大误差允许程度(也就是在该级DOP下特定的可测距离)。
其他的经验告诉我们,典型的GPS设备在不加DGPS或者WAAS时精确度一般在5-7米,或者为平均6米。
车载导航的HDOP为6并且是典型的GPS设备,那么最大允许误差为6米×
6=36米,或者118英尺。
在一片475平方英尺的市区这个最大允许误差几乎是四分之一的市区了。
这个精度可以给用户正确的路线。
从另一个角度来看,HDOP值为12就会得出相当与二分之一市区误差的棘轮,这足以让用户拐进小巷引发事故了。
因此,利用这个方程,我们说车载导航器使用的HDOP值可以大于6,但不要大多哦。
用这个方程计算现实世界的距离,特别是短而重要的距离。
让我们来看看高尔夫运动。
是不是高尔夫比汽车要更高的精确度呢?
我们需要告诉球员哪个高尔夫洞可以打出最好的球。
一些研究表明距离是选择优秀高尔夫球员的重要标准,这里洞与洞之间大概有10-15码的距离。
因此,一个高尔夫程序需要不超过10码(9.1米)的允许误差,这样才能保证找到最好的洞。
把9.1米作为最大允许误差代入方程,得出最大HDOP为3。
因此,高尔夫应用程序需要两倍于汽车导航的精度。
为什么不略过方程而总是把HDOP设为1呢?
看起来这很有合理,但是更高的精度需求就要更高的卫星可见度。
一个车载导航系统可能无法获得HDOP为1(甚至3)的精度,因为在城市里信号被障碍物阻挡了。
如果一定要使HDOP很小,那么这个应用程序会抛出非常多的位置读取,并且这会让司机失去他的耐性。
再则说,由于在户外,高尔夫应用程序确实可以获得更小的HDOP值,球员们的PDA可以充分的获取很多均匀分布的卫星信息,除非他们的球飞到了树林里,这就是他们自己的问题了。
总体来讲,想成为成功的GPS软件开发人员就需要使用方程去确定DOP最大的可能值。
这将确保应用程序在处理不精确数据时能够使误差最小化。
这将使任何GPS应用程序最大化它的价值和功能性。
现在GPS应用程序需要的精度已经可以确定了,是时候去发现哪些源码需要被提取并且获取DOP的最大值了。
所有DOP测量结果每隔几秒就记录在$GPGSA语句中。
这里有个$GPGSA的例子:
$GPGSA,A,3,11,29,07,08,5,17,24,,,,,,2.3,1.2,2.0*30
一个有经验的GPS应用程序开发人员通过阅读一条$GPGSA语句就可以确定位置信息的精度是否能够被使用。
如前所述,最好的DOP率出现在很多卫星均匀分布在不同高度的天空中——GPS设备从多角度获取数据。
该语句的最后三个词是2.3,1.2和2.0,它们描述了说明,水平和垂直DOP。
这条语句一个高精度的环境(完全适合于打高尔夫和开车)。
使用这篇文章的第一部分最后一个清单(清单1-8),添加一个叫“ParseGPGSA”的方法到清单里。
这个方法提取DOP值并且通过“HDOPReceived”,“VDOPReceived”,“PDOPReceived”三个事件来报告它们。
C#
//*********************************************************************
//**
Ahigh-precisionNMEAinterpreter
WrittenbyJonPerson,authorof"
GPS.NET"
()
usingSystem;
usingSystem.Globalization;
publicclassNmeaInterpreter
{
//RepresentstheEN-USculture,usedfornumersinNMEAsentences
publicstaticCultureInfoNmeaCultureInfo=newCultureInfo("
en-US"
);
//Usedtoconvertknotsintomilesperhour
publicstaticdoubleMPHPerKnot=double.Parse("
1.150779"
NmeaCultureInfo);
#regionDelegates
publicdelegatevoidPositionReceivedEventHandler(stringlatitude,
stringlongitude);
publicdelegatevoidDateTimeChangedEventHandler(System.DateTimedateTime);
publicdelegatevoidBearingReceivedEventHandler(doublebearing);
publicdelegatevoidSpeedReceivedEventHandler(doublespeed);
publicdelegatevoidSpeedLimitReachedEventHandler();
publicdelegatevoidFixObtainedEventHandler();
publicdelegatevoidFixLostEventHandler();
publicdelegatevoidSatelliteReceivedEventHandler(
intpseudoRandomCode,intazimuth,intelevation,
intsignalToNoiseRatio);
publicdelegatevoidHDOPReceivedEventHandler(doublevalue);
publicdelegatevoidVDOPReceivedEventHandler(doublevalue);
publicdelegatevoidPDOPReceivedEventHandler(doublevalue);
#endregion
#regionEvents
publiceventPositionReceivedEventHandlerPositionReceived;
publiceventDateTimeChangedEventHandlerDateTimeChanged;
publiceventBearingReceivedEventHandlerBearingReceived;
publiceventSpeedReceivedEventHandlerSpeedReceived;
publiceventSpeedLimitReachedEventHandlerSpeedLimitReached;
publiceventFixObtainedEventHandlerFixObtained;
publiceventFixLostEventHandlerFixLost;
publiceventSatelliteReceivedEventHandlerSatelliteReceived;
publiceventHDOPReceivedEventHandlerHDOPReceived;
publiceventVDOPReceivedEventHandlerVDOPReceived;
publiceventPDOPReceivedEventHandlerPDOPReceived;
//ProcessesinformationfromtheGPSreceiver
publicboolParse(stringsentence)
{
//Discardthesentenceifitschecksumdoesnotmatchour
//calculatedchecksum
if(!
IsValid(sentence))returnfalse;
//Lookatthefirstwordtodecidewheretogonext
switch(GetWords(sentence)[0])
case"
$GPRMC"
:
//A"
RecommendedMinimum"
sentencewasfound!
returnParseGPRMC(sentence);
$GPGSV"
SatellitesinView"
sentencewasrecieved
returnParseGPGSV(sentence);
$GPGSA"
returnParseGPGSA(sentence);
default:
//Indicatethatthesentencewasnotrecognized
returnfalse;
}
//Dividesasentenceintoindividualwords
publicstring[]GetWords(stringsentence)
returnsentence.Split('
'
//Interpretsa$GPRMCmessage
publicboolParseGPRMC(stringsentence)
//Dividethesentenceintowords
string[]Words=GetWords(sentence);
//Dowehaveenoughvaluestodescribeourlocation?
if(Words[3]!
="
"
&
Words[4]!
Words[5]!
Words[6]!
//Yes.Extractlatitudeandlongitude
//Appendhours
stringLatitude=Words[3].Substring(0,2)+"
°
;
//Appendminutes
Latitude=Latitude+Words[3].Substring
(2)+"
\"
Latitude=Latitude+Words[4];
//Appendthehemisphere
stringLongitude=Words[5].Substring(0,3)+"
Longitude=Longitude+Words[5].Substring(3)+"
Longitude=Longitude+Words[6];
//Notifythecallingapplicationofthechange
if(PositionReceived!
=null)
PositionReceived(Latitude,Longitude);
//Dowehaveenoughvaluestoparsesatellite-derivedtime?
if(Words[1]!
//Yes.Extracthours,minutes,secondsandmilliseconds
intUtcHours=Convert.ToInt32(Words[1].Substring(0,2));
intUtcMinutes=Convert.ToInt32(Words[1].Substring(2,2));
intUtcSeconds=Convert.ToInt32(Words[1].Substring(4,2));
intUtcMilliseconds=0;
//Extractmillisecondsifitisavailable
if(Words[1].Length>
7)
UtcMilliseconds=Convert.ToInt32(Words[1].Substring(7));
//NowbuildaDateTimeobjectwithallvalues
System.DateTimeToday=System.DateTime.Now.ToUniversalTime();
System.DateTimeSatelliteTime=newSystem.DateTime(Today.Year,
Today.Month,Today.Day,UtcHours,UtcMinutes,UtcSeconds,
UtcMilliseconds);
//Notifyofthenewtime,adjustedtothelocaltimezone
if(DateTimeChanged!
DateTimeChanged(SatelliteTime.ToLocalTime());
//Dowehaveenoughinformationtoextractthecurrentspeed?
if(Words[7]!
//Yes.
ParsethespeedandconvertittoMPH
doubleSpeed=double.Parse(Words[7],NmeaCultureInfo)*
MPHPerKnot;
//Notifyofthenewspeed
if(SpeedReceived!
SpeedReceived(Speed);
//Areweoverthehighwayspeedlimit?
if(Speed>
55)
if(SpeedLimitReached!
SpeedLimitReached();
//Dowehaveenoughinformationtoextractbearing?
if(Words[8]!
//Indicatethatthesentencewasrecognized
doubleBearing=double.Parse(Words[8],NmeaCultureInfo);
if(BearingReceived!
BearingReceived(Bearing);
//Doesthedevicecurrentlyhaveasatellitefix?
if(Words[2]!
switch(Words[2])
A"
if(FixObtained!
FixObtained();
break;
V"
if(FixLost!
FixLost();
returntrue;
//Interpretsa"
NMEAsentence
publicboolParseGPGSV(stringsentence)
intPseudoRandomCode=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编写 GPS 程序