1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.events;
18
19 import org.hipparchus.analysis.differentiation.UnivariateDerivative1;
20 import org.hipparchus.analysis.differentiation.UnivariateDerivative1Field;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.orekit.propagation.SpacecraftState;
23 import org.orekit.propagation.events.handlers.EventHandler;
24 import org.orekit.time.FieldAbsoluteDate;
25 import org.orekit.utils.ExtendedPositionProvider;
26 import org.orekit.utils.FieldPVCoordinates;
27
28
29
30
31
32
33 public class ExtremumAngularSeparationDetector extends AbstractDetector<ExtremumAngularSeparationDetector> {
34
35
36 private final ExtendedPositionProvider beacon;
37
38
39 private final ExtendedPositionProvider observer;
40
41
42
43
44
45
46
47
48 public ExtremumAngularSeparationDetector(final EventDetectionSettings detectionSettings,
49 final EventHandler handler,
50 final ExtendedPositionProvider beacon,
51 final ExtendedPositionProvider observer) {
52 super(detectionSettings, handler);
53 this.beacon = beacon;
54 this.observer = observer;
55 }
56
57
58
59
60 public ExtendedPositionProvider getBeacon() {
61 return beacon;
62 }
63
64
65
66
67 public ExtendedPositionProvider getObserver() {
68 return observer;
69 }
70
71 @Override
72 protected ExtremumAngularSeparationDetector create(final EventDetectionSettings detectionSettings,
73 final EventHandler newHandler) {
74 return new ExtremumAngularSeparationDetector(detectionSettings, newHandler, beacon, observer);
75 }
76
77 @Override
78 public double g(final SpacecraftState s) {
79 final FieldPVCoordinates<UnivariateDerivative1> pv = s.getPVCoordinates().toUnivariateDerivative1PV();
80 final UnivariateDerivative1 dt = new UnivariateDerivative1(0., 1.);
81 final FieldAbsoluteDate<UnivariateDerivative1> fieldDate = new FieldAbsoluteDate<>(UnivariateDerivative1Field.getInstance(),
82 s.getDate()).shiftedBy(dt);
83 final FieldVector3D<UnivariateDerivative1> bP = beacon.getPosition(fieldDate, s.getFrame());
84 final FieldVector3D<UnivariateDerivative1> oP = observer.getPosition(fieldDate, s.getFrame());
85 final UnivariateDerivative1 separation = FieldVector3D.angle(pv.getPosition().subtract(oP), bP.subtract(oP));
86 return separation.getFirstDerivative();
87 }
88 }