Satellite footprint when beam pointed to specific ground station

Dear Orekit community,
@luc and @JarrodSears

I wanted to ask a similar question, but since someone has just asked it, I would not open a new Topic. I’d like to determine the time when the ISS enters the field of view of a specified point on the ground.

I don’t fully understand the physics behind it yet, but I’m working on it. :slight_smile:

Based on the answer, I created a code, but I get an error. @luc could you please take a look at it, I tried to do what you wrote. Unfortunately, I still don’t fully understand it, so I’m not sure if I succeeded :slight_smile: :slight_smile:

Here is my code

// ISS
        TLE tle = new TLE(
                "1 25544U 98067A   23208.30934329  .00015800  00000+0  28347-3 0  9998",
                "2 25544  51.6413 129.7314 0000554  64.5675  79.5453 15.50079229408012",
                TimeScalesFactory.getUTC()
        );

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


        // predict
        final TLEPropagator propagator = TLEPropagator.selectExtrapolator(tle);
        AbsoluteDate target = new AbsoluteDate(new Date(), TimeScalesFactory.getUTC());
        SpacecraftState state = propagator.propagate(target);
        Vector3D satPoint = state.getPVCoordinates().getPosition();
        GeodeticPoint geoPoint = earth.transform(satPoint, state.getFrame(), state.getDate());
        System.out.println(geoPoint);

//        Transform inertToBody = state.getFrame().getTransformTo(earthFrame, state.getDate());

//        Transform fovToBody = new Transform(state.getDate(),
//                state.toTransform().getInverse(),
//                inertToBody);

        //create gps point on earth frame
        final double longitude = FastMath.toRadians(48.21791046918412);
        final double latitude  = FastMath.toRadians(16.397910223220432);
        final double altitude  = 0.;

        GeodeticPoint gpsPoint = new GeodeticPoint(latitude, longitude, altitude);
        Vector3D targetEarth = earth.transform(gpsPoint); // this can be computed once as it does not depend on date
        Vector3D losEarth    = targetEarth.subtract(state.getPVCoordinates(earthFrame).getPosition());
        Transform fovToBody  = new Transform(target, new Rotation(Vector3D.PLUS_K, losEarth));

        CircularFieldOfView cfov =
                new CircularFieldOfView(Vector3D.PLUS_K, FastMath.toRadians(50.), 0.);

        List<List<GeodeticPoint>> footprint =
                cfov.getFootprint(fovToBody, (OneAxisEllipsoid) earth, 0.1);

        List<GeodeticPoint> list = footprint.get(0);
        for (GeodeticPoint point : list) {
            System.out.println("[" + FastMath.toDegrees(point.getLongitude()) + "," +
                    FastMath.toDegrees(point.getLatitude()) + "],");
        }

and exception:
Exception in thread “main” org.orekit.errors.OrekitException: point is inside ellipsoid

Could you tell me which point is inside the ellipsoid and why?

I have one more question.
I tried to calculate the field of view based on the following article: Field of View Sat Event Detector Example
I started with Evan’s code and used TLE propagator to define the orbit. The values I got weren’t appropriate and I found this post.

I think that both solutions could be used to determine getting into the field of view. (Am I getting this right?)
How do the two implementations differ?

Thank you for your help in advance. Looking forward to your reply.
Rol