Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit92e4bb2

Browse files
committed
initial rust impl
1 parent36441d5 commit92e4bb2

File tree

6 files changed

+2091
-0
lines changed

6 files changed

+2091
-0
lines changed

‎src/rust/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name ="sgp4"
3+
version ="0.1.0"
4+
authors = ["aholinch <aholinch@users.noreply.github.com>"]
5+
edition ="2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
chrono ="0.4"

‎src/rust/src/main.rs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#![allow(warnings)]
2+
mod sgp4;
3+
use sgp4::elset_rec::ElsetRecasElsetRec;
4+
use sgp4::tle::TLEasTLE;
5+
6+
use std::fs::File;
7+
use std::io::{self,BufRead};
8+
use std::path::Path;
9+
10+
macro_rules! scan{
11+
( $string:expr, $( $x:ty),+) =>{{
12+
letmut iter = $string.split_whitespace();
13+
($(iter.next().and_then(|word| word.parse::<$x>().ok()),)*)
14+
}}
15+
}
16+
17+
18+
fnmain(){
19+
let filein ="../../data/SGP4-VER.TLE".to_string();
20+
let filever ="../../data/tcppver.out".to_string();
21+
letmut tles = sgp4::tle::read_tles(filein);
22+
23+
letmut r:[f64;3];
24+
letmut v:[f64;3];
25+
letmut vr:[f64;3];
26+
letmut vv:[f64;3];
27+
28+
letmut linestr:String;
29+
letmut i:usize;
30+
31+
letmut tle =&mutTLE::new();
32+
33+
letmut mins:f64 =0.0;
34+
35+
vr =[0.0,0.0,0.0];
36+
vv =[0.0,0.0,0.0];
37+
38+
letmut rdist:f64 =0.0;
39+
letmut vdist:f64 =0.0;
40+
letmut rerr:f64 =0.0;
41+
letmut verr:f64 =0.0;
42+
letmut cnt2:i32 =0;
43+
44+
45+
i =0;
46+
ifletOk(lines) =read_lines(filever){
47+
for linein lines{
48+
linestr = line.unwrap();
49+
if linestr.contains("xx")
50+
{
51+
tle = tles.get_mut(i).unwrap();
52+
i = i +1;
53+
}
54+
else
55+
{
56+
let output =scan!(linestr,f64,f64,f64,f64,f64,f64,f64);
57+
58+
mins = output.0.unwrap();
59+
vr[0] = output.1.unwrap();
60+
vr[1] = output.2.unwrap();
61+
vr[2] = output.3.unwrap();
62+
vv[0] = output.4.unwrap();
63+
vv[1] = output.5.unwrap();
64+
vv[2] = output.6.unwrap();
65+
66+
67+
let rv = tle.get_rv(mins);
68+
r = rv.0;
69+
v = rv.1;
70+
71+
rdist =dist(&r,&vr);
72+
vdist =dist(&v,&vv);
73+
74+
if tle.object_num ==33334
75+
{
76+
rdist =0.0;
77+
vdist =0.0;
78+
}
79+
80+
rerr = rerr + rdist;
81+
verr = verr + vdist;
82+
cnt2 = cnt2+1;
83+
84+
if(rdist >1e-7 || vdist >1e-8)
85+
{
86+
println!("{}\t{}\t{}\t{}",tle.object_num,mins,rdist,vdist);
87+
}
88+
89+
}
90+
}
91+
}
92+
93+
rerr = rerr/(cnt2asf64);
94+
verr = verr/(cnt2asf64);
95+
96+
println!("Typical errors r={} mm, v={} mm/s",1e6*rerr,1e6*verr);
97+
98+
99+
100+
}
101+
102+
fndist(v1:&[f64;3],v2:&[f64;3]) ->f64
103+
{
104+
letmut tmp:f64 =0.0;
105+
letmut sum:f64 =0.0;
106+
107+
tmp = v1[0]-v2[0];
108+
sum = sum + tmp*tmp;
109+
tmp = v1[1]-v2[1];
110+
sum = sum + tmp*tmp;
111+
tmp = v1[2]-v2[2];
112+
sum = sum + tmp*tmp;
113+
114+
return sum.sqrt();
115+
}
116+
117+
fnread_lines<P>(filename:P) -> io::Result<io::Lines<io::BufReader<File>>>
118+
whereP:AsRef<Path>,{
119+
let file =File::open(filename)?;
120+
Ok(io::BufReader::new(file).lines())
121+
}

