1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.attitudes;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
24 import org.hipparchus.geometry.euclidean.threed.Vector3D;
25 import org.orekit.bodies.BodyShape;
26 import org.orekit.bodies.FieldGeodeticPoint;
27 import org.orekit.bodies.GeodeticPoint;
28 import org.orekit.frames.FieldTransform;
29 import org.orekit.frames.Frame;
30 import org.orekit.frames.Transform;
31 import org.orekit.time.AbsoluteDate;
32 import org.orekit.time.FieldAbsoluteDate;
33 import org.orekit.utils.CartesianDerivativesFilter;
34 import org.orekit.utils.FieldPVCoordinatesProvider;
35 import org.orekit.utils.PVCoordinatesProvider;
36 import org.orekit.utils.TimeStampedFieldPVCoordinates;
37 import org.orekit.utils.TimeStampedPVCoordinates;
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class NadirPointing extends GroundPointing {
52
53
54 private final BodyShape shape;
55
56
57
58
59
60
61 public NadirPointing(final Frame inertialFrame, final BodyShape shape) {
62
63 super(inertialFrame, shape.getBodyFrame());
64 this.shape = shape;
65 }
66
67
68 public TimeStampedPVCoordinates getTargetPV(final PVCoordinatesProvider pvProv,
69 final AbsoluteDate date, final Frame frame) {
70
71
72 final Transform refToBody = frame.getTransformTo(shape.getBodyFrame(), date);
73
74
75 final double h = 0.01;
76 final List<TimeStampedPVCoordinates> sample = new ArrayList<>();
77 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(-2 * h), frame), refToBody.shiftedBy(-2 * h)));
78 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(-h), frame), refToBody.shiftedBy(-h)));
79 sample.add(nadirRef(pvProv.getPVCoordinates(date, frame), refToBody));
80 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(+h), frame), refToBody.shiftedBy(+h)));
81 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(+2 * h), frame), refToBody.shiftedBy(+2 * h)));
82
83
84 return TimeStampedPVCoordinates.interpolate(date, CartesianDerivativesFilter.USE_P, sample);
85
86 }
87
88
89 public <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> getTargetPV(final FieldPVCoordinatesProvider<T> pvProv,
90 final FieldAbsoluteDate<T> date,
91 final Frame frame) {
92
93
94 final FieldTransform<T> refToBody = frame.getTransformTo(shape.getBodyFrame(), date);
95
96
97 final double h = 0.01;
98 final List<TimeStampedFieldPVCoordinates<T>> sample = new ArrayList<>();
99 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(-2 * h), frame), refToBody.shiftedBy(-2 * h)));
100 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(-h), frame), refToBody.shiftedBy(-h)));
101 sample.add(nadirRef(pvProv.getPVCoordinates(date, frame), refToBody));
102 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(+h), frame), refToBody.shiftedBy(+h)));
103 sample.add(nadirRef(pvProv.getPVCoordinates(date.shiftedBy(+2 * h), frame), refToBody.shiftedBy(+2 * h)));
104
105
106 return TimeStampedFieldPVCoordinates.interpolate(date, CartesianDerivativesFilter.USE_P, sample);
107
108 }
109
110
111
112
113
114
115 private TimeStampedPVCoordinates nadirRef(final TimeStampedPVCoordinates scRef, final Transform refToBody) {
116
117 final Vector3D satInBodyFrame = refToBody.transformPosition(scRef.getPosition());
118
119
120 final GeodeticPoint gpSat = shape.transform(satInBodyFrame, getBodyFrame(), scRef.getDate());
121
122
123 final GeodeticPoint gpNadir = new GeodeticPoint(gpSat.getLatitude(), gpSat.getLongitude(), 0.0);
124
125
126 final Vector3D pNadirBody = shape.transform(gpNadir);
127
128
129 final Vector3D pNadirRef = refToBody.getInverse().transformPosition(pNadirBody);
130
131 return new TimeStampedPVCoordinates(scRef.getDate(), pNadirRef, Vector3D.ZERO, Vector3D.ZERO);
132
133 }
134
135
136
137
138
139
140
141
142 private <T extends CalculusFieldElement<T>> TimeStampedFieldPVCoordinates<T> nadirRef(final TimeStampedFieldPVCoordinates<T> scRef,
143 final FieldTransform<T> refToBody) {
144
145 final FieldVector3D<T> satInBodyFrame = refToBody.transformPosition(scRef.getPosition());
146
147
148 final FieldGeodeticPoint<T> gpSat = shape.transform(satInBodyFrame, getBodyFrame(), scRef.getDate());
149
150
151 final FieldGeodeticPoint<T> gpNadir = new FieldGeodeticPoint<>(gpSat.getLatitude(), gpSat.getLongitude(),
152 gpSat.getAltitude().getField().getZero());
153
154
155 final FieldVector3D<T> pNadirBody = shape.transform(gpNadir);
156
157
158 final FieldVector3D<T> pNadirRef = refToBody.getInverse().transformPosition(pNadirBody);
159
160 final FieldVector3D<T> zero = FieldVector3D.getZero(gpSat.getAltitude().getField());
161 return new TimeStampedFieldPVCoordinates<>(scRef.getDate(), pNadirRef, zero, zero);
162
163 }
164
165 }