卫星导航定位算法与程序设计实验报告.docx
《卫星导航定位算法与程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《卫星导航定位算法与程序设计实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
卫星导航定位算法与程序设计实验报告
2013级测绘工程专业
卫星导航定位算法与程序设计
实
验
报
告
实验名称:
卫星导航基本程序设计
班级:
学 号:
姓名:
实验时间:
2016年6月28日~2016年6月30
中国 矿 业 大 学
实验一时空基准转换2
一、实验目得2
二、实验内容2
三、实验过程ﻩ2
四、实验感想ﻩ6
实验二RINEX文件读写ﻩ7
一、实验目得ﻩ7
二、实验内容7
三、实验过程ﻩ7
实验三卫星轨道计算ﻩ12
一、实验目得12
二、实验内容12
三、实验过程ﻩ12
四、实验感想15
实验一时空基准转换
一、实验目得
1、加深对时空系统及其之间转换关系得理解
2、掌握常用时空基准之间得转换模型与软件实现
3、每人独立完成实验规定得内容
二、实验内容
本实验内容包括:
内容一:
编程实现GPS起点1980年1月6日0时对应得儒略日
内容二:
编程实现2011年11月27日对应得GPS周数与一周内得秒数
内容三:
在WGS84椭球得条件下,编程实现当中央子午线为117度时,计算高斯坐标x=3548910、811290287, y=179854.6172135982 对应得经纬度坐标?
内容四:
WGS84椭球下,表面x=-2408000;y=4698000;z=3566000处得地平坐标系坐标为:
e=704。
8615;n=114、8683;u=751、9771得点对应得直角坐标为多少?
三、实验过程
1.针对第一、二部分内容:
1。
1解决思路:
先建立”TimeStruct、h”得头文件,将格里高利历、GPS时间结构、儒略日时间结构共结构体得方式放在里面;在建立“TimeTr”得头文件,建立类“CTimeTr”,创建变量“GPSTime”、“Time”、”JulDay",并且申明函数“TIME2JUL”、“TIME2GTIME”等,用这些函数分别实现所需要得转换。
1。
2具体得实现函数:
“TIME2JUL”函数:
doubleCTimeTr:
:
TIME2JUL()//TIMETime,JULIANDAY&JulDay
{
doublem,y;
doubleD;
//h=Time.byHour+Time、byMinute/60.0+Time、dSecond/3600、00;
if(Time。
byMonth〈=2)
{
y=Time。
wYear-1;
m=Time。
byMonth+12;
}
else
{
y=Time。
wYear;
m=Time。
byMonth;
}
D=floor(365。
25*(y+4716))+floor(30、6001*(m+1))+Time.byDay+Time、byHour/24、0-1537、5;
JulDay、lDay= int(D);
JulDay。
lSecond= D—int(JulDay、lDay);
return0;
}
“TIME2GTIME”:
void CTimeTr:
:
TIME2GTIME()
{
doubleJD;ﻩ
ﻩlong m,y;
int WN;
ﻩdouble Wsecend;
//UT=Time、byHour+Time.byMinute/60。
0+Time、dSecond/3600。
00;
if(Time。
byMonth<=2)
{
ﻩy=Time、wYear-1;
ﻩm=Time、byMonth+12;
ﻩ}
else
ﻩ{
ﻩy=Time、wYear;
ﻩﻩm=Time。
byMonth;
}
JD=int(365.25*y)+int(30。
6001*(m+1))+Time、byDay+Time。
byHour/24。
0+1720981.5;
WN=floor((JD-2444244.5)/7.0);
GpsTime、lWeek=WN;
Wsecend=(JD—2444244.5-7*WN)*604800;
ﻩGpsTime、lSecond=Wsecend;ﻩ
}
1、3实验结果:
2针对第三部分内容:
2、1解决思路:
运用实验指导书中提供得matlab高斯反算得代码,进行解算;将高斯反算得公式直接输成matlab代码,绕后在函数“function [B,L]= gauss_fansuan(x,y,L0)”中,将坐标x =3548910.811290287,y=179854.6172135982,L0=117,带入函数得坐边,即可得到所需要得经纬度。
2。
2主要函数得代码:
function[B,L]=gauss_fansuan(x,y,L0)
a=6378137;
f=1/298。
257223563;
b=a—a*f;
c=a^2/b;
e=sqrt(a^2-b^2)/a;
e1=sqrt(a^2-b^2)/b;
Beta0=1-(3/4)*e1^2+(45/64)*e1^4—(175/256)*e1^6+(11025/16384)*e1^8;
Beta2=Beta0—1;
Beta4=(15/32)*e1^4-(175/384)*e1^6+(3675/8192)*e1^8;
Beta6=-(35/96)*e1^6+(735/2048)*e1^8;
Beta8=(315/1024)*e1^8;
B0=x/(c*Beta0);
aa0=(a*cos(B0))/sqrt(1-e^2*sin(B0)^2);
l0=y/aa0;
N=a*sqrt(1-e^2*sin(B0)^2);
t=tan(B0);
in=e1*cos(B0);
a1=N*cos(B0);
a2=(1/2)*N*sin(B0)*cos(B0);
a3=(1/6)*N*cos(B0)^3*(1—t^2+in^2);
a4=(1/24)*N*sin(B0)*cos(B0)^3*(5-t^2+9*in^2+4*in^4);
a5=(1/120)*N*cos(B0)^5*(5-18*t^2+t^4+14*in^2-58*in^2*t^2);
a6=(1/720)*N*sin(B0)*cos(B0)^5*(61—58*t^2+t^4);
F_xB=(c*Beta2+(c*Beta4+(c*Beta6+c*Beta8*cos(B0)^2)*cos(B0)^2)*cos(B0)^2)*sin(B0)*cos(B0);
F_xBl=a2*l0^2+a4*l0^4+a6*l0^6;
F_yBl=a3*l0^3+a5*l0^5;
B1=(x-F_xB—F_xBl)/(c*Beta0);
aa1=(a*cos(B1))/sqrt(1-e^2*(sin(B1))^2);
l1=(y-F_yBl)/aa1;
whileabs(B1-B0)>=0、0001&& abs(l1-l0)>=0、0001
B0=B1;
aa0=aa1;
l0=l1;
F_xB=(c*Beta2+(c*Beta4+(c*Beta6+c*Beta8*cos(B0)^2)*cos(B0)^2)*cos(B0)^2)*sin(B0)*cos(B0);
F_xBl=a2*l0^2+a4*l0^4+a6*l0^6;
F_yBl=a3*l0^3+a5*l0^5;
B1=(x—F_xB-F_xBl)/(c*Beta0);
aa1=(a*cos(B1))/sqrt(1-e^2*(sin(B1)^2));
l1=(y—F_yBl)/aa1;
end
L=rad2deg(l1)+L0;
B=rad2deg(B1);
2.3实验结果
四、实验感想
本次试验就是花时间较多得一次实验,关于时间转换得部分全部都就是自己动手将matlab代码写成“C++”得类,进行实现得。
其中遇到得较大得困难就是儒略日向UTC转换得部分,这部分得函数步骤较多,关键就是在一开始得时间结构里面,各时间各部分得数据类型大多定义得就是“int”型得,但就是在进行计算得时候有较多得小数,需要用到浮点型得函数,这部分用了较多得时间。
在做这个实验得时候,第一天花了时间主要就是转换代码,使程序没有错误,能够正常得运行出来,出现黑框框,但就是还只有个别功能能够用,能够运行出正确得结果;第二天时间主要就是花在修改函数上头,能够使所写得功能都能运行出正确得结果。
通过做时间转换得实验,使自己产生了第一次亲自编写“C++”代码得经历,而且所有错误得解决全部都就是自己解决,收获不少、
实验二RINEX文件读写
一、实验目得
1、深入了解RINEX文件格式
2、进一步提高MATLAB程序设计能力
3、掌握N文件、O文件、SP3文件得基本读写技巧
二、实验内容
本实验内容包括:
1、任选IGS站,下载N文件、O文件与SP3文件;
2、编程实现N文件读入,并采用中文标注出主要参数得名称及作用;
4、编程实现O文件读入,并采用中文标注出主要参数得名称及作用;
5、编程实现SP3文件读入,并采用中文标注出主要参数得名称及作用;
三、实验过程
1、针对第一部分内容:
编程实现N文件读入,并采用中文标注出主要参数得名称及作用
1。
1、解决思路:
按照“GPSeasy”开源代码提供得函数,按照实验要求读取了N文件得内容,先用“rinexe”函数,将N文件读取成“eph。
dat"文件,然后再用“get_eph”函数将“eph、dat”文件读取成“Eph”矩阵,此矩阵中包含了N文件中得数据,在最后用“fprintf"函数将所需要得数据输出成”。
TXT”文件即可。
1。
2、主要函数代码:
“get_eph”函数:
functioneph= get_eph(ephemeridesfile)
fide=fopen(ephemeridesfile);
[eph, count]= fread(fide,Inf,’double');
noeph =count/22;
eph=reshape(eph,22,noeph);
“rinexe”函数(部分):
functionrinexe(ephemerisfile,outputfile)
fide=fopen(ephemerisfile);
head_lines =0;
while1
head_lines=head_lines+1;
line =fgetl(fide);
answer= findstr(line,'ENDOFHEADER');
if ~isempty(answer),break;end;
end;
head_lines
主函数中输出结果得函数部分:
af0=data(19);%卫星中差
M0=data(3);
roota=data(4);
deltan=data(5);
ecc=data(6);
omega=data(7);
cuc=data(8);
cus=data(9);
crc=data(10);
crs=data(11);
i0=data(12);
idot=data(13);
toe=data(18);
af1=data(20);%对所要输出得参数赋值
fprintf(fid,'\n卫星编号:
%d\n卫星钟差:
%d\n平近点角距:
%d\n轨道长半轴得平方根:
%d\n平均运动