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.AbsoluteDate;
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.ParameterDriver;
38 import org.orekit.utils.TimeStampedFieldPVCoordinates;
39 import org.orekit.utils.TimeStampedPVCoordinates;
40
41
42
43
44
45
46
47
48 public abstract class AbstractParticipant implements MeasurementParticipant {
49
50
51 private static final String CLOCK_STRING = "-clock";
52
53
54
55
56
57
58
59 private static final double CLOCK_OFFSET_SCALE = FastMath.scalb(1.0, -10);
60
61
62 private final ClockModel clockModel;
63
64
65 private final List<ParameterDriver> parameterDrivers = new ArrayList<>();
66
67
68 private final String name;
69
70
71
72
73 protected AbstractParticipant(final String name) {
74 this(name, createEmptyPolynomialClock(name));
75 }
76
77
78
79
80
81 protected AbstractParticipant(final String name, final ClockModel clock) {
82
83
84 this.name = name;
85 this.clockModel = clock;
86
87 for (ParameterDriver parameter: clock.getParametersDrivers()) {
88 parameterDrivers.add(parameter);
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 new ParameterDriver(name + CLOCK_STRING + DRIFT_SUFFIX,
109 0.0, CLOCK_OFFSET_SCALE,
110 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY),
111 new ParameterDriver(name + CLOCK_STRING + ACCELERATION_SUFFIX,
112 0.0, CLOCK_OFFSET_SCALE,
113 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY));
114 }
115
116
117
118
119 @Override
120 public final ClockModel getClockModel() {
121 return clockModel;
122 }
123
124
125
126
127
128
129
130 @Override
131 public List<ParameterDriver> getParametersDrivers() {
132 return Collections.unmodifiableList(parameterDrivers);
133 }
134
135
136
137
138
139 protected final void addParameterDriver(final ParameterDriver parameterDriver) {
140 parameterDrivers.add(parameterDriver);
141 }
142
143
144
145
146
147
148
149 public static PVCoordinatesProvider extractPVCoordinatesProvider(final SpacecraftState templateState,
150 final TimeStampedPVCoordinates pvCoordinates) {
151 if (templateState.isOrbitDefined()) {
152 final CartesianOrbit cartesianOrbit = new CartesianOrbit(pvCoordinates, templateState.getFrame(),
153 templateState.getOrbit().getMu());
154 return templateState.getOrbit().getType().convertType(cartesianOrbit);
155 } else {
156 return new AbsolutePVCoordinates(templateState.getFrame(), pvCoordinates);
157 }
158 }
159
160
161
162
163
164
165
166
167 public static FieldPVCoordinatesProvider<Gradient> extractFieldPVCoordinatesProvider(final SpacecraftState templateState,
168 final TimeStampedFieldPVCoordinates<Gradient> pvCoordinates) {
169 final Field<Gradient> field = pvCoordinates.getDate().getField();
170 if (templateState.isOrbitDefined()) {
171 final FieldCartesianOrbit<Gradient> cartesianOrbit = new FieldCartesianOrbit<>(pvCoordinates, templateState.getFrame(),
172 field.getZero().newInstance(templateState.getOrbit().getMu()));
173 return templateState.getOrbit().getType().convertType(cartesianOrbit);
174 } else {
175 return new FieldAbsolutePVCoordinates<>(templateState.getFrame(), pvCoordinates);
176 }
177 }
178 }