根据广播星历计算GNSS卫星在瞬时地球坐标系中的坐标

前言

本文是一个简单的由广播星历计算GNSS卫星坐标的程序,可以作为一个仅用于计算坐标的程序使用,先将初始版码在这里,之后会对该程序进行一些优化。
附:这篇文章主要是为了梳理自己的一些想法、思路,高手忽略~不过里面有一些细节问题可能可以给大家带来一些帮助。

注:但是发现了一个很麻烦的情况,就是不管怎么算,都会出现几个数超过了10m的误差,之后好好回想了一下,个人感觉可能是时间参数出了一点点问题,因为程序中没有用到时间改正模型,但是由于GNSS结课后本人就把相关文件都清空了,调试起来比较麻烦,感兴趣的朋友自己试试吧!

读取文件

计算卫星坐标的第一步是获取广播星历中的数据。本文以GPS导航电文文件为例读取文件。
在这里插入图片描述
如图,在文件头之后的就是我们需要的数据,数据结构是每个星历块八行,第一行十个数据,之后每行四个。数据的含义比较复杂,可以参考其他文献。网上应该很多相关资料。
读取文件后,数据储存在一个结构体指针中。

struct EPHEMERISBLOCK
	//每小时一个卫星对应一个基本星历块
{
   
	//PRN号 
	int PRN;
	double a0, a1, a2;//时间改正数
					  //六个轨道参数
	double IODE, Crs, Deltan, M0;// ORBIT - 1
	double Cuc, e, Cus, SqrtA;// ORBIT - 2
	double Toe, Cic, OMEGA, Cis;// ORBIT - 3
	double i0, Crc, omega, OMEGAdot;// ORBIT - 4
	double IDOT, GpsWeekNumber, L2C, L2P;// ORBIT - 5
	double SatAccuracy, SatHealth, TGD, IODC;// ORBIT - 6
};

## 

构造一个计算类CMyCalculation,专门用于完成读取文件和计算功能,在类中添加以下变量和方法:

private:
	int EphemerisBlockNum;//记录星历块数目
	EPHEMERISBLOCK *m_pGpsEphemeris;//记录星历数据
	public void ReadBrodcastEphemeris(CString strEpheNam);

以下为读取文件函数的实现:

