卫星导航定位算法与程序设计——实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
head_lines = head_lines+1;
line = fgetl(fide);
answer = findstr(line,'END OF HEADER');
if~isempty(answer),break;end;
end;
head_lines
主函数中输出结果得函数部分:
af0=data(19);%卫星中差
GpsSendPosition SdSignPoTemp;
intnTheFitPoint=0;
Position pTemp;
();
if()==0)
{
strErr = ("PRN=%d没有对应星历");
returnfalse;
}
if()==0)
{
returnfalse;
}
cout<<fixed;
for(inti=0;i<();i++)
<<" "<<" "<<//
(SdSignPoTemp);
}
}
returntrue;
}
3、实验结果
四
计算卫星位置的这部分“C++”代码比较综合,读代码的难度较大,它综合了前面的“C++”O文件读取,N文件读取,然后后面的计算代码较为复杂,需要对卫星轨道计算的公式了解全面,因此对这部分实验,是在老师和同学的帮助下完成的,直接在轨道计算的函数下加入了输出函数,将计算的轨道数据直接输出出来。
af1=data(20);%对所要输出的参数赋值
fprintf(fid,'\n卫星编号:%d\n卫星钟差:%d\n平近点角距:%d\n轨道长半轴的平方根:%d\n平均运动修正量:%d\n轨道偏心率:%d\n近地点角距:%d\n纬度幅角的余弦调和项改正的振幅',prn,af0,M0,roota,deltan,ecc,omega,cuc);
fprintf(fid,'纬度幅角的正弦调和项改正的振幅:%d\n轨道半径的余弦调和项改正的振幅:%d\n轨道半径的正弦调和项改正的振幅:%d\n轨道倾角:%d\n轨道倾角变化率:%d\n星历参考时刻:%d\n',cus,crc,crs,i0,idot,toe)
fclose(fid);
、输出结果
2、针对第二部分内容:
2、主要函数
boolCGps::GetGpsPosition()
{
GPSTIME ts;
GPSTIME tr;
GPSTIME ts0;
GPSTIME oGTime;
GPSTIME nGTOC;
vector<GpsSendPosition>SendSignPosition;
GpsPos GpsPTemp;
3、每人独立完成实验规定的内容
二、实验内容
本实验内容包括:
内容一:编程实现GPS起点1980年1月6日0时对应的儒略日
内容二:编程实现2011年11月27日对应的GPS周数与一周内的秒数
内容三:在WGS84椭球的条件下,编程实现当中央子午线为117度时,计算高斯坐标x = , y = 对应的经纬度坐标?
Obs_types = [Obs_types ot];
end;
ifound_types = 1;
end;
end;
%fclose(fid);
“grabdata”函数:
functionObs = grabdata(fid, NoSv, NoObs)
%GRABDATA Positioned in a RINEX file at a selected epoch
4、理清程序各模块的功能结构
三
1、实验思路:
在老师提供的“SPP”文件中,直接利用卫星位置计算函数,进行卫星位置的计算,将利用“”文件中的”GetGpsPosition”函数,利用其中的迭代求解卫星位置部分,用“cout”直接将卫星迭代后的位置直接输出,因为星历文件中有较多的星历,所以利用循环语句,将求解出来的卫星位置依次输出出来。
end;
end
answer = findstr(line,'APPROX POSITION XYZ');
if~isempty(answer)
fork = 1:3
[app_XYZ, line] = strtok(line);
del = str2num(app_XYZ);
approx_XYZ = [approx_XYZ del];
2013 级测绘工程专业
卫星导航定位算法与程序设计
实
验
报
告
实验名称:卫星导航基本程序设计
班 级:
学 号:
姓 名:
实验时间:2016年6月28日~2016年6月30
中 国 矿 业 大 学
实验一 时空基准转换
一、实验目的
1、加深对时空系统及其之间转换关系的理解
2、掌握常用时空基准之间的转换模型与软件实现
answer = findstr(line,'ANTENNA: DELTA H/E/N');
if~isempty(answer)
fork = 1:3
[delta, line] = strtok(line);
del = str2num(delta);
ant_delta = [ant_delta del];
、主要函数:
“anheader”函数:
function[Obs_types, ant_delta,ifound_types,approx_XYZ] = anheader(file)
fid = fopen(file,'rt');
eof = 0;
ifound_types = 0;
Obs_types = [];
fork = 1:NoObs
Obs(u,k) = str2num(lin(2+16*(k-1):16*k-2));
end
end
else% This will typical be Z12 data
Obs = Obs(:,[1 2 3 4 5]);% We cancel the last two columns 6 and 7
编程实现O文件读入,并采用中文标注出主要参数的名称及作用;
、实现思路:通过matlab的函数“fopen”读取O文件,得到O文件的指针,通过“anheader”函数将文件中的接收机大致位置”approx_XYZ1”,天线的偏移值”ant_delta1”,观测值类型“Obs_types1”等读入成为matlab的矩阵,然后通过循环,利用“grabdata”函数将所需要的历元的观测文件依次输出来,最后通过“fprintf”函数,将所需要的数据依次打印出来。
NoObs = 5;
foru = 1:NoSv
lin = fgetl(fid);
lin_doppler = fgetl(fid);
fork = 1:NoObs%%-1
ifisempty(str2num(lin(1+16*(k-1):16*k-2))) == 1, Obs(u,k) = nan;
else%
具体的实现函数:
“TIME2JUL”函数:
doubleCTimeTr::TIME2JUL() XT”文件即可。
、主要函数代码:
“get_eph”函数:
functioneph = get_eph(ephemeridesfile)
fide = fopen(ephemeridesfile);
[eph, count] = fread(fide, Inf,'double');
ant_delta = [];
approx_XYZ = [];
while1% Gobbling the header
line = fgetl(fid);
answer = findstr(line,'END OF HEADER');
if~isempty(answer),break;end;
if(line == -1), eof = 1;break;end;
noeph = count/22;
eph = reshape(eph, 22, noeph);
“rinexe”函数(部分):
functionrinexe(ephemerisfile, outputfile)
fide = fopen(ephemerisfile);
head_lines = 0;
while1
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);
内容四:WGS84椭球下,表面x=-2408000; y=4698000;z= 3566000处的地平坐标系坐标为: e=;n=;u=的点对应的直角坐标为多少?
三
1.针对第一、二部分内容:
解决思路:先建立””的头文件,将格里高利历、GPS时间结构、儒略日时间结构共结构体的方式放在里面;在建立“TimeTr”的头文件,建立类“CTimeTr”,创建变量“GPSTime”、“Time”、”JulDay”,并且申明函数“TIME2JUL”、“TIME2GTIME”等,用这些函数分别实现所需要的转换。
{
double*VX=newdouble[4];j++)
{
oGTime);
tr=oGTime;
oData[i].oObserveData[j].PRN,nTheFitPoint);
if(nTheFitPoint==-1)
{
"PRN=%d没?有?D对?应?|星?历¤¨2",oData[i].oObserveData[j].PRN);
end;
end
answer = findstr(line,'# / TYPES OF OBSERV');
if~isempty(answer)
[NObs, line] = strtok(line);
NoObs = str2num(NObs);
fork = 1:NoObs
[ot, line] = strtok(line);
一、实验目的
1、进一步熟悉N文件的读入
2、掌握开普勒参数计算卫星轨道的过程
3、编程实现采用广播星历计算卫星轨道
4、掌握MATLAB函数调用步骤
二、
本实验内容包括:
1、调试时间转换函数,熟悉内容,备主函数调用
2、调试广播星历导航文件的读入程序,备主函数调用
3、根据卫星位置计算公式编写主函数,同时调用时间转换、星历读取等的子函数来共同完成卫星位置的计算,最后输出计算结果
OC,nGTOC);
ClkBias+
nData[nTheFitPoint].dClkDrift*nData[nTheFitPoint].dClkDriftRate*
pow(ObserveData[j].PRN;
=;
=;
=;
=oData[i].oObserveData[j].dC1;
if(i<10)
cout<<i+1<<" "<<<<" "<<<<" "<<<<" "<<
Obs(u,k) = str2num(lin(1+16*(k-1):16*k-2));
end
% Obs(u,NoObs) = str2num(lin(65:78));
end
end
பைடு நூலகம்end
实验结果
四、实验感想
这部分实验是我在之前做的,之前自己有看过“gps_easy”有关的代码,看过相关的“N文件”“O文件”读写函数,并且学会了如何调用这些函数,对里面的输出量有了一点的了解,所以我自己的主要工作就是运用了“fprintf”函数,将读取到matlab中的矩阵写入TXT文档中,这部分工作量不是很大,但较有意义。
通过这部分实验是我加深了对卫星轨道计算公式的了解,以及以后面对复杂的公式应该如何应对。。
% reads observations of NoSv satellites
globallin
Obs = zeros(NoSv, NoObs);
ifNoObs <= 5% This will typical be Turbo SII data
foru = 1:NoSv
lin = fgetl(fid);
line = fgetl(fide);
answer = findstr(line,'END OF HEADER');
if~isempty(answer),break;end;
end;
head_lines
主函数中输出结果得函数部分:
af0=data(19);%卫星中差
GpsSendPosition SdSignPoTemp;
intnTheFitPoint=0;
Position pTemp;
();
if()==0)
{
strErr = ("PRN=%d没有对应星历");
returnfalse;
}
if()==0)
{
returnfalse;
}
cout<<fixed;
for(inti=0;i<();i++)
<<" "<<" "<<//
(SdSignPoTemp);
}
}
returntrue;
}
3、实验结果
四
计算卫星位置的这部分“C++”代码比较综合,读代码的难度较大,它综合了前面的“C++”O文件读取,N文件读取,然后后面的计算代码较为复杂,需要对卫星轨道计算的公式了解全面,因此对这部分实验,是在老师和同学的帮助下完成的,直接在轨道计算的函数下加入了输出函数,将计算的轨道数据直接输出出来。
af1=data(20);%对所要输出的参数赋值
fprintf(fid,'\n卫星编号:%d\n卫星钟差:%d\n平近点角距:%d\n轨道长半轴的平方根:%d\n平均运动修正量:%d\n轨道偏心率:%d\n近地点角距:%d\n纬度幅角的余弦调和项改正的振幅',prn,af0,M0,roota,deltan,ecc,omega,cuc);
fprintf(fid,'纬度幅角的正弦调和项改正的振幅:%d\n轨道半径的余弦调和项改正的振幅:%d\n轨道半径的正弦调和项改正的振幅:%d\n轨道倾角:%d\n轨道倾角变化率:%d\n星历参考时刻:%d\n',cus,crc,crs,i0,idot,toe)
fclose(fid);
、输出结果
2、针对第二部分内容:
2、主要函数
boolCGps::GetGpsPosition()
{
GPSTIME ts;
GPSTIME tr;
GPSTIME ts0;
GPSTIME oGTime;
GPSTIME nGTOC;
vector<GpsSendPosition>SendSignPosition;
GpsPos GpsPTemp;
3、每人独立完成实验规定的内容
二、实验内容
本实验内容包括:
内容一:编程实现GPS起点1980年1月6日0时对应的儒略日
内容二:编程实现2011年11月27日对应的GPS周数与一周内的秒数
内容三:在WGS84椭球的条件下,编程实现当中央子午线为117度时,计算高斯坐标x = , y = 对应的经纬度坐标?
Obs_types = [Obs_types ot];
end;
ifound_types = 1;
end;
end;
%fclose(fid);
“grabdata”函数:
functionObs = grabdata(fid, NoSv, NoObs)
%GRABDATA Positioned in a RINEX file at a selected epoch
4、理清程序各模块的功能结构
三
1、实验思路:
在老师提供的“SPP”文件中,直接利用卫星位置计算函数,进行卫星位置的计算,将利用“”文件中的”GetGpsPosition”函数,利用其中的迭代求解卫星位置部分,用“cout”直接将卫星迭代后的位置直接输出,因为星历文件中有较多的星历,所以利用循环语句,将求解出来的卫星位置依次输出出来。
end;
end
answer = findstr(line,'APPROX POSITION XYZ');
if~isempty(answer)
fork = 1:3
[app_XYZ, line] = strtok(line);
del = str2num(app_XYZ);
approx_XYZ = [approx_XYZ del];
2013 级测绘工程专业
卫星导航定位算法与程序设计
实
验
报
告
实验名称:卫星导航基本程序设计
班 级:
学 号:
姓 名:
实验时间:2016年6月28日~2016年6月30
中 国 矿 业 大 学
实验一 时空基准转换
一、实验目的
1、加深对时空系统及其之间转换关系的理解
2、掌握常用时空基准之间的转换模型与软件实现
answer = findstr(line,'ANTENNA: DELTA H/E/N');
if~isempty(answer)
fork = 1:3
[delta, line] = strtok(line);
del = str2num(delta);
ant_delta = [ant_delta del];
、主要函数:
“anheader”函数:
function[Obs_types, ant_delta,ifound_types,approx_XYZ] = anheader(file)
fid = fopen(file,'rt');
eof = 0;
ifound_types = 0;
Obs_types = [];
fork = 1:NoObs
Obs(u,k) = str2num(lin(2+16*(k-1):16*k-2));
end
end
else% This will typical be Z12 data
Obs = Obs(:,[1 2 3 4 5]);% We cancel the last two columns 6 and 7
编程实现O文件读入,并采用中文标注出主要参数的名称及作用;
、实现思路:通过matlab的函数“fopen”读取O文件,得到O文件的指针,通过“anheader”函数将文件中的接收机大致位置”approx_XYZ1”,天线的偏移值”ant_delta1”,观测值类型“Obs_types1”等读入成为matlab的矩阵,然后通过循环,利用“grabdata”函数将所需要的历元的观测文件依次输出来,最后通过“fprintf”函数,将所需要的数据依次打印出来。
NoObs = 5;
foru = 1:NoSv
lin = fgetl(fid);
lin_doppler = fgetl(fid);
fork = 1:NoObs%%-1
ifisempty(str2num(lin(1+16*(k-1):16*k-2))) == 1, Obs(u,k) = nan;
else%
具体的实现函数:
“TIME2JUL”函数:
doubleCTimeTr::TIME2JUL() XT”文件即可。
、主要函数代码:
“get_eph”函数:
functioneph = get_eph(ephemeridesfile)
fide = fopen(ephemeridesfile);
[eph, count] = fread(fide, Inf,'double');
ant_delta = [];
approx_XYZ = [];
while1% Gobbling the header
line = fgetl(fid);
answer = findstr(line,'END OF HEADER');
if~isempty(answer),break;end;
if(line == -1), eof = 1;break;end;
noeph = count/22;
eph = reshape(eph, 22, noeph);
“rinexe”函数(部分):
functionrinexe(ephemerisfile, outputfile)
fide = fopen(ephemerisfile);
head_lines = 0;
while1
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);
内容四:WGS84椭球下,表面x=-2408000; y=4698000;z= 3566000处的地平坐标系坐标为: e=;n=;u=的点对应的直角坐标为多少?
三
1.针对第一、二部分内容:
解决思路:先建立””的头文件,将格里高利历、GPS时间结构、儒略日时间结构共结构体的方式放在里面;在建立“TimeTr”的头文件,建立类“CTimeTr”,创建变量“GPSTime”、“Time”、”JulDay”,并且申明函数“TIME2JUL”、“TIME2GTIME”等,用这些函数分别实现所需要的转换。
{
double*VX=newdouble[4];j++)
{
oGTime);
tr=oGTime;
oData[i].oObserveData[j].PRN,nTheFitPoint);
if(nTheFitPoint==-1)
{
"PRN=%d没?有?D对?应?|星?历¤¨2",oData[i].oObserveData[j].PRN);
end;
end
answer = findstr(line,'# / TYPES OF OBSERV');
if~isempty(answer)
[NObs, line] = strtok(line);
NoObs = str2num(NObs);
fork = 1:NoObs
[ot, line] = strtok(line);
一、实验目的
1、进一步熟悉N文件的读入
2、掌握开普勒参数计算卫星轨道的过程
3、编程实现采用广播星历计算卫星轨道
4、掌握MATLAB函数调用步骤
二、
本实验内容包括:
1、调试时间转换函数,熟悉内容,备主函数调用
2、调试广播星历导航文件的读入程序,备主函数调用
3、根据卫星位置计算公式编写主函数,同时调用时间转换、星历读取等的子函数来共同完成卫星位置的计算,最后输出计算结果
OC,nGTOC);
ClkBias+
nData[nTheFitPoint].dClkDrift*nData[nTheFitPoint].dClkDriftRate*
pow(ObserveData[j].PRN;
=;
=;
=;
=oData[i].oObserveData[j].dC1;
if(i<10)
cout<<i+1<<" "<<<<" "<<<<" "<<<<" "<<
Obs(u,k) = str2num(lin(1+16*(k-1):16*k-2));
end
% Obs(u,NoObs) = str2num(lin(65:78));
end
end
பைடு நூலகம்end
实验结果
四、实验感想
这部分实验是我在之前做的,之前自己有看过“gps_easy”有关的代码,看过相关的“N文件”“O文件”读写函数,并且学会了如何调用这些函数,对里面的输出量有了一点的了解,所以我自己的主要工作就是运用了“fprintf”函数,将读取到matlab中的矩阵写入TXT文档中,这部分工作量不是很大,但较有意义。
通过这部分实验是我加深了对卫星轨道计算公式的了解,以及以后面对复杂的公式应该如何应对。。
% reads observations of NoSv satellites
globallin
Obs = zeros(NoSv, NoObs);
ifNoObs <= 5% This will typical be Turbo SII data
foru = 1:NoSv
lin = fgetl(fid);