<-- Home |--rust |--rfe

RFE 007: 工程师(粗)Rust入门之完成SGP4/8计算器

完成SGP4/8计算器

小龙真是威猛,他已经把SGP4/8的核心计算代码都翻译完了。

SGP代表Simplified General Perturbations,是一种用于计算卫星轨道的算法。SGP4和SGP8是两种不同的版本,后者在前者的基础上提供了更高的精度。

这个名字叫做Simplified General Perturbations,是因为它简化了对卫星轨道的扰动计算,使得计算过程更加高效。因为摄动本身非常复杂,参考刘林大佬的《卫星轨道力学》一书,摄动包括大气阻力、地球非球形引力、太阳和月球引力等多种因素。

大佬本人

这些计算都在大佬的书中有详细的介绍。

航天器轨道理论

轨道力学基础

基本上,相关专业的同学都会被这几本书折磨,国内其它的书要不太过简陋要不太过简陋,只有刘老师的书让人欲死欲仙十分容易记住他的名字。

不过,一般还是Simplified更受欢迎……,所以一般而言都是用老美的SpaceTrack Report Number 3(STR#3)所实现的Fortran代码来计算外推卫星轨道;2006年有有大佬把STR#3的Fortran代码之后的修正进行了讨论和总结,形成了Revisiting STR#3的报告,之后还有一点点进展……我已经不记得名字,所以小龙也不知道,就照着RSTR#3和以为小兄弟实现的Matlab代码来翻译了。

Crates.io

Rust之所以吸引人,还有一个重要原因,就是它的包管理和生态系统。Rust的包管理工具叫做Cargo,而Rust的包注册中心叫做Crates.io。

这个sgp包,可以直接通过Cargo来添加依赖:

1cargo new sgp-calculator
2cd sgp-calculator
3cargo add sgp

这样是不是显得过于简单了……

这个时候,我们就可以在代码中使用sgp包了。当我们编译代码,Cargo会自动下载并编译sgp包。

小龙就只会前面我们所说的,let xxx = yyy + zzz这样的简单代码,以及勉强的定义了几个结构体和函数……

所以spg相当无聊,代码只有1258行,你们不要手欠,跑到sgp去看前面3个版本,那个时候我不小心把Matlab的SGP4/8代码外加前面提到的两个报告的pdf版本也整上去了,导致这个包达到了2.78M,想想浪费了多少Mirror站的带宽和空间。真是不好意思。代码倒都是一个样……哎,不熟练的锅。

当然,我们cargo build了一次之后,spg的源代码就在~/.cargo/registry/src/目录下了,可以去看看。

示例

示例代码就几行,简单看了下预测结果:

 1use sgp::Vector3;
 2use sgp::sgp4;
 3use sgp::parse_tle_lines;
 4
 5
 6fn to_string(v: &Vector3) -> String {
 7    format!("{:12.4} {:12.4} {:12.4}", v.x, v.y, v.z)
 8}
 9
10fn main() {
11    let tle_line1 = "1 00008U 58004  B 60095.16166626  .02607090 +00000-0 +00000-0 0  9993";
12    let tle_line2 = "2 00008 065.0599 163.5585 0088318 135.6760 224.6847 16.28328133100004";
13
14    let sat = parse_tle_lines(tle_line1, tle_line2).expect("Error parsing TLE lines");
15
16
17    for i in 0..=6000 {
18        let minutes = i as f64 / 60.0;
19        let (position, velocity) = sgp4(minutes, &sat);
20        println!("{:12.4} {} {}", minutes * 60.0, to_string(&position), to_string(&velocity));
21    }
22
23}

这里在SpaceTrack上找了一个TLE数据,然后计算了前100分钟的轨道位置和速度。

轨道预测结果

基本是个圆形轨道,符合预期。


文章标签

|-->rust |-->engineering |-->tutorial |-->sgp4 |-->sgp8 |-->orbital-mechanics


GitHub