‎src/rust/src/sgp4/elset_rec.rs

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
// This module implements the elsetrec data type from Vallado's SGP4 code.
2+
//
3+
// From SGP4.h
4+
// #define SGP4Version "SGP4 Version 2016-03-09"
5+
//
6+
// @author aholinch
7+
8+
#[derive(Default)]
9+
#[derive(Debug)]
10+
pubstructElsetRec{
11+
12+
pubwhichconst:i32,
13+
pubsatnum:i32,
14+
pubepochyr:i32,
15+
pubepochtynumrev:i32,
16+
puberror:i32,
17+
puboperationmode:char,
18+
pubinit:char,
19+
pubmethod:char,
20+
puba:f64,
21+
pubaltp:f64,
22+
pubalta:f64,
23+
pubepochdays:f64,
24+
pubjdsatepoch:f64,
25+
pubjdsatepoch_f:f64,
26+
pubnddot:f64,
27+
pubndot:f64,
28+
pubbstar:f64,
29+
pubrcse:f64,
30+
pubinclo:f64,
31+
pubnodeo:f64,
32+
pubecco:f64,
33+
pubargpo:f64,
34+
pubmo:f64,
35+
pubno_kozai:f64,
36+
37+
// sgp4fix add new variables from tle
38+
pubclassification:char,
39+
pubintldesg:String,
40+
pubephtype:i32,
41+
pubelnum:i64,
42+
pubrevnum:i64,
43+
44+
// sgp4fix add unkozai'd variable
45+
pubno_unkozai:f64,
46+
47+
// sgp4fix add singly averaged variables
48+
pubam:f64,
49+
pubem:f64,
50+
pubim:f64,
51+
pubo_m:f64,// usually Om in other languages that don't care so much about snake case
52+
pubom:f64,
53+
pubmm:f64,
54+
pubnm:f64,
55+
pubt:f64,
56+
57+
// sgp4fix add constant parameters to eliminate mutliple calls during execution
58+
pubtumin:f64,
59+
pubmu:f64,
60+
pubradiusearthkm:f64,
61+
pubxke:f64,
62+
pubj2:f64,
63+
pubj3:f64,
64+
pubj4:f64,
65+
pubj3oj2:f64,
66+
67+
// Additional elements to capture relevant TLE and object information:
68+
pubdia_mm:i64,// RSO dia in mm
69+
pubperiod_sec:f64,// Period in seconds
70+
pubactive:char,// "Active S/C" flag (0=n, 1=y)
71+
pubnot_orbital:char,// "Orbiting S/C" flag (0=n, 1=y)
72+
pubrcs_m2:f64,// "RCS (m^2)" storage
73+
74+
// temporary variables because the original authors call the same method with different variables
75+
pubep:f64,
76+
pubinclp:f64,
77+
pubnodep:f64,
78+
pubargpp:f64,
79+
pubmp:f64,
80+
81+
82+
pubisimp:i32,
83+
pubaycof:f64,
84+
pubcon41:f64,
85+
pubcc1:f64,
86+
pubcc4:f64,
87+
pubcc5:f64,
88+
pubd2:f64,
89+
pubd3:f64,
90+
pubd4:f64,
91+
pubdelmo:f64,
92+
pubeta:f64,
93+
pubargpdot:f64,
94+
pubomgcof:f64,
95+
pubsinmao:f64,
96+
pubt2cof:f64,
97+
pubt3cof:f64,
98+
pubt4cof:f64,
99+
pubt5cof:f64,
100+
pubx1mth2:f64,
101+
pubx7thm1:f64,
102+
pubmdot:f64,
103+
pubnodedot:f64,
104+
pubxlcof:f64,
105+
pubxmcof:f64,
106+
pubnodecf:f64,
107+
108+
// deep space
109+
pubirez:i32,
110+
pubd2201:f64,
111+
pubd2211:f64,
112+
pubd3210:f64,
113+
pubd3222:f64,
114+
pubd4410:f64,
115+
pubd4422:f64,
116+
pubd5220:f64,
117+
pubd5232:f64,
118+
pubd5421:f64,
119+
pubd5433:f64,
120+
pubdedt:f64,
121+
pubdel1:f64,
122+
pubdel2:f64,
123+
pubdel3:f64,
124+
pubdidt:f64,
125+
pubdmdt:f64,
126+
pubdnodt:f64,
127+
pubdomdt:f64,
128+
pube3:f64,
129+
pubee2:f64,
130+
pubpeo:f64,
131+
pubpgho:f64,
132+
pubpho:f64,
133+
pubpinco:f64,
134+
pubplo:f64,
135+
pubse2:f64,
136+
pubse3:f64,
137+
pubsgh2:f64,
138+
pubsgh3:f64,
139+
pubsgh4:f64,
140+
pubsh2:f64,
141+
pubsh3:f64,
142+
pubsi2:f64,
143+
pubsi3:f64,
144+
pubsl2:f64,
145+
pubsl3:f64,
146+
pubsl4:f64,
147+
pubgsto:f64,
148+
pubxfact:f64,
149+
pubxgh2:f64,
150+
pubxgh3:f64,
151+
pubxgh4:f64,
152+
pubxh2:f64,
153+
pubxh3:f64,
154+
pubxi2:f64,
155+
pubxi3:f64,
156+
pubxl2:f64,
157+
pubxl3:f64,
158+
pubxl4:f64,
159+
pubxlamo:f64,
160+
pubzmol:f64,
161+
pubzmos:f64,
162+
pubatime:f64,
163+
pubxli:f64,
164+
pubxni:f64,
165+
pubsnodm:f64,
166+
pubcnodm:f64,
167+
pubsinim:f64,
168+
pubcosim:f64,
169+
pubsinomm:f64,
170+
pubcosomm:f64,
171+
pubday:f64,
172+
pubemsq:f64,
173+
pubgam:f64,
174+
pubrtemsq:f64,
175+
pubs1:f64,
176+
pubs2:f64,
177+
pubs3:f64,
178+
pubs4:f64,
179+
pubs5:f64,
180+
pubs6:f64,
181+
pubs7:f64,
182+
pubss1:f64,
183+
pubss2:f64,
184+
pubss3:f64,
185+
pubss4:f64,
186+
pubss5:f64,
187+
pubss6:f64,
188+
pubss7:f64,
189+
pubsz1:f64,
190+
pubsz2:f64,
191+
pubsz3:f64,
192+
pubsz11:f64,
193+
pubsz12:f64,
194+
pubsz13:f64,
195+
pubsz21:f64,
196+
pubsz22:f64,
197+
pubsz23:f64,
198+
pubsz31:f64,
199+
pubsz32:f64,
200+
pubsz33:f64,
201+
pubz1:f64,
202+
pubz2:f64,
203+
pubz3:f64,
204+
pubz11:f64,
205+
pubz12:f64,
206+
pubz13:f64,
207+
pubz21:f64,
208+
pubz22:f64,
209+
pubz23:f64,
210+
pubz31:f64,
211+
pubz32:f64,
212+
pubz33:f64,
213+
pubargpm:f64,
214+
pubinclm:f64,
215+
pubnodem:f64,
216+
pubdndt:f64,
217+
pubeccsq:f64,
218+
219+
// for initl
220+
pubainv:f64,
221+
pubao:f64,
222+
pubcon42:f64,
223+
pubcosio:f64,
224+
pubcosio2:f64,
225+
pubomeosq:f64,
226+
pubposq:f64,
227+
pubrp:f64,
228+
pubrteosq:f64,
229+
pubsinio:f64
230+
}// end struct
231+
232+
implElsetRec{
233+
pubfnnew() ->Self{
234+
Self{whichconst:super::sgp4::WGS72, ..Default::default()}
235+
}
236+
}

‎src/rust/src/sgp4/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pubmod elset_rec;
2+
pubmod tle;
3+
pubmod sgp4;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp