-
Notifications
You must be signed in to change notification settings - Fork 0
/
twoline2rv.m
266 lines (235 loc) · 9.99 KB
/
twoline2rv.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
% -----------------------------------------------------------------------------
%
% procedure twoline2rv
%
% this function converts the two line element set character string data to
% variables and initializes the sgp4 variables. several intermediate varaibles
% and quantities are determined. note that the result is a structure so multiple
% satellites can be processed simultaneously without having to reinitialize. the
% verification mode is an important option that permits quick checks of any
% changes to the underlying technical theory. this option works using a
% modified tle file in which the start, stop, and delta time values are
% included at the end of the second line of data. this only works with the
% verification mode. the catalog mode simply propagates from -1440 to 1440 min
% from epoch and is useful when performing entire catalog runs.
%
% Author:
% Jeff Beck
% beckja@alumni.lehigh.edu
% 1.0 aug 6, 2006 - update for paper dav
% 2.0 mar 8, 2007 - misc fixes and manual operation updates
% 2.01 may 9, 2007 - fix for correction to year of 57
% 2.02 oct 8, 2007 - fix for manual jdstart jdstop matlab formats
% original comments from Vallado C++ version:
% author : david vallado 719-573-2600 1 mar 2001
%
% inputs :
% longstr1 - TLE character string
% longstr2 - TLE character string
% typerun - character for mode of SGP4 execution
% 'c' = catalog mode (propagates at 20 min timesteps from
% one day before epoch to one day after)
% 'v' = verification mode (propagates according to start,
% stop, and timestep specified in longstr2)
% 'm' = manual mode (prompts user for start, stop, and
% timestep for propagation)
% typeinput - type of manual input mfe 'm', epoch 'e', dayofyr 'd'
%
% outputs :
% satrec - structure containing all the sgp4 satellite information
%
% coupling :
% getgravconst
% days2mdhms - conversion of days to month, day, hour, minute, second
% jday - convert day month year hour minute second into julian date
% sgp4init - initialize the sgp4 variables
%
% references :
% norad spacetrack report #3
% vallado, crawford, hujsak, kelso 2006
%
% [satrec, startmfe, stopmfe, deltamin] = twoline2rv(whichconst, longstr1, ...
% longstr2, typerun,typeinput)
% ----------------------------------------------------------------------------*/
function [satrec, startmfe, stopmfe, deltamin] = twoline2rv(whichconst, longstr1, ...
longstr2, typerun,typeinput,mfe)
global tumin radiusearthkm xke j2 j3 j4 j3oj2
deg2rad = pi / 180.0; % 0.01745329251994330; % [deg/rad]
xpdotp = 1440.0 / (2.0*pi); % 229.1831180523293; % [rev/day]/[rad/min]
revnum = 0;
elnum = 0;
year = 0;
satrec.error = 0;
% // set the implied decimal points since doing a formated read
% // fixes for bad input data values (missing, ...)
for (j = 11:16)
if (longstr1(j) == ' ')
longstr1(j) = '_';
end
end
if (longstr1(45) ~= ' ')
longstr1(44) = longstr1(45);
end
longstr1(45) = '.';
if (longstr1(8) == ' ')
longstr1(8) = 'U';
end
if (longstr1(10) == ' ')
longstr1(10) = '.';
end
for (j = 46:50)
if (longstr1(j) == ' ')
longstr1(j) = '0';
end
end
if (longstr1(52) == ' ')
longstr1(52) = '0';
end
if (longstr1(54) ~= ' ')
longstr1(53) = longstr1(54);
end
longstr1(54) = '.';
longstr2(26) = '.';
for (j = 27:33)
if (longstr2(j) == ' ')
longstr2(j) = '0';
end
end
if (longstr1(63) == ' ')
longstr1(63) = '0';
end
if ((length(longstr1) < 68) || (longstr1(68) == ' '))
longstr1(68) = '0';
end
% parse first line
carnumb = str2num(longstr1(1));
satrec.satnum = str2num(longstr1(3:7));
classification = longstr1(8);
intldesg = longstr1(10:17);
satrec.epochyr = str2num(longstr1(19:20));
satrec.epochdays = str2num(longstr1(21:32));
satrec.ndot = str2num(longstr1(34:43));
satrec.nddot = str2num(longstr1(44:50));
nexp = str2num(longstr1(51:52));
satrec.bstar = str2num(longstr1(53:59));
ibexp = str2num(longstr1(60:61));
numb = str2num(longstr1(63));
elnum = str2num(longstr1(65:68));
% parse second line
if (typerun == 'v')
cardnumb = str2num(longstr2(1));
satrec.satnum = str2num(longstr2(3:7));
satrec.inclo = str2num(longstr2(8:16));
satrec.nodeo = str2num(longstr2(17:25));
satrec.ecco = str2num(longstr2(26:33));
satrec.argpo = str2num(longstr2(34:42));
satrec.mo = str2num(longstr2(43:51));
satrec.no = str2num(longstr2(52:63));
revnum = str2num(longstr2(64:68));
startmfe = str2num(longstr2(70:81))
stopmfe = str2num(longstr2(83:96))
deltamin = str2num(longstr2(97:105))
else
cardnumb = str2num(longstr2(1));
satrec.satnum = str2num(longstr2(3:7));
satrec.inclo = str2num(longstr2(8:16));
satrec.nodeo = str2num(longstr2(17:25));
satrec.ecco = str2num(longstr2(26:33));
satrec.argpo = str2num(longstr2(34:42));
satrec.mo = str2num(longstr2(43:51));
satrec.no = str2num(longstr2(52:63));
revnum = str2num(longstr2(64:68));
end
% // ---- find no, ndot, nddot ----
satrec.no = satrec.no / xpdotp; %//* rad/min
satrec.nddot= satrec.nddot * 10.0^nexp;
satrec.bstar= satrec.bstar * 10.0^ibexp;
% // ---- convert to sgp4 units ----
satrec.a = (satrec.no*tumin)^(-2/3); % [er]
satrec.ndot = satrec.ndot / (xpdotp*1440.0); % [rad/min^2]
satrec.nddot= satrec.nddot / (xpdotp*1440.0*1440); % [rad/min^3]
% // ---- find standard orbital elements ----
satrec.inclo = satrec.inclo * deg2rad;
satrec.nodeo = satrec.nodeo * deg2rad;
satrec.argpo = satrec.argpo * deg2rad;
satrec.mo = satrec.mo *deg2rad;
satrec.alta = satrec.a*(1.0 + satrec.ecco) - 1.0;
satrec.altp = satrec.a*(1.0 - satrec.ecco) - 1.0;
% // ----------------------------------------------------------------
% // find sgp4epoch time of element set
% // remember that sgp4 uses units of days from 0 jan 1950 (sgp4epoch)
% // and minutes from the epoch (time)
% // --------------------------------------------------------------
% // ------------- temp fix for years from 1957-2056 ----------------
% // ------ correct fix will occur when year is 4-digit in 2le ------
if (satrec.epochyr < 57)
year= satrec.epochyr + 2000;
else
year= satrec.epochyr + 1900;
end;
[mon,day,hr,minute,sec] = days2mdh ( year,satrec.epochdays );
satrec.jdsatepoch = jday( year,mon,day,hr,minute,sec );
% // input start stop times manually
if ((typerun ~= 'v') && (typerun ~= 'c'))
% ------------- enter start/stop ymd hms values --------------------
if (typeinput == 'e')
startyear = input('input start year');
startmon = input('input start mon');
startday = input('input start day');
starthr = input('input start hr');
startmin = input('input start min');
startsec = input('input start sec');
jdstart = jday( startyear,startmon,startday,starthr,startmin,startsec );
stopyear = input('input stop year');
stopmon = input('input stop mon');
stopday = input('input stop day');
stophr = input('input stop hr');
stopmin = input('input stop min');
stopsec = input('input stop sec');
jdstop = jday( stopyear,stopmon,stopday,stophr,stopmin,stopsec );
startmfe = (jdstart - satrec.jdsatepoch) * 1440.0;
stopmfe = (jdstop - satrec.jdsatepoch) * 1440.0;
deltamin = input('input time step in minutes ');
end;
% -------- enter start/stop year and days of year values -----------
if (typeinput == 'd')
startyear = input('input start year');
startdayofyr = input('input start dayofyr');
stopyear = input('input stop year');
stopdayofyr = input('input stop dayofyr');
[mon,day,hr,minute,sec] = days2mdhms ( startyear,startdayofyr);
jdstart = jday( startyear,mon,day,hr,minute,sec);
[mon,day,hr,minute,sec] = days2mdhms ( stopyear,stopdayofyr);
jdstop = jday( stopyear,mon,day,hr,minute,sec);
startmfe = (jdstart - satrec.jdsatepoch) * 1440.0;
stopmfe = (jdstop - satrec.jdsatepoch) * 1440.0;
deltamin = input('input time step in minutes ');
end;
% ------------------ enter start/stop mfe values -------------------
if (typeinput == 'm')
%startmfe = input('input start mfe: ');
%stopmfe = input('input stop mfe: ');
%deltamin = input('input time step in minutes: ');
end;
end;
% // perform complete catalog evaluation
% if (typerun == 'c')
% startmfe = -1440.0;
% stopmfe = 1440.0;
% deltamin = 20.0;
% end;
%
% if (typeinput == 'm')
% startmfe = -1.0;
% stopmfe = 1.0;
% deltamin = 1.0;
% end;
if typerun == 'm'
startmfe = 0;
stopmfe = 1;
deltamin = 1;
end
% // ------------- initialize the orbit at sgp4epoch --------------
sgp4epoch = satrec.jdsatepoch - 2433281.5; % days since 0 Jan 1950
[satrec] = sgp4init(whichconst, satrec, satrec.bstar, satrec.ecco, sgp4epoch, ...
satrec.argpo, satrec.inclo, satrec.mo, satrec.no, satrec.nodeo);