Hi Evan,
Thanks for your reply. I did indeed expect 0 for the longitude extremum–I was just noting that it worked. Here is the code for event detection on a short ISS ephemeris. I’ve included latitude crossing detection to be sure it works. The longitude crossing detection hangs…
package applib.test;
import applib.orekit.OrekitUtilities;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.data.DataProvidersManager;
import org.orekit.data.DirectoryCrawler;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.propagation.SpacecraftState;
import org.orekit.propagation.analytical.Ephemeris;
import org.orekit.propagation.events.EventDetector;
import org.orekit.propagation.events.EventsLogger;
import org.orekit.propagation.events.LatitudeCrossingDetector;
import org.orekit.propagation.events.LongitudeCrossingDetector;
import org.orekit.propagation.events.handlers.EventHandler;
import org.orekit.propagation.events.handlers.RecordAndContinue;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.DateComponents;
import org.orekit.time.DateTimeComponents;
import org.orekit.time.TimeComponents;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.AbsolutePVCoordinates;
import org.orekit.utils.Constants;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.TimeStampedPVCoordinates;
public class LongCrossingTest {
double[][] ephemData =
{{2020168.00000000, +3.11645372646856E+06, +3.56303974760210E+06, +4.86585087591950E+06, -6.78600943954931E+03, +2.60527025104741E+03, +2.43268735723718E+03},
{2020168.00694444, -1.33788954572545E+06, +4.22521068792356E+06, +5.14208226327810E+06, -7.49130239339198E+03, -4.82620951928272E+02, -1.54711536580586E+03},
{2020168.01388889, -5.20302491052448E+06, +3.02687870520295E+06, +3.14785702257933E+06, -4.89707456825247E+03, -3.35865666023309E+03, -4.84451336174061E+03},
{2020168.02083333, -6.77614214603955E+06, +4.95199524380026E+05, -2.36817019670809E+05, -1.45826203103024E+02, -4.75577529669370E+03, -6.00276146228711E+03},
{2020168.02777778, -5.36718001167701E+06, -2.25488447276047E+06, -3.51759010857660E+06, +4.65952505072566E+03, -4.06010992466957E+03, -4.51349883925724E+03},
{2020168.03472222, -1.60262722780846E+06, -4.01625181910066E+06, -5.25145024343810E+06, +7.40819958381310E+03, -1.58790935112168E+03, -1.04613902727167E+03},
{2020168.04166667, +2.86371248000347E+06, -4.01967221558883E+06, -4.68032459287575E+06, +6.91104996598993E+03, +1.57762760504089E+03, +2.87783461225264E+03},
{2020168.04861111, +6.07423894273251E+06, -2.26182768972817E+06, -2.05294286111847E+06, +3.37858576520745E+03, +4.05915010507624E+03, +5.54555781651491E+03},
{2020168.05555556, +6.61326189805755E+06, +4.89969312558430E+05, +1.47878747143030E+06, -1.65289604846995E+03, +4.76136461855069E+03, +5.77335858396059E+03},
{2020168.06250000, +4.23790377664995E+06, +3.02566242955372E+06, +4.35680967738801E+06, -5.96008321899841E+03, +3.36600978316733E+03, +3.45026177517780E+03},
{2020168.06944444, -4.90507648645092E+03, +4.22839521464820E+06, +5.31009043591639E+06, -7.63893201932203E+03, +4.89436333497626E+02, -3.94583656473561E+02},
{2020168.07638889, -4.24558550678168E+06, +3.56926022411138E+06, +3.91876309857785E+06, -5.95338290563186E+03, -2.60243319809405E+03, -4.06482957923683E+03},
{2020168.08333333, -6.61606694142538E+06, +1.33801135966337E+06, +7.96651732857410E+05, -1.64461058439188E+03, -4.54915483531668E+03, -5.94102136490552E+03}};
public LongCrossingTest() {
List<SpacecraftState> stateList = new ArrayList<>(ephemData.length);
int numPoints = ephemData.length;
for (int ephPointIndex = 0; ephPointIndex<numPoints; ephPointIndex++) {
double timeVal = ephemData[ephPointIndex][0];
int year = (int) Math.floor(timeVal/1000.0);
int dayOfYear = (int) Math.floor(timeVal-year*1000.0);
DateComponents dateComponents = new DateComponents(year, dayOfYear);
int secInDay = (int) (86400 * (timeVal - Math.floor(timeVal)));
TimeComponents timeComponents = new TimeComponents(secInDay);
DateTimeComponents dtc = new DateTimeComponents(dateComponents, timeComponents);
AbsoluteDate absoluteDate = new AbsoluteDate(dtc, TimeScalesFactory.getUTC());
Frame frame = FramesFactory.getTEME();
Vector3D pos = new Vector3D(ephemData[ephPointIndex][1], ephemData[ephPointIndex][2], ephemData[ephPointIndex][3]);
Vector3D vel = new Vector3D(ephemData[ephPointIndex][4], ephemData[ephPointIndex][5], ephemData[ephPointIndex][6]);
TimeStampedPVCoordinates tpv = new TimeStampedPVCoordinates(absoluteDate, pos, vel);
AbsolutePVCoordinates apv = new AbsolutePVCoordinates(frame, tpv);
stateList.add(new SpacecraftState(apv));
}
Ephemeris ephemeris = new Ephemeris(stateList, 3);
EventsLogger eventsLogger = new EventsLogger();
EventHandler recordAndContinue = new RecordAndContinue();
Frame earthFrame = FramesFactory.getTIRF(IERSConventions.IERS_1996);
OneAxisEllipsoid ellipsoid = new OneAxisEllipsoid(Constants.GRS80_EARTH_EQUATORIAL_RADIUS, Constants.GRS80_EARTH_FLATTENING, earthFrame);
EventDetector latCrossingDetector = new LatitudeCrossingDetector(ellipsoid, 0.0).withHandler(recordAndContinue);
EventDetector lonCrossingDetector = new LongitudeCrossingDetector(ellipsoid, 0.0).withHandler(recordAndContinue);
ephemeris.addEventDetector(latCrossingDetector);
ephemeris.addEventDetector(eventsLogger.monitorDetector(latCrossingDetector));
ephemeris.addEventDetector(lonCrossingDetector);
ephemeris.addEventDetector(eventsLogger.monitorDetector(lonCrossingDetector));
ephemeris.propagate(ephemeris.getMaxDate());
List<EventsLogger.LoggedEvent> events = eventsLogger.getLoggedEvents();
for (EventsLogger.LoggedEvent event : events) {
System.out.println("Event Date = " + event.getState().getDate());
}
}
public static void main(String[] args) {
File orekitData = new File("data/orekit-data");
DataProvidersManager manager = DataProvidersManager.getInstance();
try {
manager.addProvider(new DirectoryCrawler(orekitData));
} catch (OrekitException ex) {
ex.printStackTrace(System.err);
}
new LongCrossingTest();
}
}