导航与定位课程报告.docx
《导航与定位课程报告.docx》由会员分享,可在线阅读,更多相关《导航与定位课程报告.docx(16页珍藏版)》请在冰豆网上搜索。
导航与定位课程报告
导航与定位课程实验报告
学生姓名:
韩宁
班学号:
116092--29
指导教师:
黄鹰
中国地质大学信息工程学院
2011年7月
实习一
【内容】
GPS设备的使用
要求:
(1)熟悉GPS设备使用
(2)使用GPS设备对地物进行静态绝对定位和对运动物体进行动态绝对定位。
【实习过程】
实习第一天,我们认识到了GPS定位所用到的仪器,并使用手持GPS设备完成了点线面定位测量的一系列操作。
刚开始老师就给我们演示了GPS设备的安装过程,以及各个部分的作用。
首先,我们需要选择一个开阔的地段来进行操作。
这样接收到的GPS卫星的监测数目会比较多,至少要得到四颗卫星数目才能够满足我们的需求。
然后确定了一个基准点作为参考点,当时老师在相应的位置做了个标志,开始安装第一个GPS设备,在把仪器拼接好一起之后,我们需要对仪器做一定的调整,开始是对三脚架的高度和间距做调整,使仪器尽量保持平稳,然后调整水准仪,使通过视镜可以看到我们做标记定位的点,这样我们就可以确定坐标点的位置了。
然后就是组装天线,把天线和我们刚刚组建的GPS仪器连接,这个天线的作用就是发送和接受GPS卫星的信息,最后就是和基准站差不多的方法来组装流动站。
做好安装的工作后,启动基准站接收机,我们需要用手持GPS通过蓝牙和GPS设备相连,打开配置菜单,测量形式/RTK基准站,测量类型:
RTK,设置坐标类型及天线类型的导入完成基本的设置,然后打开测量菜单RTK测量点的获得初始化,导入高程数据,利用相应的软件就可以开始测量当前GPS接收机的经纬度坐标了。
同样的方式测得流动站的位置,先设置接收机端口和波特率,连接电台,新建一个任务,输入任务名,参数等,完成基本的设置后就可以进行测量了。
需要注意的是流动站的配置要和基准站的相配对。
流动站测量数据的时候会出现数据不断跳动的现象,从列表中得到测量的点,完毕后还要进行点校正。
这三台设备的工作原理是:
基准站通过天线发送当前位置的信号给GPS卫星,卫星获得当前位置的坐标后又通过天线接收数据传送给接收机,通过手持GPS读出基准站的坐标。
基准站的测量利用的是相对定位的原理。
同理得出流动站的坐标信息,不同的是流动站利用的是相对定位的原理,得到的是相对基准站的坐标。
下午,我们利用手持GPS装置完成了点线面的测量操作。
在GPS首选项中定义好协议和端口,在实时设置里可以看到卫星的状态,在GPS机上的分布,然后激活这个GPS设备做好初步的设置之后,需要进行数据采集。
先以流动站的类型新建一个文件,写上我们组名,然后在选项里面记录间隔的时间,创建要素,即点,线,面,这样我们就开始做相应的测量操作了,点要素的时候就是一个点的信息,线要素的时候就是点的集合,面要素也是点的集合,但是他的首尾点的坐标是一样的,这样就形成了一个面。
GPS手持设备里显示我们并没有完成面的信息,是因为我们在画面的时候没有保证起始点和终点的重合,所以最后显示的还只是一条线。
以下就是在GPS手持设备里读出的关于数据。
点数据:
ID
X
Y
名称
备注
高程
0
114°23′33.68099976″
30°31′30.41200066″
a
26.205
线数据:
X
Y
名称
备注
高程
长度
0
17.164083
114°23′32.93000031″
30°31′31.21199989″
114°23′32.93199921″
30°31′31.20299911″
114°23′32.93000031″
30°31′31.15900040″
114°23′32.93999863″
30°31′31.10499954″
114°23′32.93199921″
30°31′31.04700089″
114°23′32.92300034″
30°31′30.99099922″
114°23′32.93600082″
30°31′30.87100029″
114°23′32.93199921″
30°31′30.81299973″
114°23′32.92499924″
30°31′30.75099945″
114°23′32.93299866″
30°31′30.69899940″
114°23′32.93299866″
30°31′30.65999985″
面数据:
X
Y
名称
备注
高程
长度
0
39.031261
114°23′32.93000031″
30°31′31.21199989″
114°23′32.93199921″
30°31′31.20299911″
114°23′32.93000031″
30°31′31.15900040″
114°23′32.93199921″
30°31′31.04700089″
114°23′32.92300034″
30°31′30.99099922″
114°23′32.93299866″
30°31′30.93000031″
114°23′32.93600082″
30°31′30.87100029″
114°23′32.92499924″
30°31′30.75099945″
114°23′32.93299866″
30°31′30.69899940″
114°23′32.93299866″
30°31′30.65999985″
114°23′32.38299942″
30°31′31.18499947″
测量图形:
实习二
【内容】
GPS信号解析:
编写小程序读取GPS信号并进行解析,将解析结果以一定形式展现出来。
【要求】
1、使用语言不限:
C,C++,C#,JAVA
2、对于获取信号可采用以一定时间间隔读取文件中GPS信号的形式代替从串口中读取信号。
3、该实验基本要求能解析出空间信息(即解析GPRMC格式的GPS信号),其他信号格式的解析以及星历图的绘制可在完成基本要求之后进行扩展。
【解析流程图】
【设计思想】
GPS设备通过对接收到的导航电文进行分析处理,计算出设备所在的经纬度、海拔、航速、航向等空间信息,并按照规定的协议将空间信息以及卫星信息进行组织,按照一定的波特率通过串口通讯(按位发送)提供给GPS设备使用者或者在GPS设备上进行显示。
但是由于资源的不足,我们不能得到GPS设备,只能由tob.txt文档里的导航电文代替设备中的数据输入,实现对不同类型导航电文的解析。
这就需要打开和读取文件里的内容,方法是:
CStdioFilefp;fp.Open("tob.txt",CFile:
:
modeRead);
然而卫星信息共有六种,包括GPGGA、GPGLL、GPGSA、GPRMC、GPGSV、GPVTG,他们之间的导航电文转换格式也不一样,这样我们需要一次读出每行的信息。
CStringtemp;fp.ReadString(temp);
不同的卫星信息解析后的信息也就不一样了。
这样我们就需要对每种类型的信息做解析
例:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss(时分秒)格式<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式<10>磁偏角(000.0~180.0度)
<11> 磁偏角方向,E或W<12>模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
如:
$GPRMC,191934.767,A,4738.0173,N,12211.1874,W,0.109623,12.14,291004,,*21
解析出来的信息:
时间:
19点19分34.767秒定位状态:
有效
纬度:
北纬47度38.0173分经度:
西经122度11.1874分
速度:
0.109624节航向:
北方12.14度日期:
04年10月29日
类似的GPGGA、GPGLL、GPGSA、GPGSV、GPVTG也按它们自己的格式调用相应的解析函数进行解析。
具体解析时的思想是定义一个时间函数,OnTimer(),设置每次读取一行的时间,SetTimer(1,100,NULL);这样实现自动调用读出数据。
确定了时间之后,具体到每一行的操作,就是要从卫星类型之后开始读,直到“,”的地方为止,定义一个字符串,把读到的信息存在里面,与每个卫星类型相比较,找到匹配的类型,调用这种类型的解析函数。
对于各种卫星类型解析的具体思路是先定义一个大小适合的数组,把每行数据分解,两个逗号之间的内容存在相应的数组中,对每个数组做相应的处理实现解析的功能。
对于画出相应的轨迹图就需要运用VC画图的具体方法,画一个圆模拟地球的模型,标出N,S,W,E四个方向,确定中心点,然后也是运用时间函数自动的读出每个点的实时坐标,主要运用Moveto()和Lineto()函数实现实现画轨迹图的目的。
【调试结果】
【代码】
CStdioFilefp;
CStringtemp;
voidCGpsDlg:
:
Onstar()
{
SetTimer(1,100,NULL);
if(m_bstate==1){
fp.Open("tob.txt",CFile:
:
modeRead);
}
}
voidCGpsDlg:
:
OnTimer(UINTnIDEvent)
{
CStringtemp;
inti;
CStringhead="";
fp.ReadString(temp);
inta=temp.GetLength();
for(i=0;i{
while(temp[i]!
=',')//读协议类型
{
head+=temp[i];
i++;
}
if(head=="$GPGGA")//解析$GPGGA
{
explainGPGGA(temp,i+1);
break;
}
if(head=="$GPRMC")//解析$GPGMC
{
explainGPGMC(temp,i+1);
break;
}
if(head=="$GPGSA")//解析$GPGSA
{
explainGPGSA(temp,i+1);
break;
}
if(head=="$GPGSV")//解析$GPGSV
{
explainGPGSV(temp,i+1);
break;
}
}
CDialog:
:
OnTimer(nIDEvent);
}
voidCGpsDlg:
:
explainGPGMC(CStringdata,intcurrent)
{
UpdateData(true);
intlen=data.GetLength();
CStringstrTemp;
CStringstrData[14];
intj=0;
for(inti=current;j<12;/*j++,*/i++)
{
if(j==11)
{
while(data[i]!
='*'&&i{
strTemp+=data[i];
i++;
}
}
else
{
while(data[i]!
=','&&i{
strTemp+=data[i];
i++;
}
}
strData[j++]=strTemp;
strTemp=_T("");
}
GPGMCg2;
CStringtemp;
if(!
strData[0].IsEmpty())
{
temp=strData[0].Left
(2);
temp+="时";
temp+=strData[0].Mid(2,2);
temp+="分";
temp+=strData[0].Mid(4);
temp+="秒";
g2.time=temp;
}
if(!
strData[1].IsEmpty())
{
if(strData[1]=="A")
g2.state="有效";
else
g2.state="无效";
}
if(!
strData[2].IsEmpty())
{
temp=strData[2].Left
(2);
temp+="度";
temp+=strData[2].Mid
(2);
temp+="分";
g2.latitude=temp;
x=atoi(strData[2].Mid
(2))%100;
}
if(!
strData[3].IsEmpty())
{
if(strData[2]=="N")
g2.latihaif="北纬";
else
g2.latihaif="南纬";
}
if(!
strData[4].IsEmpty())
{
temp=strData[4].Left(3);
temp+="度";
temp+=strData[4].Mid(3);
temp+="分";
g2.longitude=temp;
y=atoi(strData[4].Mid(3))%100;
}
if(!
strData[5].IsEmpty())
{
if(strData[5]=="E")
g2.longihaif="东经";
else
g2.longihaif="西经";
}
if(!
strData[6].IsEmpty())
g2.speed=strData[6]+"节";
if(!
strData[7].IsEmpty())
{
temp="北方";
g2.dic=temp+strData[7]+"度";
}
if(!
strData[8].IsEmpty())
{
temp=strData[8].Right
(2);
temp+="年";
temp+=strData[8].Mid(2,2);
temp+="月";
temp+=strData[8].Left
(2);
temp+="日";
g2.data=temp;
}
if(!
strData[9].IsEmpty())
g2.declibation=strData[9]+"度";
if(!
strData[10].IsEmpty())
{
if(strData[10]=="E")
g2.decdic="东";
else
g2.decdic="西";
}
if(!
strData[11].IsEmpty())
{
if(strData[11]=="A")
g2.modtype="自主定位";
elseif(strData[11]=="D")
g2.modtype="差分";
elseif(strData[11]=="E")
g2.modtype="估值";
else
g2.modtype="数据无效";
}
m_data=g2.data;
m_time=g2.time;
m_longitude=g2.longihaif+g2.longitude;
m_latitude=g2.latihaif+g2.latitude;
m_direction=g2.dic;
m_speed=g2.speed;
drawp(x,y);
UpdateData(false);
}
其他解析信息的方法类似,这里就不一一列举出来了。
voidCGpsDlg:
:
Onquit()
{
CDialog:
:
OnOK();
}
voidCGpsDlg:
:
OnStop()
{
if(KillTimer
(1)){
m_bstate++;
}
}
总结
以前的实习基本都是在电脑前写代码,这次有户外的实习,还接触了手持GPS设备,感觉很新颖。
在课堂上,老师讲解过这类设备,还有应用的原理,当时感觉能听明白,真正接触到的时候发现和理解的还是有差异。
我们不再仅仅是了解这种设备干什么,主要还学会了具体怎么用,这对我们实际的应用有很大帮助。
这次户外的实习也帮助我们对课堂上内容的理解和吸收,加深对绝对定位和相对定位的理解。
在编程的过程中,我看到了程序的作用。
以前写程序觉得就是实现一个特定的功能,对于他的实际应用不太了解,这次的实习和前一天的户外实习相结合,感觉到了编程的作用和功能,知道程序能真正创造出价值。
实习是提高能力的过程,也是我们成长的过程。
每次实习都能学到了很多新的知识,积累宝贵的经验,虽然感觉着手都很困难,在实习过程中也遇到了很多的问题,也感觉自己做出来的程序还是不够完善,有很多地方还需要改进和提高,但是我们就是在这种不断发现问题,不断解决问题的过程中才会看到自己的不足,才能看到和别人差距,我们的能力才会有所提高。
而我还是需要多加努力,勤加练习。