导航与定位上机实习报告
学生姓名: 孔 令 周
班 学 号: 20101002021/11610211
指导教师: 黄鹰 、 徐战亚
中国地质大学(武汉)信息工程学院
2011年 7月
实习一 GPS设备使用
【实验目的】
(1) 熟悉GPS设备的使用
(2) 熟悉GPS绝对静态定位和绝对动态定位
(3) 使用GPS设备得出某一点、某一线、某一面的相关数据
【实验设备】
动态GPS接收机、静态GPS接收机、天线、GPS定位设备
由于设别数目的,这次实习改用一个google的软件,获得GPS数据,此图为软件中的一张截图,上面显示了精准度157feet,卫星数目,每颗卫星的信号强度,
这张图则显示了所在地的经度和纬度分别为东经114度23分30.013秒北纬30度31分19。809秒。
【实验步骤】
时间:2012年9月2日中午12点30开始,下午三点中结束。 内容:
1、 测量点:测量点在北区,从艺术与传媒学院开始,经过北宗,北区食堂,
北门,北区体育馆直到图书馆这一段路程,整个路线成G字型(如下图)。
2、 测量线:线的话主要是艺术与传媒学院到北宗与隧道口延伸的路相交的
丁字路口,然后从该路口一直到北区食堂下面,在就走向北区校门,进而转向体育馆侧边的路,绕过体育馆到达图书馆正门这样一个路线(如下图)。
3、 测量面:该路线主要包括了图书馆,北区篮球场,排球场,北一楼,北
区图书馆,经管院楼还有外国语学院楼。
【实验结果】
部分数据(全部数据在GPS_DATA。xls中):
实习二 GPS定位接口解析与开发
【实验题目】
GPS信号解析
编写小程序读取GPS信号并进行解析,将解析结果以一定形式展现出来.
根据老师用GPS导航仪测量得到的测量数据进行解析,将track.txt中的数据进行解析,根据不同的格式按照NMEA-0183协议对导航电文进行GPS信息的解析: 1、使用语言不限:C , C++ ,C# ,JAVA
2、对于获取信号可采用以一定时间间隔读取文件中GPS信号的形式代替从串口中读取信号.
3、该实验基本要求能解析出空间信息(即解析GPRMC格式的GPS信号),其他信号格式的解析以及星历图的绘制可在完成基本要求之后进行扩展。 4、对解析出来的数据进行画图处理,得到真正的轨迹。
【实验原理】
GPS设备通过对接收到的导航电文进行分析处理,计算出设备所在的经纬度、海拔、航速、航向等空间信息,并按照规定的协议将空间信息以及卫星信息进行组织,将有组织的数据解析出来然后做应用。
初始化串口打开串口
按字节读取串口发出的字符
是 终止字符?
否
GPS信号结果应用 将所得到的字符拼接成字符串 根据字符串内容进行GSP解析
【实验设计】
1、 设计思想
根据提供的txt文档,实现程序与文件之间的通信,读取txt中的内容,然后根据GPS
关闭串口 解析协议将其进行解析。得到经纬度坐标,然后将经纬度坐标进行操作得到真实的轨迹路线图做出显示。
2、 详细设计
声明对文件的关联对象Fielstream对象,声明对文件进行读取的对象Streamreader,
然后对文件关联对象进行关联本地文件,然后用此关联对象初始化文件读取对象,然后对文件进行一步步的读取,对读取之后的数据进行立刻解析,根据解析协议的种类不同对不同类型的GPS数据进行解析,然后做输出处理。根据文件的头部信息我们可以知道经纬度在那些地方,由于我们只需要解析GPRMC数据,所以经纬度是很容易得到的数据,得到经纬度字符串之后就可以通过函数转换成可操作的经纬度数据,得到经纬度数据之后就转换成为屏幕坐标,然后就可以划线了。经过划线处理连续的划线就成就了轨迹。关于平滑的问题:由于画出来的线可能会有一些点的问题会出现断线的可能和不连续,所以要做平滑处理,记录多个点,每两个点之间都划线一条就能满足平滑的要求。
文件关联准备 文件关联 文件解析
GPGGA GPSGA GPRMC
否 有效? 无效数据
是 使用经纬度绘图 得到经纬
读取数据准备 读取文件 GPGSV
使用经纬度绘图 【成果展示】
【实验心得】
【调试报告】
1. 第一个遇到的问题是读文件的问题:
因为要解析数据就必须要对文本进行解析,以前写的C#程序都是比较简单的程序,所有的操作都在内存中进行,只需要输入输出就够了,但是大型的问题光靠内存是远远不够的,数据量一大就不可能把所有的数据放在内存中,GPS这种数据大多来遥感数据和测绘数据,这些数据量都是几何倍数的增长,要在内存中进行处理根本不可能,所以这个问题也是学习GPS所必须面临的问题,我第一次实习课基本就花在C#文件读取上面了。一旦文件可以读取其他的就好办,主要是声明一个文件流对象,然后将此文件流对象关联文件,在用这个文件流对象初始化一个读取流对象,然后调用读取流对象的读取方法。这样就可以实现读取了.
2. tablecontrol控件:
这是我第一次使用这个控件,真的挺好用的,效果也不错。考虑到要对不同类型的GPS数据进行显示,如果全部放在一个界面中就显得非常臃肿,所以我将他们分开在几个页面中,这几个页面通过tablecontrol控件进行管理,这样就显得比较有组织.
3. string的分段:
因为要对不同数据进行判断,第一件事就是对数据集的头进行判断跟分类,可能是考虑到这一点,所有的GPS数据都是非常规矩的,头的长度都是一样长的,这样判断起来也比较方便,而且组织的时候都是用“,”做分段,这样就比较容易对数据进行切割,然后处理。
4. 经纬度坐标转化成为屏幕坐标的方法:
这是我早google上搜到的方法,首先把控制的警卫框架找到,最大经度减去最小经度,得到经度差.最大纬度减去最小纬度,得到纬度差。然后将经度差乘以3600除以面板宽度,纬度差乘以3600除以面板宽度得到每秒经纬度代表的屏幕像素坐标。最后为了让图像分布均匀.将实际的经纬度转化成秒,然后减去最小经度,然后除以每秒经度代表的屏幕像素坐标。同理做纬度均匀。最后将坐标点得到然后划线.
【心得体会】
GPS是一个非常重要的技术,精确的GPS数据时一把双刃剑。在好的一面他可以方便人们做很多东西,在今后的时代找东西将离不开地图,而地图如果要做到精确的话就不得不用到GPS数据。所以GPS数据是定量解析的基础数据.所有的定量分析都需要解析并且处理这些数据,这在生活上会给我们很大的方便,不仅在查找,交通导航等等方面都会有重要的用途。所以这次实习对我们帮助很大,他让我们了解到生活中的GPS数据的结构,让我们学以致用,了解熟悉GPS并且爱上GPS,我们熟悉他,解析他,应用它。可以创造出许多方便的应用于社会价值。在医疗,规划,建设等方方面面都是重要的.
坏的一方面是过于精确的GPS数据让我们变得不安全,不仅是数据被盗窃之后可能造成国家的安全问题,对方的导弹什么的可以精确打击。对我们的危险太大了。错误的解析也会造成许多社会问题,比如修的地铁因为数据的偏差或解析的错误会造成重大的事故.所以我们处理GPS数据肩负十分重要的使命。我们会好好处理这些数据的.
然后对于做这样一次实习我学到很多东西:认识到生活中真真正正的GPS数据的样子和解析过程。他所遵循的结构规范,还有认识到公共接口的重要性,他 让数据变得有规矩。让我树立了做好一名程序员的信心.让我们知道了做好一个GPS解析与应用的重要性与基本方法.实习让我们有了一些经验与许多信心。
最后做完期待已久的GPS室外实习以后,我感觉现在的卫星技术已经非常发达了。在看不见的天上居然有至少7颗卫星在飞着,想想都觉得不可思议。更不可思议的是我们可以与他对话,获得他得到的信息。这更让我感到GPS技术室一门很有前途很有魅力的技术!
代码:
第一题:
string foresix; FileStream sFile;
StreamReader sReader;
public int NextPage(string str) { int flag = —1;
for (int i = 0; i < str.Length; i++) if (i 〈 6) { foresix += str[i]; }
textBox1.Text += str[i]; }
if (foresix == ”$GPGSA”) { tabctl。SelectedTab = GPGSA; flag = 3;
}
else if (foresix == ”$GPGGA”) tabctl。SelectedTab = GPGGA; flag = 2; }
else if (foresix == \"$GPRMC\") tabctl.SelectedTab = GPRMC; flag = 1; }
else if (foresix == ”$GPGSV\") {{ { {
tabctl.SelectedTab = GPGSV; flag = 4; }
else {
MessageBox.Show(”不?存ä?在¨²此ä?种?格?式º?!ê?\"); }
foresix = ””; return flag; }
//显示:
public void ShowPage(int flag,string str) if (flag == 1) { textBox2.Text = ””; textBox3。Text = \"\"; textBox4.Text = ””; textBox5.Text = ”\"; textBox6.Text = ””; textBox7。Text = ”\"; textBox8.Text = ”\"; textBox9。Text = ””; textBox10.Text = ”\"; textBox11.Text = ”\"; textBox12。Text = ””; textBox13.Text = ””; textBox14.Text = ”\";
for (int i = 7; i 〈= 8; i++) textBox7。Text += str[i];
{ { }
for (int i = 9; i <= 10; i++) { textBox6。Text += str[i]; }
for (int i = 11; i 〈= 16; i++) { textBox5。Text += str[i]; }
if (str[18] == ’A') textBox12。Text = ”有®D效¡ì\"; }
else { textBox12。Text = ”无T效¡ì”; }
for (int i = 20; i 〈= 21; i++) {
textBox11。Text += str[i]; }
for (int i = 22; i 〈= 28; i++)textBox10。Text += str[i]; }
for (int i = 32; i <= 34; i++)textBox9.Text += str[i]; }
for (int i = 35; i 〈= 41; i++) textBox8。Text += str[i];
{ { { { }
for (int i = 45; i <= 49; i++) { textBox13。Text += str[i]; }
for (int i = 51; i <= 56; i++) { textBox14.Text += str[i]; }
for (int i = 58; i <= 59; i++) { textBox4。Text += str[i]; }
for (int i = 60; i <= 61; i++) { textBox3。Text += str[i]; } for (int i = 62; i <= 63; i++) { textBox2。Text += str[i]; } }
tabctl。SelectedTab=START;
sFile = new FileStream(\"track.txt”, FileMode.Open, FileAccess。Read); sReader = new StreamReader(sFile); button1.Enabled = false; button2。Enabled = false; label55。Left -= 2; if (label55.Right 〈 0){ label55.Left = this。Width;
}
timer1.Enabled = false;
string str = sReader.ReadLine(); int flag=NextPage(str); button4。Enabled = false; button1.Enabled = true; button2。Enabled = true; ShowPage(flag, str); 第二题:
using System;
using System。Collections。Generic; using System.ComponentModel; using System.Data; using System。Drawing; using System。Linq; using System.Text;
using System.Windows.Forms; using System。IO;
namespace GPS {
public partial class Form1 : Form {
Bitmap bitM; Graphics g;
Pen pen = new Pen(new SolidBrush(Color.Black), Point[] point = new Point[4];
2.0f);
FileStream sFile; StreamReader sReader;
int i = 4; int j = 0;
double scaleX, scaleY,minX,maxY;
string[] textline = File。ReadAllLines(”track。txt\"); int lines;//track共2有®D多¨¤少¦¨´行D public Form1() {
InitializeComponent();
bitM = new Bitmap(this.panel1.Width, this。panel1。Height); g = Graphics。FromImage(bitM); lines = textline。Length; }
private void button1_Click(object sender, EventArgs e) {
//panel1。Controls.Clear(); label1.Visible = false;
pictureBox1.Visible = false;
timer1.Enabled = true;
sFile = new FileStream(\"track.txt\", FileMode.Open, FileAccess。Read);
sReader = new StreamReader(sFile); button1。Enabled = false; pictureBox2。Visible = true; pictureBox3.Visible = true; pictureBox4.Visible = true; pictureBox5.Visible = true; pictureBox6.Visible = true; pictureBox7.Visible = true; pictureBox8.Visible = true; pictureBox9.Visible = true; pictureBox10.Visible = true; pictureBox11。Visible = true;
}
private void panel1_Paint(object sender, PaintEventArgs e) {
ControlPaint。DrawBorder(e.Graphics,panel1.ClientRectangle,Color。Orange,ButtonBorderStyle。Solid); }
public void clin() {
textBox1.Text = \"”; textBox2.Text = \"”; textBox3.Text = \"\"; textBox4.Text = \"\"; textBox5.Text = \"\";
if (lines 〈= 30)
{
timer1.Enabled = false; } }
private void timer1_Tick(object sender, EventArgs e) {
if (lines >30) {
clin();
string tempstr1, tempstr2; string[] data;
string[] str_time = new string[4]; string[] str_avaliable = new string[4]; string[] str_jd = new string[4]; string[] str_wd = new string[4];
int[] x = new int[4]; int[] y = new int[4];
double[] screenX = new double[4]; double[] screenY = new double[4];
while (i 〉 0 ) {
string str = sReader.ReadLine();
lines—-; data = str.Split(’,');
str_avaliable[j] = data[2];//有®D效¡ì位?
if (str[3] == ’R’ && str[4] == ’M' && str[5] == 'C’ && str_avaliable[j] == ”A\") { i--;
tempstr1 = data[3]; tempstr2 = data[5];
screenX[j] = double.Parse(tempstr2) * 3600 / scaleX - minX;
screenY[j] = maxY - double。Parse(tempstr1) * 3600 / scaleY;
x[j] = (int)screenX[j]; y[j] = (int)screenY[j];
str_time[j] = data[1];//时º¡À间?
str_jd[j] = data[5]; str_wd[j] = data[3];
j++; } }
if (double。Parse(str_time[0]) >= 075245。000) {
pen = new Pen(new SolidBrush(Color.Red), 2。0f);
}
for (int a = 0; a < 4; a++) {
point[a]。X = x[a]; point[a]。Y = y[a]; }
for (int a = 0; a <= 1; a++) {
textBox3。Text += str_time[0][a]; }
for (int a = 2; a 〈= 3; a++) {
textBox4。Text += str_time[0][a]; }
for (int a = 4; a <= 9; a++) {
textBox5.Text += str_time[0][a]; }
textBox1。Text = str_jd[0]; textBox2.Text = str_wd[0]; if (str_avaliable[0] == \"A\") {
textBox6。Text = \"有®D效¡ì”;
} else {
textBox6.Text = \"无T效¡ì”; }
clin();
g.DrawLine(pen, point[0], point[1]);
//this。panel1。BackgroundImage = bitM; //panel1。Refresh(); for (int a = 0; a 〈= 1; a++) {
textBox3。Text += str_time[1][a]; }
for (int a = 2; a <= 3; a++) {
textBox4.Text += str_time[1][a]; }
for (int a = 4; a 〈= 9; a++) {
textBox5。Text += str_time[1][a]; }
textBox1.Text = str_jd[1]; textBox2。Text = str_wd[1];
if (str_avaliable[1] == ”A”) {
textBox6.Text = ”有®D效¡ì\"; } else {
textBox6.Text = ”无T效¡ì”; } clin();
g。DrawLine(pen, point[1], point[2]); //this.panel1。BackgroundImage = bitM; //panel1。Refresh();
for (int a = 0; a <= 1; a++) {
textBox3.Text += str_time[2][a]; }
for (int a = 2; a 〈= 3; a++) {
textBox4。Text += str_time[2][a]; }
for (int a = 4; a <= 9; a++) {
textBox5.Text += str_time[2][a]; }
textBox1。Text = str_jd[2];
textBox2。Text = str_wd[2]; if (str_avaliable[2] == ”A\") {
textBox6.Text = ”有®D效¡ì\"; } else {
textBox6。Text = ”无T效¡ì\"; } clin();
//this.panel1。BackgroundImage = bitM; //panel1。Refresh();
g.DrawLine(pen, point[2], point[3]); for (int a = 0; a 〈= 1; a++) {
textBox3。Text += str_time[3][a]; }
for (int a = 2; a 〈= 3; a++) {
textBox4。Text += str_time[3][a]; }
for (int a = 4; a 〈= 9; a++) {
textBox5。Text += str_time[3][a]; }
textBox1.Text = str_jd[3]; textBox2.Text = str_wd[3]; if (str_avaliable[3] == \"A\") {
textBox6.Text = \"有®D效¡ì\"; } else {
textBox6.Text = ”无T效¡ì”; }
g。DrawLine(pen, point[0], point[2]); g.DrawLine(pen, point[0], point[3]); g.DrawLine(pen, point[1], point[3]);
this.panel1.BackgroundImage = bitM; panel1.Refresh(); j = 0; i = 4; } else {
timer1。Enabled = false; } }
private void button2_Click(object sender, EventArgs e)
{
this。Close(); }
private void Form1_Load(object sender, EventArgs e) {
double min_wei = 3030。0000; double max_wei = 3033。0000; double min_jing = 11419。0000; double max_jing = 11425.0000;
scaleX = (max_jing — min_jing) * 3600 / this.panel1。Width;//x轴¨¢每?像?素?代䨲表À¨ª的Ì?经—度¨¨秒?数ºy
scaleY = (max_wei — min_wei) * 3600 / this。panel1.Height;//y轴¨¢每?像?素?所¨´代䨲表À¨ª的Ì?维?度¨¨的Ì?秒?数ºy minX = min_jing * 3600 / scaleX; maxY = max_wei * 3600 / scaleY;
}
} }
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务