void CMyCaculation::ReadBrodcastEphemeris(CString strEpheNam)
{
   
	int HeadLineNum = 0;
	int WeekNo;
	double WeekSecond;
	//打开文件
	CStdioFile pfEph;
	BOOL IsEn = pfEph.Open(strEpheNam, CFile::modeRead);
	if (!IsEn) {
   
		
		AfxMessageBox(_T("文件读取失败"),MB_OK,0);
		return;
	}
	
		
	//读入头文件
	CString strLine;

	while (IsEn)
	{
   
		IsEn = pfEph.ReadString(strLine);
		HeadLineNum++;
		int index = strLine.Find(CString("END OF HEADER"));
		if (-1 != index)
			break;
	}
	//计算星历块数
	int AllNum = 0;
	while (IsEn)
	{
   
		IsEn = pfEph.ReadString(strLine);
		AllNum++;
	}
	
	//指针不为空时释放指针内存,之后重新赋值
	if(NULL!=m_pGpsEphemeris){
   
		delete m_pGpsEphemeris;
	}
	
	//临时读入星历块
	EphemerisBlockNum = (AllNum + 1) / 8;
	m_pGpsEphemeris = new EPHEMERISBLOCK[EphemerisBlockNum];
	GPSTIME  *pGpsTime = new GPSTIME[EphemerisBlockNum];

	if (!m_pGpsEphemeris || !pGpsTime) return;
	//将文件指针调整到数据位置
	pfEph.SeekToBegin();
	for (int i = 0; i<HeadLineNum; i++)
		IsEn = pfEph.ReadString(strLine);
	//定义读取的参数
	int mPrn;//卫星号PRNo 
	int year, month, day, hour, minute;//卫星钟参考时刻
	double   msecond;
	double   a0, a1, a2;//卫星钟飘参数
	double   IODE, Crs, DeltN, M0;//数据星历发布时间,在轨道径向方向上周期改正正弦的振幅
	double   Cuc, e, Cus, sqrtA;//轨道延迹方向上周期改正余弦振幅 、扁心率、轨道延迹方向上周期改正正弦振幅 、长半轴平方根 
	double   Toe, Cic, OMEGA, Cis;//星历参考时刻、轨道倾角周期改正余弦项振幅、参考时刻升交点赤径主项、轨道倾角周期改正正弦项振幅
	double   i0, Crc, omega, OMEGADOT;//参考时间轨道倾角、在轨道径向方向上周期改正余余弦的振幅、近地点角距、升交点赤径在赤道平面中的长期变化
	double   IDOT, L2C, GPSWeek, L2P;轨道倾角变化率、??、gps周
	double   AccuracyofSat, HealthofSat, TGD, IODC;//卫星精度、卫星健康、电离层群迟改正数

												   //将以下循环中读取数据的CString都改为char*类型strline
	for (int i = 0; i<EphemerisBlockNum; i++)
	{
   
		//读取卫星PRN号,星历参考时间
		IsEn = pfEph.ReadString(strLine);
		strLine.Replace('D', 'e');
		char* strline = CSTR2CAHR(strLine);//
		sscanf_s(strline, "%d %d %d %d %d %d %lf %lf %lf %lf", &mPrn, &year, &month, &day, &hour, &minute, &msecond, &a0, &a1, &a2);

		year += 2000;

		WeekNo = Calendar2GpsTime(year, month, day, hour, minute, msecond, WeekSecond);
		pGpsTime[i].weekno = WeekNo;
		pGpsTime[i].weekSecond = WeekSecond;

		IsEn = pfEph.ReadString(strLine);
		strLine.Replace('D', 'e');
		strline = CSTR2CAHR(strLine);
		sscanf_s(strline, "%lf %lf %lf %lf", &IODE, &Crs, &DeltN, &M0);

		//读 Cuc,e,Cus,sqrtA
		IsEn = pfEph.ReadString(strLine);
		strLine.Replace('D', 'e');
		strline = CSTR2CAHR(strLine);
		sscanf_s(strline, "%lf %lf %lf %lf", &Cuc, &e, &Cus, &sqrtA);

		//Toe,Cic,OMEGA,Cis;
		IsEn = pfEph.ReadString(strLine);
		strLine.Replace('D', 'e');
		strline = CSTR2CAHR(strLine);
		sscanf_s(strline, "%lf %lf %lf %lf", &Toe
  • 47
    点赞
  • 244
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
GLONASS是俄罗斯的一个全球导航卫星系统,用于提供全球定位、导航和时间服务。广播星历计算是指将导航卫星的轨道参数和钟差等信息编码成广播星历数据,并广播给用户接收设备,以便用户设备能够计算出准确的定位信息。 GLONASS系统的导航卫星持续地向地面广播星历数据,而用户设备在接收卫星信号时会同时接收到星历数据。星历数据包含了卫星的位置、速度、时钟差等关键参数,用户设备利用这些信息能够计算卫星与设备之间的距离,从而实现定位。 广播星历计算的过程分为两步:星历数据的接收和星历计算。 首先,用户设备通过接收卫星信号获取到卫星广播星历数据。接收到星历数据后,用户设备会将数据进行解码和解析,提取出其的轨道参数和时钟差。 接下来,用户设备使用接收到的星历数据,结合设备自身的观测数据,通过计算算法来计算出自己的位置。计算过程会使用到卫星的位置和时钟信息,以及卫星与设备之间的距离等参数,从而得到较为准确的定位结果。 需要注意的是,星历数据会不断地更新,因为卫星的轨道和钟差都可能会有变化。为了获取最新的星历数据,用户设备需要定期更新星历信息。 总结起来,GLONASS广播星历计算是通过接收卫星广播星历数据,解析并计算出设备的位置信息的过程。它是GLONASS系统能够为用户提供准确定位的重要基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值