[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orekit Developers] FieldOfView Detector



I've added a detector, similar to ElevationDetector, for using an FoV
from the ground.

Also I think we should keep the CircularFieldOfViewDetector. It is a
simple common case and I think its implementation of the g function will
be more accurate and faster the the g function in the FoV detector.
Since the FoV class builds a spherical region using arcs of great
circles a small circle must be approximated as a polygon with many
sides. In one case I tested I had to use 16 vertices to get a decent
approximation of a small circle. So without having done any performance
tests I think the CircularFieldOfViewDetector will be simpler for the
user to configure and faster.

Best Regards,
Evan


On 01/19/2016 03:00 PM, MAISONOBE Luc wrote:
>
> Evan Ward <evan.ward@nrl.navy.mil> a écrit :
>
>> On 01/19/2016 09:01 AM, MAISONOBE Luc wrote:
>>>
>>> Evan Ward <evan.ward@nrl.navy.mil> a écrit :
>>>
>>>> On 01/18/2016 09:27 AM, Luc Maisonobe wrote:
>>>>> Le 18/01/2016 15:16, Luc Maisonobe a écrit :
>>>>>> Hi Evan,
>>>>>>
>>>>>> Le 15/01/2016 09:25, Luc Maisonobe a écrit :
>>>>>>> Le 14/01/2016 22:11, Evan Ward a écrit :
>>>>>>>> Hi Luc,
>>>>>>> Hi Evan,
>>>>>>>
>>>>>>>> I noticed your recent work on the new field of view classes. I
>>>>>>>> think
>>>>>>>> these are a great addition. Would it be possible to model an
>>>>>>>> antenna
>>>>>>>> attached to a ground station? I think the current
>>>>>>>> implementation of
>>>>>>>> FieldOfView requires a spacecraft state.
>>>>>>> You caught me red handed!
>>>>>>>
>>>>>>> I am also not really comfortable with the spacecraft state in the
>>>>>>> offsetFromBoundary method. It induces a dependency that is not
>>>>>>> right. It is currently used to convert the input position into
>>>>>>> a line of sigth, and this computation should better be performed
>>>>>>> at call site, not within the method.
>>>>>>>
>>>>>>> I'll fix this in a few minutes.
>>>>>> I think I will reintroduce a method dedicated to the case the
>>>>>> Field Of
>>>>>> View is spacecraft centered. It will be something like:
>>>>>>
>>>>>>  List<GeodeticPoint> getFootprint(SpacecraftState state,
>>>>>>                                   OneAxisEllipsoid body);
>>>>>>
>>>>>> I think it will be better here than for example in
>>>>>> FootPrintOverlapDetector because there is no predefined geographic
>>>>>> zone
>>>>>> here and the method is expected to be called typically from a
>>>>>> StepHandler throughout propagation.
>>>>>>
>>>>>> Do you agree with this new method?
>>>>> Also if we add this method, do you think FieldOfView should remain in
>>>>> the events package? Perhaps it should be moved to utils (but utils
>>>>> is already quite crowded an unstructured).
>>>>>
>>>>> best regards,
>>>>> Luc
>>>>
>>>> I presume the getFootprint method would project a region of the
>>>> satellite's celestial sphere to the Earth and then return a set of
>>>> points along that boundary.
>>>
>>> Yes.
>>>
>>>> I think it would be a very useful method to
>>>> have and I can see the logic in keeping it where it is. As for the
>>>> parameters, if you're using the ellipsoidal Earth assumption to
>>>> make the
>>>> computation quicker then I think OneAxisEllipsoid is the right
>>>> type. On
>>>> the other hand if the algorithm is using ray tracing or some similar
>>>> algorithm then I think using a BodyShape would add flexibility so
>>>> users
>>>> could include the effects of terrain by providing and terrain based
>>>> BodyShape.
>>>
>>> I use ellipsoidal body assumption, and I do take into account its
>>> flatness. For the parts of the fov boundary that will really hit the
>>> ground, it is in fact some ray tracing and it calls the general
>>> getIntersectionPoint method defined in the BodyShape interface.
>>> However, this cannot be done if parts of the fov skim over horizon,
>>> as we need here to use the points of the limb to wrap around the
>>> visible area on ground. This is where the ellipsoidal body assumption
>>> is used. There is also a special degenerate case if the fov is large
>>> enough it contains all the Earth and none of the boundary points
>>> mett the ground. Here, we return the full limb.
>>>
>>> As per your previous message about ground antenna pattern,
>>> I will change the signature to:
>>>
>>>
>>>     List<List<GeodeticPoint>> getFootprint(Transform fovToBody,
>>> OneAxisEllipsoid body,
>>>                                            double angularStep)
>>>
>>> With this javadoc:
>>>
>>>     /** Get the footprint of the field Of View on ground.
>>>      * <p>
>>>      * This method assumes the Field Of View is centered on some
>>> carrier,
>>>      * which will typically be a spacecraft or a ground station
>>> antenna.
>>>      * The points in the footprint boundary loops are all at altitude
>>> zero
>>>      * with respect to the ellipsoid, they correspond either to
>>> projection
>>>      * on ground of the edges of the Field Of View, or to points on
>>> the body
>>>      * limb if the Field Of View goes past horizon. The points on the
>>> limb
>>>      * see the carrier origin at zero elevation. If the Field Of View
>>> is so
>>>      * large it contains entirely the body, all points will
>>> correspond to
>>>      * points at limb. If the Field Of View looks away from body, the
>>>      * boundary loops will be an empty list. The points within
>>> footprint
>>>      * the loops are sorted in trigonometric order as seen from the
>>> carrier.
>>>      * This implies that someone traveling on ground from one point to
>>> the
>>>      * next one will have the points visible from the carrier on his
>>> left
>>>      * hand side, and the points not visible from the carrier on his
>>> right
>>>      * hand side.
>>>      * </p>
>>>      * <p>
>>>      * If the carrier is a spacecraft, then the {@code fovToBody}
>>> transform
>>>      * can be computed from a {@link
>>> org.orekit.propagation.SpacecraftState}
>>>      * as follows:
>>>      * </p>
>>>      * <pre>
>>>      * Transform inertToBody =
>>> state.getFrame().getTransformTo(body.getBodyFrame(), state.getDate());
>>>      * Transform fovToBody   = new Transform(state.getDate(),
>>>      *
>>> state.toTransform().getInverse(),
>>>      *                                       inertToBody);
>>>      * </pre>
>>>      * <p>
>>>      * If the carrier is a ground station, located using a topocentric
>>> frame
>>>      * and managing its pointing direction using a transform between
>>> the
>>>      * dish frame and the topocentric frame, then the {@code
>>> fovToBody} transform
>>>      * can be computed as follows:
>>>      * </p>
>>>      * <pre>
>>>      * Transform topoToBody =
>>> topocentricFrame.getTransformTo(body.getBodyFrame(), date);
>>>      * Transform topoToDish = ...
>>>      * Transform fovToBody = new Transform(date,
>>>      *                                     topoToDish.getInverse(),
>>>      *                                     topoToBody);
>>>      * </pre>
>>>      * <p>
>>>      * Only the raw zone is used, the angular margin is ignored here.
>>>      * </p>
>>>      * @param fovToBody transform between the frame in which the Field
>>> Of View
>>>      * is defined and body frame.
>>>      * @param body body surface the Field Of View will be projected on
>>>      * @param angularStep step used for boundary loops sampling
>>> (radians)
>>>      * @return list footprint boundary loops (there may be several
>>> independent
>>>      * loops if the Field Of View shape is complex)
>>>      * @throws OrekitException if some frame conversion fails or if
>>> carrier is
>>>      * below body surface
>>>      */
>>>
>>> So you will also be able to use this method for your ground station
>>> (or an airborne antenna, or anything like that).
>>
>> Looks good to me. I think supporting an airborne sensor is a good
>> additional use case, as you point out.
>
> The method is available. It still needs some polishing as one
> test case does not work, but it seems to give very good results
> apart when the sensor if properly configured.
>
> You can update the javadoc if you want.
>
> best regards,
> Luc
>
>>
>> Regards,
>> Evan
>>
>>>
>>> best regards,
>>> Luc
>>>
>>>>
>>>> Best Regards,
>>>> Evan
>>>>
>>>>>
>>>>>> best regards,
>>>>>> Luc
>>>>>>
>>>>>>> I did not foresee using this for ground stations! Once the method
>>>>>>> signature is fixed, it may be used this way too. Would you mind
>>>>>>> updating the javadoc to explain this other use? I don't know
>>>>>>> either if the name FieldOfView is well suited in this case, so
>>>>>>> maybe it
>>>>>>> should be renamed at the same time.
>>>>>>>
>>>>>>> best regards,
>>>>>>> Luc
>>>>>>>
>>>>>>>> Best Regards,
>>>>>>>> Evan
>>>>>>>>
>>>
>>>
>
>