Field of View for ground station

Hello!

I need to get a list of geodetic points that represent the radio visibility zone for a ground station.

I am using the following code:

Frame ITRFFrame = FramesFactory.getPZ9011(IERSConventions.IERS_2010, true);
OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS, Constants.WGS84_EARTH_FLATTENING, ITRFFrame);

// elevation angle (0°, 5°, 7°)
double a = 0.0;
// latitude and longitude of ground station
double latitude = 49.0;
double longitude = 2.0;
// I use the average satellite height as the altitude
double altitude = 500000.0;
GeodeticPoint myStation = new GeodeticPoint(latitude, longitude, altitude);
TopocentricFrame topocentricFrame = new TopocentricFrame(earth, myStation, “My station”);

CircularFieldOfView cof = new CircularFieldOfView(Vector3D.MINUS_K , FastMath.toRadians(90 - a), 0);

Transform topoToBody = topocentricFrame.getTransformTo(ITRFFrame, (AbsoluteDate ) null);

List<List> resu = cof.getFootprint(topoToBody, earth, 0.05);

When I change the value of elevation angle (0°, 5°, 7°), the same radio visibility zones are obtained, which is not correct - the area should decrease. What could be the problem and how to use the getFootprint () method correctly in the case of a ground station? I used this documentation https://www.orekit.org/site-orekit-development/apidocs/org/orekit/geometry/fov/SmoothFieldOfView.html. But in the case of a ground station, the documentation is not detailed.

Thanks in advance!

Hi @dmitrywalther

Welcome to the Orekit forum!

I recommend you to use another ITRF frame. Indeed, PZ90_11 frame is used to define Glonass satellites coordinates in ephemeris files. For instance, you could use FramesFactory.getITRF(IERSConventions.IERS_2010, true).

Your station coordinates are defined, I guess, in degrees. However, they have to be transformed in radians to initialize the GeodeticPoint object.

Regards,
Bryan

2 Likes

Hi, @bcazabonne

Thanks for the answer!

In calculations I use radians, I made a mistake when I copied the code from my IDE. Currently, the differences between the two coordinate systems (ITRF and PZ-90.11) are minimal and this does not affect the final result. Well, I will use ITRF. Based on your comments, the code will look like this:

Frame ITRFFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS, Constants.WGS84_EARTH_FLATTENING, ITRFFrame);

// elevation angle (0°, 5°, 7°)
double a = 0.0;
// latitude and longitude of ground station
double latitude = 49.0;
double longitude = 2.0;
// I use the average satellite height as the altitude
double altitude = 500000.0;
GeodeticPoint myStation = new GeodeticPoint(Math.toRadians(latitude), Math.toRadians(longitude), altitude);
TopocentricFrame topocentricFrame = new TopocentricFrame(earth, myStation, “My station”);

CircularFieldOfView cof = new CircularFieldOfView(Vector3D.MINUS_K , FastMath.toRadians(90 - a), 0);

Transform topoToBody = topocentricFrame.getTransformTo(ITRFFrame, (AbsoluteDate ) null);

List<List> resu = cof.getFootprint(topoToBody, earth, 0.05);

Yes, the difference between PZ-90.11 frame and the current ITRF frame is very small. Therefore, I am not suprised that results are the same. However, I think it is better to reserve use of PZ-90.11 frame for GLONASS ephemeris.

I am not very familiar with the use of Field of View object. In order to help you with your application, please find below an extract of the JavaDoc of the getFootprint() method. The full JavaDoc can be read here.

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

Bryan