1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.estimation.measurements;
19
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.hipparchus.Field;
25 import org.hipparchus.analysis.differentiation.Gradient;
26 import org.hipparchus.util.FastMath;
27 import org.orekit.orbits.CartesianOrbit;
28 import org.orekit.orbits.FieldCartesianOrbit;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.time.TimeInterval;
31 import org.orekit.time.clocks.ClockModel;
32 import org.orekit.time.clocks.PolynomialClockModel;
33 import org.orekit.utils.AbsolutePVCoordinates;
34 import org.orekit.utils.FieldAbsolutePVCoordinates;
35 import org.orekit.utils.FieldPVCoordinatesProvider;
36 import org.orekit.utils.PVCoordinatesProvider;
37 import org.orekit.utils.drivers.ParameterDriver;
38 import org.orekit.utils.TimeStampedFieldPVCoordinates;
39 import org.orekit.utils.TimeStampedPVCoordinates;
40 import org.orekit.utils.drivers.ParameterDriversProvider;
41
42
43
44
45
46
47
48
49 public abstract class AbstractParticipant implements MeasurementParticipant {
50
51
52 private static final String CLOCK_STRING = "-clock";
53
54
55
56
57
58
59
60 private static final double CLOCK_OFFSET_SCALE = FastMath.scalb(1.0, -10);
61
62
63 private final ClockModel clockModel;
64
65
66 private final List<ParameterDriver> parameterDrivers = new ArrayList<>();
67
68
69 private final String name;
70
71
72
73
74 protected AbstractParticipant(final String name) {
75 this(name, createEmptyPolynomialClock(name));
76 }
77
78
79
80
81
82 protected AbstractParticipant(final String name, final ClockModel clock) {
83
84
85 this.name = name;
86 this.clockModel = clock;
87
88 parameterDrivers.addAll(clock.getParametersDrivers());
89
90 }
91
92
93
94
95 @Override
96 public final String getName() {
97 return name;
98 }
99
100
101
102
103
104 protected static PolynomialClockModel createEmptyPolynomialClock(final String name) {
105 return new PolynomialClockModel(new ParameterDriver(name + CLOCK_STRING + BIAS_SUFFIX,
106 0.0, CLOCK_OFFSET_SCALE,
107 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY,
108 TimeInterval.UNLIMITED),
109 new ParameterDriver(name + CLOCK_STRING + DRIFT_SUFFIX,
110 0.0, CLOCK_OFFSET_SCALE,
111 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY,
112 TimeInterval.UNLIMITED),
113 new ParameterDriver(name + CLOCK_STRING + ACCELERATION_SUFFIX,
114 0.0, CLOCK_OFFSET_SCALE,
115 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY,
116 TimeInterval.UNLIMITED));
117 }
118
119
120
121
122 @Override
123 public final ClockModel getClockModel() {
124 return clockModel;
125 }
126
127
128
129
130
131
132
133 @Override
134 public List<ParameterDriver> getParametersDrivers() {
135 return Collections.unmodifiableList(parameterDrivers);
136 }
137
138
139
140
141
142 protected final void addParameterDriver(final ParameterDriver parameterDriver) {
143 parameterDrivers.add(parameterDriver);
144 }
145
146
147
148
149
150
151
152 public static PVCoordinatesProvider extractPVCoordinatesProvider(final SpacecraftState templateState,
153 final TimeStampedPVCoordinates pvCoordinates) {
154 if (templateState.isOrbitDefined()) {
155 final CartesianOrbit cartesianOrbit = new CartesianOrbit(pvCoordinates, templateState.getFrame(),
156 templateState.getOrbit().getMu());
157 return templateState.getOrbit().getType().convertType(cartesianOrbit);
158 } else {
159 return new AbsolutePVCoordinates(templateState.getFrame(), pvCoordinates);
160 }
161 }
162
163
164
165
166
167
168
169
170 public static FieldPVCoordinatesProvider<Gradient> extractFieldPVCoordinatesProvider(final SpacecraftState templateState,
171 final TimeStampedFieldPVCoordinates<Gradient> pvCoordinates) {
172 final Field<Gradient> field = pvCoordinates.getDate().getField();
173 if (templateState.isOrbitDefined()) {
174 final FieldCartesianOrbit<Gradient> cartesianOrbit = new FieldCartesianOrbit<>(pvCoordinates, templateState.getFrame(),
175 field.getZero().newInstance(templateState.getOrbit().getMu()));
176 return templateState.getOrbit().getType().convertType(cartesianOrbit);
177 } else {
178 return new FieldAbsolutePVCoordinates<>(templateState.getFrame(), pvCoordinates);
179 }
180 }
181 }