-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheci2orb1.m
122 lines (77 loc) · 2.22 KB
/
eci2orb1.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
function oev = eci2orb1 (mu, r, v)
% convert eci state vector to six classical orbital
% elements via equinoctial elements
% input
% mu = central body gravitational constant (km**3/sec**2)
% r = eci position vector (kilometers)
% v = eci velocity vector (kilometers/second)
% output
% oev(1) = semimajor axis (kilometers)
% oev(2) = orbital eccentricity (non-dimensional)
% (0 <= eccentricity < 1)
% oev(3) = orbital inclination (radians)
% (0 <= inclination <= pi)
% oev(4) = argument of perigee (radians)
% (0 <= argument of perigee <= 2 pi)
% oev(5) = right ascension of ascending node (radians)
% (0 <= raan <= 2 pi)
% oev(6) = true anomaly (radians)
% (0 <= true anomaly <= 2 pi)
% Orbital Mechanics with MATLAB
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pi2 = 2.0 * pi;
% position and velocity magnitude
rmag = norm(r);
vmag = norm(v);
% position unit vector
rhat = r / rmag;
% angular momentum vectors
hv = cross(r, v);
hhat = hv / norm(hv);
% eccentricity vector
vtmp = v / mu;
ecc = cross(vtmp, hv);
ecc = ecc - rhat;
% semimajor axis
sma = 1.0 / (2.0 / rmag - vmag * vmag / mu);
p = hhat(1) / (1.0 + hhat(3));
q = -hhat(2) / (1.0 + hhat(3));
const1 = 1.0 / (1.0 + p * p + q * q);
fhat(1) = const1 * (1.0 - p * p + q * q);
fhat(2) = const1 * 2.0 * p * q;
fhat(3) = -const1 * 2.0 * p;
ghat(1) = const1 * 2.0 * p * q;
ghat(2) = const1 * (1.0 + p * p - q * q);
ghat(3) = const1 * 2.0 * q;
h = dot(ecc, ghat);
xk = dot(ecc, fhat);
x1 = dot(r, fhat);
y1 = dot(r, ghat);
% orbital eccentricity
eccm = sqrt(h * h + xk * xk);
% orbital inclination
inc = 2.0 * atan(sqrt(p * p + q * q));
% true longitude
xlambdat = atan3(y1, x1);
% check for equatorial orbit
if (inc > 0.00000001)
raan = atan3(p, q);
else
raan = 0.0;
end
% check for circular orbit
if (eccm > 0.00000001)
argper = mod(atan3(h, xk) - raan, pi2);
else
argper = 0.0;
end
% true anomaly
tanom = mod(xlambdat - raan - argper, pi2);
% load orbital element vector
oev(1) = sma;
oev(2) = eccm;
oev(3) = inc;
oev(4) = argper;
oev(5) = raan;
oev(6) = tanom;
end