1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.navigation.gnss;
17
18 import com.irurueta.navigation.geodesic.Constants;
19
20 import java.util.ArrayList;
21 import java.util.Collection;
22
23
24
25
26
27
28
29
30
31 public class SatelliteECEFPositionAndVelocityGenerator {
32
33
34
35
36 public static final double EARTH_GRAVITATIONAL_CONSTANT = Constants.EARTH_GRAVITATIONAL_CONSTANT;
37
38
39
40
41 public static final double EARTH_ROTATION_RATE = Constants.EARTH_ROTATION_RATE;
42
43
44
45
46
47 private SatelliteECEFPositionAndVelocityGenerator() {
48 }
49
50
51
52
53
54
55
56
57 public static Collection<ECEFPositionAndVelocity> generateSatellitesPositionAndVelocity(
58 final double time, final GNSSConfig config) {
59 final var result = new ArrayList<ECEFPositionAndVelocity>();
60 generateSatellitesPositionAndVelocity(time, config, result);
61 return result;
62 }
63
64
65
66
67
68
69
70
71 public static void generateSatellitesPositionAndVelocity(
72 final double time, final GNSSConfig config, final Collection<ECEFPositionAndVelocity> result) {
73 result.clear();
74
75 final var numSatellites = config.getNumberOfSatellites();
76 for (var j = 0; j < numSatellites; j++) {
77 final var satellitePositionAndVelocity = new ECEFPositionAndVelocity();
78 generateSatellitePositionAndVelocity(time, config, j, satellitePositionAndVelocity);
79 result.add(satellitePositionAndVelocity);
80 }
81 }
82
83
84
85
86
87
88
89
90
91 public static ECEFPositionAndVelocity generateSatellitePositionAndVelocity(final double time,
92 final GNSSConfig config,
93 final int j) {
94 final var result = new ECEFPositionAndVelocity();
95 generateSatellitePositionAndVelocity(time, config, j, result);
96 return result;
97 }
98
99
100
101
102
103
104
105
106
107 public static void generateSatellitePositionAndVelocity(final double time, final GNSSConfig config,
108 final int j, final ECEFPositionAndVelocity result) {
109
110
111 final var inclinationRadians = Math.toRadians(config.getSatellitesInclinationDegrees());
112
113
114 final var orbitalRadius = config.getOrbitalRadiusOfSatellites();
115 final var orbitalRadius3 = orbitalRadius * orbitalRadius * orbitalRadius;
116 final var omegaIs = Math.sqrt(EARTH_GRAVITATIONAL_CONSTANT / orbitalRadius3);
117
118
119 final var constTime = time + config.getConstellationTimingOffset();
120
121
122 final var uOsO = 2.0 * Math.PI * j / config.getNumberOfSatellites() + omegaIs * constTime;
123
124
125 final var cosUoso = Math.cos(uOsO);
126 final var sinUoso = Math.sin(uOsO);
127 final var rOsO1 = orbitalRadius * cosUoso;
128 final var rOsO2 = orbitalRadius * sinUoso;
129
130
131 final var constDeltaLambdaRadians = Math.toRadians(config.getConstellationLongitudeOffsetDegrees());
132 final var omega = (Math.PI * ((j + 1) % 6) / 3.0 + constDeltaLambdaRadians) - EARTH_ROTATION_RATE * constTime;
133
134
135 final var cosOmega = Math.cos(omega);
136 final var sinOmega = Math.sin(omega);
137 final var cosInclination = Math.cos(inclinationRadians);
138 final var sinInclination = Math.sin(inclinationRadians);
139
140 final var satelliteX = rOsO1 * cosOmega - rOsO2 * cosInclination * sinOmega;
141 final var satelliteY = rOsO1 * sinOmega + rOsO2 * cosInclination * cosOmega;
142 final var satelliteZ = rOsO2 * sinInclination;
143
144
145
146 final var tmp = orbitalRadius * omegaIs;
147 final var vOsO1 = -tmp * sinUoso;
148 final var vOsO2 = tmp * cosUoso;
149
150
151 final var satelliteVx = vOsO1 * cosOmega - vOsO2 * cosInclination * sinOmega + EARTH_ROTATION_RATE * satelliteY;
152 final var satelliteVy = vOsO1 * sinOmega + vOsO2 * cosInclination * cosOmega - EARTH_ROTATION_RATE * satelliteX;
153 final var satelliteVz = vOsO2 * sinInclination;
154
155 result.setPositionCoordinates(satelliteX, satelliteY, satelliteZ);
156 result.setVelocityCoordinates(satelliteVx, satelliteVy, satelliteVz);
157 }
158 }