GPS卫星位置计算.docx
《GPS卫星位置计算.docx》由会员分享,可在线阅读,更多相关《GPS卫星位置计算.docx(14页珍藏版)》请在冰豆网上搜索。
GPS卫星位置计算
GPS卫星位置计算实验
学校:
合肥工业大学
学号:
20104168
专业班级:
测绘工程10-1班
学院:
土木与水利工程学院
指导教师:
陶庭叶
一、实验目的
1、通过对GPS卫星位置的计算,增强我们对《GPS测量原理及应用》课程的理解,使我们牢固掌握GPS测量的基本原理和过程,熟悉GPS测量数据处理的基本技能和计算方法。
2、提高运用计算机语言编程开发能力,运用测量平差知识、数学知识和计算机知识,通过给定的程序算法,编制程序实现GPS卫星位置的计算过程。
二、实验内容及要求
1、通过课堂对GPS测量原理的学习,在课后自主完成GPS卫星位置的计算过程并按照课本上的步骤设计程序完成GPS卫星位置的计算过程;
2、要求每位同学独立完成GPS卫星位置的计算过程,编写程序,调试程序,并编写程序设计文档。
要求过程和算法正确、程序运行正确、设计文档完备;
三、课程设计工具
运用自己熟悉的编程开发语言(C、C#、C++、VC、VS、VB、FORTRAN等)。
四、实验总结
1、实验简单介绍
运行后的主界面比以前做的程序要漂亮些,给界面增加了一副图片,让界面看起来还是比较的漂亮,但由于起始的参数较多,因此,界面整体看起来比较的拥挤,但这个不影响程序的计算过程。
整个程序的功能不是很多,但满足了基本的要求,能够进行卫星的位置计算,并且能够达到很好的精度,与课本上给出的结果相差很小,符合实验的要求。
为了避免繁琐的数据的输入,在本次程序中我增加了一个
的功能按钮,点击
后,程序自动给相关的起始数据赋值并显示在界面上,如图所示:
这些数据是教材《GPS测量原理与应用》41页的卫星星历数据;
用户也可以根据需要更改相应的数据,如上图所示,当点击
按钮时,就可以在对话框相应的位置计算出卫星的坐标,如下图所示:
其中,计算出的卫星的坐标为Xk=4589210.3510074820,Yk=25371005.6999580190,Zk=-5618292.2998269377,这是卫星在地固坐标系中的坐标,如果还知道极移参数就可以计算出卫星在协议地球坐标系中的坐标了。
用户也可以选择清除计算的结果,点击
即可完成,如下图所示:
用户也可以选择重新输入数据,点击
就可以将输入的参数清零,如下图所示。
每次的默认数据均相同,用户可以选择输入默认数据后再更改需要更改的地方,来完成计算过程。
当用户选择了重新输入后,即所有的起始数据均清零后,此时不能参与计算,若用户点击了
按钮,则系统会提示用户输入的数据有误!
当运行程序显示主界面时,如果用户同样不小心点击了
按钮,则会出现同样的提示信息,以此来提示用户没有输入起始数据,避免产生不必要的错误。
当数据清零后点击
会提示用户输入的数据有误!
2、
实验心得
GPS卫星位置的计算实验不是很难,因为实验过程在书上很详细,只要按照步骤进行,计算过程就不会出现问题。
我起始是先把程序调试正确,在调试的过程中,采取了简单的直接给参数赋值的方法,因此,很快就把程序调试正确了。
在后期的修改工作中,我修改掉了直接赋值的地面观测时刻对应的标准GPS时间t,而是通过计算过程得出的。
这样要不了多久就把整个程序调通了,调试过程没有花很多的时间。
在查了一些资料后,我给对话框的界面增加了一幅位图,并在图片上打印出字体,调整界面的编辑框的分布后看上去整个程序就变得挺不错的,尽管界面看起来有点儿拥挤,但并不影响程序的计算过程的正确性。
整体来说效果不错,但显然需要改进的地方很多,就像刚才说的,界面整体看起来比较拥挤,这个更改起来比较容易,如下图所示:
这样看起来就比较的舒服,不会导致眼睛疲劳,但中间的计算过程均没有,调试时我们可以选择前者,后期修改时我们就可以去掉中间的计算过程。
这是做的比较好的方面。
程序可能还曾在很多我没有发觉的问题,还请老师多多指教。
3、
实验源代码(部分)
voidCGPSDlg:
:
OnJisuan()
{
UpdateData();
if(!
(m_a0||m_a1||m_a2||m_Cic||m_Cis||m_Crc||m_Crs||
m_Cuc||m_Cus||m_dn||m_e&&m_roota||m_I||m_i0||m_M0||m_Q||m_Q0||m_toc||m_toe||m_tph||m_tpm||m_w))
{
MessageBox("输入数据有误,请重新输入!
");
SetFocus();
}
else
{
//n0,n,tk,Mk,Ek,Vk,cosVk,sinVk,du,dr,di,uk,rk,ik,xk,yk,,Xk,Yk,Zk均为课本上参数
//Ek1为趋近计算迭代参数,Fk为φk,Qk为Ωk,ω
doublen0,n,tk,Mk,Ek,Ek1,cosVk,sinVk,Vk,Fk,du,dr,di,uk,rk,ik;
doublexk,yk,Qk,Xk,Yk,Zk,t,t1,dn;
charx[40],y[40],z[40];
//charch1[40],ch2[40],ch3[40],ch4[40],ch5[40],ch6[40],ch7[40],ch8[40],ch9[40],ch10[40],ch11[40],ch12[40],ch13[40],ch14[40],ch15[40],ch16[40];
//计算卫星运行的平均角速度n0和n
n0=sqrt(u)/(m_roota*m_roota*m_roota);
n=n0+m_dn;
//计算归化时间
t1=m_tph*3600+m_tpm*60;
dn=m_a0+m_a1*(t1-m_toc)+m_a2*(t1-m_toc)*(t1-m_toc);
t=t1-dn;
tk=t-m_toe;
//观测时刻卫星平近点角Mk的计算
Mk=m_M0+n*tk;
//计算偏近点角Ek,趋近计算
Ek1=Mk;
do{
Ek=Ek1;
Ek1=Mk+m_e*sin(Ek);
}while(fabs(Ek1-Ek)>1e-12);
//真近点角Vk的计算
cosVk=(cos(Ek)-m_e)/(1-m_e*cos(Ek));
sinVk=(sqrt(1-m_e*m_e)*sin(Ek)/(1-m_e*cos(Ek)));
Vk=atan(sinVk/cosVk);
//判断Vk的正负号
if(sinVk>0&&cosVk>0)
Vk=fabs(Vk);
elseif(sinVk>0&&cosVk<0)
Vk=PI+Vk;
elseif(sinVk<0&&cosVk>0)
Vk=Vk;
else
Vk=PI+Vk;
//升交距角φk的计算,用Fk表示
Fk=Vk+m_w;
//摄动改正项计算
du=m_Cuc*cos(2*Fk)+m_Cus*sin(2*Fk);
dr=m_Crc*cos(2*Fk)+m_Crs*sin(2*Fk);
di=m_Cic*cos(2*Fk)+m_Cis*sin(2*Fk);
//经过摄动改正后的升交距角的Uk,卫星矢径的摄动量,轨道倾角
uk=Fk+du;
rk=m_roota*m_roota*(1-m_e*cos(Ek))+dr;
ik=m_i0+di+m_I*tk;
//计算卫星在轨道平面坐标系的坐标
xk=rk*cos(uk);
yk=rk*sin(uk);
//观测时刻升交点经度的计算
Qk=m_Q0+(m_Q-we)*tk-we*m_toe;
//计算卫星在地心固定坐标系中的直角坐标
Xk=xk*cos(Qk)-yk*cos(ik)*sin(Qk);
Yk=xk*sin(Qk)+yk*cos(ik)*cos(Qk);
Zk=yk*sin(ik);
sprintf(x,"%.10lf",Xk);
sprintf(y,"%.10lf",Yk);
sprintf(z,"%.10lf",Zk);
GetDlgItem(IDC_EDIT20)->SetWindowText(x);
GetDlgItem(IDC_EDIT21)->SetWindowText(y);
GetDlgItem(IDC_EDIT22)->SetWindowText(z);
}
UpdateData(FALSE);
}
voidCGPSDlg:
:
OnDefault()
{//设置默认数据,数据为课本p41页的广播星历数据,其中观测时刻为2时0秒
m_tph=2.0;m_tpm=0.0;m_toc=7200.0;
m_a0=-0.231899321079e-06;
m_a1=0.0;m_a2=0.0;
m_toe=0.720000000000e+04;
m_roota=0.515365263176e+04;
m_e=0.678421219345e-02;
m_i0=0.958512160302e+00;
m_w=-0.258419417299e+01;
m_Q0=-0.137835982556e+01;
m_M0=-0.290282040486e+00;
m_dn=0.451411660250e-08;
m_Q=-0.819426989566e-08;
m_I=-0.253939149013e-09;
m_Cus=0.912137329578e-05;
m_Cuc=0.189989805222e-06;
m_Cis=0.949949026108e-07;
m_Cic=0.130385160446e-07;
m_Crs=0.406250000000e+01;
m_Crc=0.201875000000e+03;
UpdateData(FALSE);
}