1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.navigation.frames.converters;
17
18 import com.irurueta.algebra.Matrix;
19 import com.irurueta.algebra.WrongSizeException;
20 import com.irurueta.geometry.InvalidRotationMatrixException;
21 import com.irurueta.navigation.frames.CoordinateTransformation;
22 import com.irurueta.navigation.frames.ECEFFrame;
23 import com.irurueta.navigation.frames.ECIFrame;
24 import com.irurueta.navigation.frames.ECIorECEFFrame;
25 import com.irurueta.navigation.frames.FrameType;
26 import com.irurueta.navigation.frames.InvalidSourceAndDestinationFrameTypeException;
27 import com.irurueta.navigation.geodesic.Constants;
28 import com.irurueta.units.Time;
29 import com.irurueta.units.TimeConverter;
30 import com.irurueta.units.TimeUnit;
31
32
33
34
35
36
37
38
39
40 public class ECEFtoECIFrameConverter implements TimeIntervalFrameConverter<ECEFFrame, ECIFrame> {
41
42
43
44
45 public static final double EARTH_ROTATION_RATE = Constants.EARTH_ROTATION_RATE;
46
47
48
49
50
51
52
53
54 @Override
55 public ECIFrame convertAndReturnNew(final double timeInterval, final ECEFFrame source) {
56 return convertECEFtoECIAndReturnNew(timeInterval, source);
57 }
58
59
60
61
62
63
64
65
66 @Override
67 public ECIFrame convertAndReturnNew(final Time timeInterval, final ECEFFrame source) {
68 return convertECEFtoECIAndReturnNew(timeInterval, source);
69 }
70
71
72
73
74
75
76
77
78 @Override
79 public void convert(final double timeInterval, final ECEFFrame source, final ECIFrame destination) {
80 convertECEFtoECI(timeInterval, source, destination);
81 }
82
83
84
85
86
87
88
89
90 @Override
91 public void convert(final Time timeInterval, final ECEFFrame source, final ECIFrame destination) {
92 convertECEFtoECI(timeInterval, source, destination);
93 }
94
95
96
97
98
99
100 @Override
101 public FrameType getSourceType() {
102 return FrameType.EARTH_CENTERED_EARTH_FIXED_FRAME;
103 }
104
105
106
107
108
109
110 @Override
111 public FrameType getDestinationType() {
112 return FrameType.EARTH_CENTERED_INERTIAL_FRAME;
113 }
114
115
116
117
118
119
120
121
122 public static ECIFrame convertECEFtoECIAndReturnNew(final double timeInterval, final ECEFFrame source) {
123 final var result = new ECIFrame();
124 convertECEFtoECI(timeInterval, source, result);
125 return result;
126 }
127
128
129
130
131
132
133
134
135 public static ECIFrame convertECEFtoECIAndReturnNew(final Time timeInterval, final ECEFFrame source) {
136 return convertECEFtoECIAndReturnNew(TimeConverter.convert(timeInterval.getValue().doubleValue(),
137 timeInterval.getUnit(), TimeUnit.SECOND), source);
138 }
139
140
141
142
143
144
145
146
147 @SuppressWarnings("DuplicatedCode")
148 public static void convertECEFtoECI(final double timeInterval, final ECEFFrame source, final ECIFrame destination) {
149 try {
150
151 final var alpha = EARTH_ROTATION_RATE * timeInterval;
152 final var cei = CoordinateTransformation.ecefToEciMatrixFromAngle(alpha);
153
154
155 final var rEbe = new Matrix(ECIorECEFFrame.NUM_POSITION_COORDINATES, 1);
156 rEbe.setElementAtIndex(0, source.getX());
157 rEbe.setElementAtIndex(1, source.getY());
158 rEbe.setElementAtIndex(2, source.getZ());
159
160 final var rIbi = cei.multiplyAndReturnNew(rEbe);
161
162 destination.setCoordinates(rIbi.getElementAtIndex(0),
163 rIbi.getElementAtIndex(1), rIbi.getElementAtIndex(2));
164
165
166 final var tmp = new Matrix(ECIorECEFFrame.NUM_POSITION_COORDINATES, 1);
167 tmp.setElementAtIndex(0, -source.getY());
168 tmp.setElementAtIndex(1, source.getX());
169 tmp.setElementAtIndex(2, 0.0);
170 tmp.multiplyByScalar(EARTH_ROTATION_RATE);
171
172 final var vEbe = new Matrix(ECIorECEFFrame.NUM_VELOCITY_COORDINATES, 1);
173 vEbe.setElementAtIndex(0, source.getVx());
174 vEbe.setElementAtIndex(1, source.getVy());
175 vEbe.setElementAtIndex(2, source.getVz());
176
177
178 vEbe.add(tmp);
179
180 final var vIbi = cei.multiplyAndReturnNew(vEbe);
181
182 destination.setVelocityCoordinates(vIbi.getElementAtIndex(0),
183 vIbi.getElementAtIndex(1), vIbi.getElementAtIndex(2));
184
185
186
187 final var cbe = source.getCoordinateTransformationMatrix();
188 cei.multiply(cbe);
189
190 final var c = new CoordinateTransformation(cei,
191 FrameType.BODY_FRAME, FrameType.EARTH_CENTERED_INERTIAL_FRAME);
192 destination.setCoordinateTransformation(c);
193 } catch (final WrongSizeException | InvalidSourceAndDestinationFrameTypeException |
194 InvalidRotationMatrixException ignore) {
195
196 }
197 }
198
199
200
201
202
203
204
205
206 public static void convertECEFtoECI(final Time timeInterval, final ECEFFrame source, final ECIFrame destination) {
207 convertECEFtoECI(TimeConverter.convert(timeInterval.getValue().doubleValue(), timeInterval.getUnit(),
208 TimeUnit.SECOND), source, destination);
209 }
210 }