Click or drag to resize

Propagation

A RoutePropagator combines various RouteSegments (RouteProcedures and RouteConnections) and their associated RouteProfiles to create a PropagatedRoute. The PropagatedRoute can then create a Point representing the state of the platform along the route. Various other Scalars and Axes are included which use the PropagatedRoute to analyze the geometry along the route and provide attitude for a platform traversing the route.

Note Note

The functionality described in this topic requires a license for the Route Design Library.

Propagating Routes

The construction of a route requires several different pieces. The core piece is the RoutePropagator which in turn produces a PropagatedRoute instance containing metadata and trajectory for the specified route. To create a route, the user adds RouteSegments to the propagator. There are two ways to do this. Either the user can configure the DefaultConnectionBehavior (get) and then add Procedures or the user can alternate between adding Procedures and Connections.

Adding connections directly allows users fine control over the geometry between RouteProcedures. However, for most cases, reconfiguring the default behavior on the propagator is sufficient to create a route. To do this, all the user needs to do is to specify the ProfileDynamics, ProfileSpeed, and indicate what the horizontal and vertical behavior of the geometry should be. Note that if a TerrainProvider is involved, the user may also need to configure additional properties indicating how to treat the terrain.

Java
ProfileSpeed cruiseSpeed = new ProfileSpeed(30.0, SpeedReference.TOTAL); // ~67 miles per hour

ProfileDynamics profileDynamics = new ProfileDynamics();
double inclineAngle = Trig.degreesToRadians(10.0);
profileDynamics.setAscentSpeed(cruiseSpeed.getTargetSpeed() * Math.sin(inclineAngle));
profileDynamics.setDescentSpeed(1.5 * profileDynamics.getAscentSpeed());
profileDynamics.setPitchUpAcceleration(0.4 * Constants.EarthSurfaceGravity);
profileDynamics.setPushOverAcceleration(0.6 * Constants.EarthSurfaceGravity);
profileDynamics.setThrustAcceleration(0.4 * Constants.EarthSurfaceGravity);
profileDynamics.setThrustDeceleration(0.6 * Constants.EarthSurfaceGravity);

RoutePropagator propagator = new RoutePropagator();
propagator.setCentralBody(earth);

propagator.getDefaultConnectionBehavior().setSurfaceShape(localTerrain.getShape());
propagator.getDefaultConnectionBehavior().setKindOfSurfaceConnection(KindOfSurfaceConnection.RHUMB_LINE);
propagator.getDefaultConnectionBehavior().setDynamics(profileDynamics);
propagator.getDefaultConnectionBehavior().setSpeed(cruiseSpeed);

if (useTerrainForProfiles) {
    propagator.getDefaultConnectionBehavior().setKindOfProfile(DefaultProfileBehavior.AVOID_TERRAIN);
    propagator.getDefaultConnectionBehavior().setTerrainSurface(localTerrain);
    propagator.getDefaultConnectionBehavior().setTerrainSamplingDistance(100.0); // ~328 feet
    propagator.getDefaultConnectionBehavior().setMinimumHeightAboveTerrain(400.0); // ~1312 feet
} else {
    propagator.getDefaultConnectionBehavior().setKindOfProfile(DefaultProfileBehavior.STANDARD_CONNECTION);
    propagator.getDefaultConnectionBehavior().setTerrainSurface(new EllipsoidTerrainProvider(earth.getShape(), earth.getFixedFrame()));
}

After propagating a route and generating a PropagatedRoute, the user can create a Point, representing the position along the route and its derivatives, by calling createPointFromRoute. In most cases, the propagator will attempt to produce a feasible route, but sometimes the geometry is such that connections between two procedures or profiles are not possible with the user specified parameters. When this happens, the propagator will report errors in the ProcedureConfigurationResults (get) and ConnectionConfigurationResults (get). This will identify which procedure likely caused the problem and whether the problem occurred from the surface geometry, height, or speed.

Java
PropagatedRoute route = propagator.propagateFromTime(start);
if (route.getHasConfigurationErrors()) {
    for (ProcedureConfigurationResult error : route.getProcedureConfigurationResults()) {
        RouteProcedure problemProcedure = error.getProcedure();
        SurfaceConnectionStatus entryError = error.getSurfaceEntryResult().getConnectionStatus();
        SurfaceConnectionStatus exitError = error.getSurfaceExitResult().getConnectionStatus();
        HeightConfigurationStatus heightError = error.getProfileResult().getHeightConfigurationResult().getConnectionStatus();
        SpeedConfigurationStatus speedError = error.getProfileResult().getSpeedConfigurationResult().getConnectionStatus();
    }
}

Point trajectoryPoint = route.createPointFromRoute();
JulianDate routeStart = route.getStart();
JulianDate routeStop = route.getStop();