/* Contributed in the public domain. * Licensed to CS Systèmes d'Information (CS) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * CS licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.orekit.propagation.events; import org.hipparchus.geometry.euclidean.threed.Vector3D; import org.hipparchus.util.FastMath; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.orekit.Utils; import org.orekit.bodies.BodyShape; import org.orekit.bodies.GeodeticPoint; import org.orekit.bodies.OneAxisEllipsoid; import org.orekit.errors.OrekitException; import org.orekit.frames.Frame; import org.orekit.frames.FramesFactory; import org.orekit.frames.TopocentricFrame; import org.orekit.orbits.KeplerianOrbit; import org.orekit.orbits.PositionAngle; import org.orekit.propagation.Propagator; import org.orekit.propagation.analytical.KeplerianPropagator; import org.orekit.propagation.events.ElevationDetector; import org.orekit.propagation.events.EventsLogger; import org.orekit.propagation.events.EventsLogger.LoggedEvent; import org.orekit.propagation.events.FieldOfView; import org.orekit.propagation.events.GroundFieldOfViewDetector; import org.orekit.time.AbsoluteDate; import org.orekit.utils.Constants; import org.orekit.utils.IERSConventions; import java.util.List; /** * Unit tests for {@link GroundFieldOfViewDetector}. * * @author Evan Ward */ public class GroundFieldOfViewDetectorTest { @Before public void setUp() { Utils.setDataRoot("regular-data"); } /** * Check FoV detector is similar to {@link ElevationDetector} when using * zenith pointing. * * @throws OrekitException on error. */ @Test public void testCaseSimilarToElevationDetector() throws OrekitException { //setup double pi = FastMath.PI; AbsoluteDate date = AbsoluteDate.J2000_EPOCH; //arbitrary date AbsoluteDate endDate = date.shiftedBy(Constants.JULIAN_DAY); Frame eci = FramesFactory.getGCRF(); Frame ecef = FramesFactory.getITRF(IERSConventions.IERS_2010, true); BodyShape earth = new OneAxisEllipsoid( Constants.WGS84_EARTH_EQUATORIAL_RADIUS, Constants.WGS84_EARTH_FLATTENING, ecef); GeodeticPoint gp = new GeodeticPoint( FastMath.toRadians(39), FastMath.toRadians(77), 0); TopocentricFrame topo = new TopocentricFrame(earth, gp, "topo"); //iss like orbit KeplerianOrbit orbit = new KeplerianOrbit( 6378137 + 400e3, 0, FastMath.toRadians(51.65), 0, 0, 0, PositionAngle.TRUE, eci, date, Constants.EGM96_EARTH_MU); Propagator prop = new KeplerianPropagator(orbit); //compute expected result ElevationDetector elevationDetector = new ElevationDetector(topo).withConstantElevation(pi / 6) .withMaxCheck(5.0); EventsLogger logger = new EventsLogger(); prop.addEventDetector(logger.monitorDetector(elevationDetector)); prop.propagate(endDate); List<LoggedEvent> expected = logger.getLoggedEvents(); //action //construct similar FoV based detector //half width of 60 deg pointed along +Z in antenna frame //not a perfect small circle b/c FoV makes a polygon with great circles FieldOfView fov = new FieldOfView(Vector3D.PLUS_K, Vector3D.PLUS_I, pi / 3, 16, 0); //simple case for fixed pointing to be similar to elevation detector. //could define new frame with varying rotation for slewing antenna. GroundFieldOfViewDetector fovDetector = new GroundFieldOfViewDetector(topo, fov) .withMaxCheck(5.0); Assert.assertSame(topo, fovDetector.getFrame()); Assert.assertSame(fov, fovDetector.getFieldOfView()); logger = new EventsLogger(); prop = new KeplerianPropagator(orbit); prop.addEventDetector(logger.monitorDetector(fovDetector)); prop.propagate(endDate); List<LoggedEvent> actual = logger.getLoggedEvents(); //verify Assert.assertEquals(2, expected.size()); Assert.assertEquals(2, actual.size()); for (int i = 0; i < 2; i++) { AbsoluteDate expectedDate = expected.get(i).getState().getDate(); AbsoluteDate actualDate = actual.get(i).getState().getDate(); // same event times to within 1s. Assert.assertEquals(expectedDate.durationFrom(actualDate), 0.0, 1.0); } } }