GPS卫星坐标计算.docx
《GPS卫星坐标计算.docx》由会员分享,可在线阅读,更多相关《GPS卫星坐标计算.docx(13页珍藏版)》请在冰豆网上搜索。
GPS卫星坐标计算
卫星定位技术与方法
--根据广播星历参数计算卫星坐标作业报告
作业日期:
2010年12月08日
目录
一.已知数据2
二.计算步骤2
1.平均角速度(meanangularspeed)2
2.规化时刻(normaltime)3
3.平近点角(meananomaly)3
4.偏近点角(eccentricanomaly)3
5.真近点角(trueanomaly)3
6.升交距角(argumentofascendingnode)3
7.轨道向径(Orbitalradius)3
8.扰动改正(Perturbedcorrection)4
10.卫星在升交点轨道直角坐标系中的坐标4
11.升交点经度(Longitudeofascendingnode)5
三.源程序5
四.程序运行结果14
七.作业体会15
根据广播星历参数计算卫星坐标
一.已知数据:
根据以下的广播星历参数计算UTC2004年1月30日8点0分00秒—20分00秒,每隔一分钟的PRN7的卫星坐标。
ComputethecoordinateofPRN7withintervalof1minute.
Navigationdata:
卫星导航文件格式:
二.计算步骤:
Thestepsforsatellitecoordinates
1.平均角速度(meanangularspeed):
n由广播星历获得,GM=3.986005e+14
2.规化时刻(normaltime):
t0已知(由广播星历获得),t为GPS周秒
3.平近点角(meananomaly):
M0已知(由广播星历获得)
4.偏近点角(eccentricanomaly):
迭代求解:
初始值取E=M,以弧度为单位
5.真近点角(trueanomaly):
6.升交距角(argumentofascendingnode):
近地点角距(argumentofperigee)
7.轨道向径(Orbitalradius):
8.扰动改正(Perturbedcorrection):
•升交角距(Argumentofascendingnode)
•
•轨道向径(Orbitalradius)
•轨道顷角(Orbitalinclination)
是升交角距(theargumentofascendingnode)
9.改正后升交角距、轨道向径、轨道倾角
改正后升交角距(Correctedargumentofascendingnod)
改正后的轨道向径(Correctedorbitalradius)
改正后的轨道倾角(Correctedorbitalinclination)
10.卫星在升交点轨道直角坐标系中的坐标:
如下图所示
11.升交点经度(Longitudeofascendingnode):
如下图所示
12.在地固坐标系中的卫星位置(Expressedinsphericcoordinatesystem)
三.源程序:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.IO;
usingSystem.Text.RegularExpressions;
namespaceTest
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
listView1.Columns.Add("序号",40);
listView1.Columns.Add("星历内容",130);
listView1.Columns.Add("导航数据",130);
listView1.GridLines=true;//显示表格线
listView1.View=View.Details;//显示表格细节
listView1.HeaderStyle=ColumnHeaderStyle.Clickable;//对表头进行设置
listView2.Columns.Add("时间",60);
listView2.Columns.Add("x坐标",150);
listView2.Columns.Add("y坐标",150);
listView2.Columns.Add("z坐标",150);
listView2.GridLines=true;//显示表格线
listView2.View=View.Details;//显示表格细节
listView2.HeaderStyle=ColumnHeaderStyle.Clickable;//对表头进行设置
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
//读取相对路径
stringstr1=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
stringfilename=str1+"navigationdata.txt";
//读取卫星广播星历文件
StreamReadermyreader=newStreamReader(filename,Encoding.Default);
stringmyinfo=myreader.ReadToEnd();
myreader.Close();
//把卫星广播星历里的D改为e,以便后续计算
stringmystring=myinfo;
stringmyinfor=mystring;
myinfor=mystring.Replace("D","e");
//把数据分开读入到一个数组中存储
string[]split=newstring[]{""};
string[]arrs=myinfor.Split(split,StringSplitOptions.RemoveEmptyEntries);
double[]M=newdouble[arrs.Length];
//星历代码
string[]N=newstring[arrs.Length];
N[0]="PRN";N[1]="Yer";N[2]="Mon";N[3]="day";N[4]="H";N[5]="M";N[6]="sec";N[7]="a0";N[8]="a1";N[9]="a2";
N[10]="IODE";N[11]="Crs";N[12]="delta-n";N[13]="M0";
N[14]="Cuc";N[15]="e";N[16]="Cus";N[17]="sqrt(a)";
N[18]="t0e";N[19]="Cic";N[20]="omega0";N[21]="Cis";
N[22]="i0";N[23]="Crc";N[24]="omega";N[25]="omega-spot";
N[26]="IDOT";N[27]="CodesonL2channel";N[28]="GPSWeek";N[29]="L2Pdataflag";
N[30]="SVaccuracy";N[31]="SVhealth";N[32]="TGD";N[33]="IODCIssueofData";
N[34]="Transmissiontimeofmessage";
//把卫星广播星历读入到数组中
for(inti=0;i{
ListViewItemli=newListViewItem();
li.Text=(i+1).ToString();
li.SubItems.Add(N[i]);
li.SubItems.Add(arrs[i]);
listView1.Items.Add(li);
M[i]=double.Parse(arrs[i]);
}
doublet0e=460800.00;
doublet;
double[]XK=newdouble[21];
double[]YK=newdouble[21];
double[]ZK=newdouble[21];
for(intl=0;l<21;l++)
{
//计算平均角速度
doubleGM=3986004.418e008;
doublen,n0;
n0=Math.Sqrt(GM/(Math.Pow(M[17],6)));
n=M[12]+n0;
//规划时刻
t=t0e+l*60;
doubletk=t-t0e;
doubleMk=M[13]+n*tk;
//迭代计算平近点角的计算
doubleEk,Ek1;
Ek=Mk;
Ek1=Mk+M[15]*Math.Sin(Ek);
do
{
Ek=Ek1;
Ek1=Mk+M[15]*Math.Sin(Ek);
}
while(Math.Abs(Ek1-Ek)>1e-15);
//计算真近点角
doubleVk=Math.Atan(((Math.Sqrt(1-M[15]*M[15])*Math.Sin(Ek)))/(Math.Cos(Ek)-M[15]));
//反正切值的象限处理
doubleA1=Math.Atan(((Math.Sqrt(1-M[15]*M[15])*Math.Sin(Ek))));
doubleA2=Math.Cos(Ek)-M[15];
if(Vk<0)
{
if(A1<0&&A2>0)
{
Vk+=2*Math.PI;
}
if(A1>0&&A2<0)
{
Vk+=Math.PI;
}
}
else
{
if(A1<=0&&A2<=0)
Vk=Vk+Math.PI;
}
//计算升交角距
doublefk=Vk+M[24];
//摄动改正值的计算
doubledu=M[14]*Math.Cos(2*fk)+M[16]*Math.Sin(2*fk);
doubledr=M[23]*Math.Cos(2*fk)+M[11]*Math.Sin(2*fk);
doubledi=M[19]*Math.Cos(2*fk)+M[21]*Math.Sin(2*fk);
//摄动改正
doubleuk=fk+du;
doublerk=Math.Pow(M[17],2)*(1-M[15]*Math.Cos(Ek))+dr;
doubleik=M[22]+di+M[26]*tk;
//计算卫星在升交点轨道直角坐标系的坐标
doublexk=rk*Math.Cos(uk);
doubleyk=rk*Math.Sin(uk);
//计算升交点经度
doublewe=7.2921151467e-05;
doublejdt=M[20]+(M[25]-we)*tk-we*M[18];
//卫星在地固坐标系中的空间直角坐标
XK[l]=xk*Math.Cos(jdt)-yk*Math.Cos(ik)*Math.Sin(jdt);
YK[l]=xk*Math.Sin(jdt)+yk*Math.Cos(ik)*Math.Cos(jdt);
ZK[l]=yk*Math.Sin(ik);
}
//输出卫星在地固坐标系中的空间直角坐标
for(inti=0;i<21;i++)
{
ListViewItemlist=newListViewItem();
list.Text="第"+i.ToString()+"分钟";
list.SubItems.Add(XK[i].ToString());
list.SubItems.Add(YK[i].ToString());
list.SubItems.Add(ZK[i].ToString());
listView2.Items.Add(list);
}
}
privatevoidbutton2_Click(objectsender,EventArgse)
{
//读取相对路径
stringstr1=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
stringfilename=str1+"navigationdata.txt";
//读取卫星广播星历文件
StreamReadermyreader=newStreamReader(filename,Encoding.Default);
stringmyinfo=myreader.ReadToEnd();
myreader.Close();
//把卫星广播星历里的D改为e,以便后续计算
stringmystring=myinfo;
stringmyinfor=mystring;
myinfor=mystring.Replace("D","e");
//把数据分开读入到一个数组中存储
string[]split=newstring[]{""};
string[]arrs=myinfor.Split(split,StringSplitOptions.RemoveEmptyEntries);
//星历代码
string[]N=newstring[arrs.Length];
N[0]="PRN";N[1]="Yer";N[2]="Mon";N[3]="day";N[4]="H";N[5]="M";N[6]="sec";N[7]="a0";N[8]="a1";N[9]="a2";
N[10]="IODE";N[11]="Crs";N[12]="delta-n";N[13]="M0";
N[14]="Cuc";N[15]="e";N[16]="Cus";N[17]="sqrt(a)";
N[18]="t0e";N[19]="Cic";N[20]="omega0";N[21]="Cis";
N[22]="i0";N[23]="Crc";N[24]="omega";N[25]="omega-spot";
N[26]="IDOT";N[27]="CodesonL2channel";N[28]="GPSWeek";N[29]="L2Pdataflag";
N[30]="SVaccuracy";N[31]="SVhealth";N[32]="TGD";N[33]="IODCIssueofData";
N[34]="Transmissiontimeofmessage";
//把卫星广播星历文件内容输出到listView进行查看
for(inti=0;i{
ListViewItemli=newListViewItem();
li.Text=(i+1).ToString();
li.SubItems.Add(N[i]);
li.SubItems.Add(arrs[i]);
listView1.Items.Add(li);
}
}
}
}
四.程序运行结果:
星历内容的读取、显示:
卫星坐标计算结果:
运行界面:
作业体会:
此次作业,收获颇多。
起初由于自己的疏忽,在真近点角的计算时忘了处理象限,导致做后的结果都差了一个负号,所以不管做什么都得认真、细心;想要做好一件事情,必须有百分百的投入,有足够的专注度;发现自己对GPS卫星定位技术与方法这方面知识越来越感兴趣,以后要多加学习。
由于教材上、老师的课件上都有明细的计算步骤,作业起来很方便,不容易出错,经过计算,发现程序运行出来的卫星坐标结果与教材上给的坐标有较大的差距,这个差距达到几十米,检查程序也没有发现问题,问了班上几个同学,他们也都说存在这样的问题,所以,恳请老师给予指点。