Using CircularFieldOfViewDetector to approximate an earth based radar finding propegated satellites

Hello again!

I am attempting to essentially simulate earth based radar observations of satellites. I have a Vector3D of the radar position and I am attempting to use a CircularFieldOfViewDetector with a handler which should save the locations of the satellite every ten seconds while in the field of view.

My question is how to use this CircularFieldOfViewDetector. My current attempt returns only ‘zero norm,’ and I therefore conclude I am using it incorrectly. I am using the following constructor:

CircularFieldOfViewDetector(double maxCheck, PVCoordinatesProvider pvTarget, Vector3D center, Double halfAperture)

As I understand it the PVCoordinatesProvider should be the satellite, and so I have passed along the orbit for which I set up the numerical propegator. Then for the center what I have done is create a GeodeticPoint defining the station and use .getZenith function. I believe my error is one of these two. I think one of the following possibilities is occurring:

  1. Either the center vector or the orbit is not being propagated and stays stationary when I propagate or alternatively
  2. I believe I have a frame mismatch.

It is of course possible that I just don’t understand the use of the visibility handler. I’ll post the relevant code below:

        //  Initial state definition : date, orbit
        AbsoluteDate initialDate = new AbsoluteDate(2004, 01, 01, 23, 30, 00.000, TimeScalesFactory.getUTC());
        Frame inertialFrame = FramesFactory.getEME2000(); // inertial frame for orbit definition
        double a = 5.216527285956187e+07;
        double e = 2.720000000000000e-03;
        double i = 0.1;
        double pa = 287.2221/180*Math.PI;
        double raan = 327.2813/180*Math.PI;
        double anomaly = 105.4665/180*Math.PI;
        
       // KeplerianOrbit

        
        Orbit initialOrbit = new KeplerianOrbit(a, e, i,pa,raan,  anomaly,  PositionAngle.MEAN , inertialFrame, initialDate, mu);

        // Propagator : consider a simple Keplerian motion (could be more elaborate)
        final double dP       = 0.001;
        final double minStep  = 0.001;
        final double maxStep  = 1000;
        final double initStep = 60;
        final double[][] tolerance = NumericalPropagator.tolerances(dP, initialOrbit, OrbitType.KEPLERIAN);
        AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(minStep, maxStep, tolerance[0], tolerance[1]);
        integrator.setInitialStepSize(initStep);
        double mass = 1000;
        NumericalPropagator numProp = createNumProp(initialOrbit, mass);            // Earth and frame
        
        Frame earthFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
        BodyShape earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
                                               Constants.WGS84_EARTH_FLATTENING,
                                               earthFrame);
        
        // Station
        final double lat = 8+43/60; // degrees
        final double longa = 167 + 44/60; // degrees
        final double longitude = FastMath.toRadians(lat);
        final double latitude  = FastMath.toRadians(longa);
        final double altitude  = 0.;
        final GeodeticPoint station1 = new GeodeticPoint(latitude, longitude, altitude);
        final TopocentricFrame sta1Frame = new TopocentricFrame(earth, station1, "station1");
        
        // Event definition
        final double maxcheck  = 20.0;
        final double threshold =  0.001;
        // I moved this to 360 to see if I could get any reads whatsoever
        final double elevation = FastMath.toRadians(360.0);
        /* I just have this here for reference
         * final EventDetector sta1Visi =
                new ElevationDetector(maxcheck, threshold, sta1Frame).
                withConstantElevation(elevation).
                withHandler(new VisibilityHandler());
                */ 
        final EventDetector real = new CircularFieldOfViewDetector(maxcheck, initialOrbit, sta1Frame.getZenith(), elevation).withHandler(new VisibilityHandler());
        numProp.addForceModel(new NewtonianAttraction(mu));

        // Add event to be detected
        numProp.addEventDetector(real);

I think the printing and other functions work, because they work when using the sta1visi from the tutorial.

Thanks for all your continued help, and let me know if I’ve been unclear or if additional information is required! Also thank you for a great package!

Paul

Okay I guess I fixed it using the right method… oops.

If you’re having a similar problem in the future use GroundFieldOfViewDetector!