分别用精密星历和广播星历计算卫星坐标 -- 对 GNSS 第一次编程的总结

本文总结了利用广播星历和精密星历计算卫星坐标的方法。介绍了所需知识点如旋转矩阵、拉格朗日插值及星历数据格式,并分享了C语言实现的源码与调试经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019/9/24
最近上GNSS 课,老师布置了编写读取广播星历和精密星历来计算卫星坐标的作业,这篇文章对其进行一个简单的总结。
星历下载:https://blog.csdn.net/Gou_Hailong/article/details/100809806

一、用到的知识点

1、旋转矩阵
在这里插入图片描述
百度百科
2、拉格朗日插值
在这里插入图片描述
百度百科
3、RINEX 也就是广播星历的数据格式
参考博客

4、SP3
在这里插入图片描述
(图片来源于百度文库
参考博客

二、要注意的问题

1、用 actan2 函数

2、XXDXX字符串转double 用函数

double st2d(char *str)
{   //将"aDb"格式数字转换为double
	double f;
	char *pEnd;
	f = strtod(str, &pEnd);
	f *= pow(10, strtod(pEnd + 1, NULL));
	return f;
}

3、截取子串的函数

char st[85] = "";//求子串用到
char *substr(char *buf, int pos, int len)
{   //求子串
	memset(st, '\0', sizeof(st));
	return strncpy(st, buf + pos, len);
}

4、调试过程中如果出现 stack overflow 问题,
解决方案:属性->链接器->系统->堆栈保留大小 改的大一些

5、调用 strcpy、strcat 等函数时会提示 _CRT_SECURE_NO_WARNINGS 警告,原因是这些函数不安全,可能会造成内存泄露等。
解决方案1:
在头部加宏定义:

#define  _CRT_SECURE_NO_WARNINGS

解决方案2:
在项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定中添加 _CRT_SECURE_NO_WARNINGS 这个预定义。
2020/5/12
应某些朋友的请求,终于抽出时间来介绍自己当时所做的工作,详见如下:

三、算法原理

由于时间太久,再看代码的话,不免有些生疏(我是谁,我在哪,这是我写的吗?)还好教材比较详细,就不费功夫自己整理辽。

总结:用广播星历计算卫星位置比较复杂,用精密星历计算卫星位置就用到了拉格朗日内插而已。

声明:上图出自教材《GPS测量与数据处理》(李征航 黄劲松 编著 第三版)武汉大学出版社 P75始 此图出于方便自己和他人学习查阅之目的,如有侵权,请联系作者删除!

四、源码简介

当时在完成编程作业的时候用的是C语言,后来学了fortran 感觉星历文件就是设计的用fortran 读的。所以,最近又写了fortran 的版本(没写完)
1.C语言版本
程序结构框架:
在这里插入图片描述
此程序自带了算例文件(路径data/8.28)是2019/8/28日的广播星历和精密星历文件。程序输出(路径data/out

brdcxx.txt    //这是用广播星历计算出来的xx号卫星的坐标
spxx.txt      //这是用精密星历计算出来的xx号卫星的坐标
detxx.txt     //这是两者之间的差值   广-精
//这三个文件存储的数据格式都是 sec x y z time
//其中 sec 是一天中第几秒   单位 s
//  xyz 是卫星坐标         单位 m 
// time 是钟改正           单位 1e-6 s

输出文件可用matlab 等软件进行绘图。
广播星历结构体:
在这里插入图片描述
精密星历结构体:
在这里插入图片描述
感兴趣的朋友可以下载:
https://download.csdn.net/download/Gou_Hailong/12413077
劳动所得,赚点积分嘛。(无积分者接受有偿提供源码,嘿嘿嘿)如果使用中遇到问题欢迎私信我或联系我的qq,但是我水平有限,可能解决不了您的问题,但是我会尽力的!
值得注意的一点是:此程序要配置Egien 库:
在这里插入图片描述

1.Fortran版本(只实现了读文件)
https://blog.csdn.net/Gou_Hailong/article/details/106085616

参考/引用文章

[1] 百度百科:https://baike.baidu.com/item/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E5%85%AC%E5%BC%8F/4285592?fr=aladdin
[2] 百度百科:https://baike.baidu.com/item/%E6%97%8B%E8%BD%AC%E7%9F%A9%E9%98%B5/3265181?fr=aladdin
[3] Miaow678-CSDN博主:https://blog.csdn.net/Miaow678/article/details/83860975
[4] 灵影葬-CSDN博主:https://blog.csdn.net/liuci3234/article/details/21971241
[5] 流浪猪头拯救地球-CSDN博主:https://blog.csdn.net/Gou_Hailong/article/details/106085616
精密星历拉格朗日插值法是一种用于求解星历数据的方法。在天文学中,星历数据是指天体在天球坐标系下的位置速度,因此在航天领域中,星历数据对于精确的空间导航是至关重要的。 在matlab中,可以利用函数interp1进行拉格朗日插值。具体实现过程如下: 1. 将星历数据导入matlab中,并按照时间顺序排序。假设导入的数据矩阵为M,其中第一列为时间,第二至四列为天体在XYZ坐标系下的位置,第五至七列为天体在XYZ坐标系下的速度。 2. 设定时间插值范围。假设需要查询的时间为t,那么需要找到导入数据矩阵M中最接近t的两个时间点t1t2。可以使用函数minmax实现该步骤。 3. 计算位置插值系数。 需要计算出两个时间点对应的位置信息。具体实现方法为,将导入数据矩阵M中第二至四列按列转置后,作为插值函数的输入矩阵。将两个时间点的位置信息作为插值函数的输入变量,即可得到对应的插值系数C。 4. 计算速度插值系数。 同样,需要计算出两个时间点对应的速度信息。具体实现方法为,将导入数据矩阵M中第五至七列按列转置后,作为插值函数的输入矩阵。将两个时间点的速度信息作为插值函数的输入变量,即可得到对应的插值系数D。 5. 计算所需要的位置速度信息。插值系数CD分别对星体在位置速度方面进行了加权计算。具体实现方法为,将插值系数CD与两个时间点对应的位置速度信息相乘,然后将所有乘积相加。最终得到的就是所需查询时间点t的天体位置速度信息。 通过以上步骤,就可以用matlab实现精密星历拉格朗日插值法。当然,在具体实现过程中,需要注意数据矩阵的格式插值范围的设定。同时,为了提高插值精度计算效率,还可以采用一些优化方法,例如多项式拟合、三次样条插值等。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值