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

Re: [Orekit Developers] FieldOfView Detector



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.

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
>>>>>>
>
>