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 @SuppressWarnings("WeakerAccess")
41 public class ECItoECEFFrameConverter implements TimeIntervalFrameConverter<ECIFrame, ECEFFrame> {
42
43
44
45
46 public static final double EARTH_ROTATION_RATE = Constants.EARTH_ROTATION_RATE;
47
48
49
50
51
52
53
54
55 @Override
56 public ECEFFrame convertAndReturnNew(final double timeInterval, final ECIFrame source) {
57 return convertECItoECEFAndReturnNew(timeInterval, source);
58 }
59
60
61
62
63
64
65
66
67 @Override
68 public ECEFFrame convertAndReturnNew(final Time timeInterval, final ECIFrame source) {
69 return convertECItoECEFAndReturnNew(timeInterval, source);
70 }
71
72
73
74
75
76
77
78
79 @Override
80 public void convert(final double timeInterval, final ECIFrame source, final ECEFFrame destination) {
81 convertECItoECEF(timeInterval, source, destination);
82 }
83
84
85
86
87
88
89
90
91 @Override
92 public void convert(final Time timeInterval, final ECIFrame source, final ECEFFrame destination) {
93 convertECItoECEF(timeInterval, source, destination);
94 }
95
96
97
98
99
100
101 @Override
102 public FrameType getSourceType() {
103 return FrameType.EARTH_CENTERED_INERTIAL_FRAME;
104 }
105
106
107
108
109
110
111 @Override
112 public FrameType getDestinationType() {
113 return FrameType.EARTH_CENTERED_EARTH_FIXED_FRAME;
114 }
115
116
117
118
119
120
121
122
123 public static ECEFFrame convertECItoECEFAndReturnNew(final double timeInterval, final ECIFrame source) {
124 final var result = new ECEFFrame();
125 convertECItoECEF(timeInterval, source, result);
126 return result;
127 }
128
129
130
131
132
133
134
135
136 public static ECEFFrame convertECItoECEFAndReturnNew(final Time timeInterval, final ECIFrame source) {
137 return convertECItoECEFAndReturnNew(TimeConverter.convert(timeInterval.getValue().doubleValue(),
138 timeInterval.getUnit(), TimeUnit.SECOND), source);
139 }
140
141
142
143
144
145
146
147
148 @SuppressWarnings("DuplicatedCode")
149 public static void convertECItoECEF(final double timeInterval, final ECIFrame source, final ECEFFrame destination) {
150 try {
151
152 final var alpha = EARTH_ROTATION_RATE * timeInterval;
153 final var cie = CoordinateTransformation.eciToEcefMatrixFromAngle(alpha);
154
155
156 final var rIbi = new Matrix(ECIorECEFFrame.NUM_POSITION_COORDINATES, 1);
157 rIbi.setElementAtIndex(0, source.getX());
158 rIbi.setElementAtIndex(1, source.getY());
159 rIbi.setElementAtIndex(2, source.getZ());
160
161 final var rEbe = cie.multiplyAndReturnNew(rIbi);
162
163 destination.setCoordinates(rEbe.getElementAtIndex(0), rEbe.getElementAtIndex(1), rEbe.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 vIbi = new Matrix(ECIorECEFFrame.NUM_VELOCITY_COORDINATES, 1);
173 vIbi.setElementAtIndex(0, source.getVx());
174 vIbi.setElementAtIndex(1, source.getVy());
175 vIbi.setElementAtIndex(2, source.getVz());
176
177
178 vIbi.add(tmp);
179
180 final var vEbe = cie.multiplyAndReturnNew(vIbi);
181
182 destination.setVelocityCoordinates(vEbe.getElementAtIndex(0), vEbe.getElementAtIndex(1),
183 vEbe.getElementAtIndex(2));
184
185
186
187 final var cbi = source.getCoordinateTransformationMatrix();
188 cie.multiply(cbi);
189
190 final var c = new CoordinateTransformation(cie, FrameType.BODY_FRAME,
191 FrameType.EARTH_CENTERED_EARTH_FIXED_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 convertECItoECEF(final Time timeInterval, final ECIFrame source,
207 final ECEFFrame destination) {
208 convertECItoECEF(TimeConverter.convert(timeInterval.getValue().doubleValue(), timeInterval.getUnit(),
209 TimeUnit.SECOND), source, destination);
210 }
211 }