Пример #1
0
def calculateMovement(coreFunctions, parameters, weather, state, instruction):
    # (coreFunctions:SimulationCoreFunctions)
    # (parameters:FlightParameters) 
    # (weather:WeatherState) (state:FlightState) (instruction:Instruction)
    time = parameters.ActualGateDepartureTime + state.TimeElapsed*1.0 # <Time/Hours>
    currentPosition = state.AircraftPosition
    altitude = Spatial.positionToAltitude(currentPosition)

    grossWeight = coreFunctions.WeightModel(parameters, state)
    (destination, instructedAirSpeed) = instruction

    currentLocation = Spatial.positionToLocation(currentPosition)
    destinationLocation = Spatial.positionToLocation(destination)
    destinationAltitude = coreFunctions.AltitudeLimiter(grossWeight,
            Spatial.positionToAltitude(destination))
    airSpeed = coreFunctions.AirSpeedLimiter(
        parameters.AircraftType.MaximumMachSpeed,
        grossWeight, altitude, instructedAirSpeed)
    deltaVector = Spatial.calculateLocationDifference(currentLocation, destinationLocation)
    distance = Spatial.calculateDistance1(currentLocation, destinationLocation)
    if distance <= 0.0 :
        zeroGroundSpeed = Spatial.Vector(0.0, 0.0)
        return (0.0, zeroGroundSpeed, 0.0, 0.0, 0.0, [])
    else:
        #windVector = getWindVelocity(weather, time, currentPosition)
        windVector = Weather.zeroWindVelocity
        groundSpeed = Movement.calculateGroundVelocity(airSpeed, 
                                                       Spatial.calculateRadians(deltaVector),
                                                       windVector)
        groundVector = Movement.rescale(deltaVector, groundSpeed)
        (cruiseBurn, verticalCruiseFuelDiff, verticalVelocity) =  \
        coreFunctions.FuelModel(FuelModel.flightFunctions, grossWeight, altitude, 
                                airSpeed,
                                FlightTypes.getVerticalState(altitude, destinationAltitude))
        return (cruiseBurn, groundVector, verticalCruiseFuelDiff, verticalVelocity, airSpeed, [])
Пример #2
0
def stepToWaypoint(coreFunctions, timeStep, arrivalRadius, parameters, weather,
                   airspace, state, instruction):
    #(coreFunctions:SimulationCoreFunctions) (timeStep:float<Hours>) (arrivalRadius:float<NauticalMiles>)
    #(parameters:FlightParameters) (weather:WeatherState) (airspace:Airspace) (state:FlightState) (instruction:Instruction) =
    (currentX, currentY, currentZ) = state.AircraftPosition
    (destinationX, destinationY, destinationZRaw) = instruction.Waypoint
    grossWeight = coreFunctions.WeightModel(parameters, state)
    destinationZ = coreFunctions.AltitudeLimiter(grossWeight, destinationZRaw)
    distanceRemaining = Spatial.calculateDistance1(
        Spatial.Location(currentX, currentY),
        Spatial.Location(destinationX, destinationY))

    (cruiseBurn, groundVector, verticalCruiseFuelDiff, VerticalVelocity, airSpeed, messages) = \
        calculateMovement(coreFunctions, parameters, weather, state, instruction)
    # assertNonNegative "cruiseBurn" cruiseBurn
    groundSpeed = Movement.calculateSpeed(groundVector)
    distanceTravelled = groundSpeed * timeStep
    reachedDestination = distanceRemaining <= (distanceTravelled +
                                               arrivalRadius)
    #    print 'distanceRemaing: ' + str(distanceRemaining) + 'distanceTravelled: ' + str(distanceTravelled + arrivalRadius)

    (groundSpeedX, groundSpeedY) = groundVector
    (groundX, groundY) = (float(groundSpeedX * timeStep),
                          float(groundSpeedY * timeStep))
    elapsedRatio = 0.0
    if distanceTravelled > 0.0:
        elapsedRatio = min(distanceRemaining,
                           distanceTravelled) / distanceTravelled

    timeElapsed = elapsedRatio * timeStep
    climbTimeElapsed = 0.0
    if math.fabs(VerticalVelocity) > 0.0:
        climbTimeElapsed = \
            min(1.0,
                     ((destinationZ - currentZ)/(VerticalVelocity * timeElapsed)) * timeElapsed)
    newPosition = Spatial.Position(
        currentX + groundX * elapsedRatio, currentY + groundY * elapsedRatio,
        currentZ + VerticalVelocity * climbTimeElapsed)
    totalFuelBurn = cruiseBurn * timeElapsed + verticalCruiseFuelDiff * climbTimeElapsed
    #    print 'totalFuelBurn:' + str(totalFuelBurn) + 'curise:' + str(cruiseBurn * timeElapsed) + \
    #        'verticalBurn:' + str(verticalCruiseFuelDiff * climbTimeElapsed)

    intersectedAirspace = Airspace.aircraftInAirspace(airspace,
                                                      state.AircraftPosition,
                                                      newPosition)
    timeInTurbulence = 0.0
    if intersectedAirspace.TurbulentZone:
        timeInTurbulence = timeElapsed
    # Aircraft's new state
    return (reachedDestination,
            FlightTypes.FlightState(AircraftPosition=newPosition,
                                    AirSpeed=airSpeed,
                                    GroundSpeed=groundSpeed,
                                    TimeElapsed=timeElapsed,
                                    FuelConsumed=totalFuelBurn,
                                    IntersectedAirspace=intersectedAirspace,
                                    TimeElapsedInTurbulence=timeInTurbulence,
                                    Messages=[]))
Пример #3
0
def stepToWaypoint(coreFunctions, timeStep, arrivalRadius, parameters, weather, airspace, 
                   state, instruction):
    #(coreFunctions:SimulationCoreFunctions) (timeStep:float<Hours>) (arrivalRadius:float<NauticalMiles>)
    #(parameters:FlightParameters) (weather:WeatherState) (airspace:Airspace) (state:FlightState) (instruction:Instruction) =
    (currentX, currentY, currentZ) = state.AircraftPosition
    (destinationX, destinationY, destinationZRaw) = instruction.Waypoint
    grossWeight = coreFunctions.WeightModel(parameters, state)
    destinationZ = coreFunctions.AltitudeLimiter(grossWeight, destinationZRaw)
    distanceRemaining = Spatial.calculateDistance1(Spatial.Location(currentX, currentY), 
                                                   Spatial.Location(destinationX, destinationY))

    (cruiseBurn, groundVector, verticalCruiseFuelDiff, VerticalVelocity, airSpeed, messages) = \
        calculateMovement(coreFunctions, parameters, weather, state, instruction)
    # assertNonNegative "cruiseBurn" cruiseBurn
    groundSpeed = Movement.calculateSpeed(groundVector)
    distanceTravelled = groundSpeed * timeStep
    reachedDestination = distanceRemaining <= (distanceTravelled + arrivalRadius)
#    print 'distanceRemaing: ' + str(distanceRemaining) + 'distanceTravelled: ' + str(distanceTravelled + arrivalRadius)
    
    (groundSpeedX, groundSpeedY) = groundVector
    (groundX, groundY) = (float (groundSpeedX * timeStep), float (groundSpeedY * timeStep))
    elapsedRatio = 0.0
    if distanceTravelled > 0.0:
        elapsedRatio = min(distanceRemaining, distanceTravelled)/distanceTravelled

    timeElapsed = elapsedRatio * timeStep
    climbTimeElapsed = 0.0
    if math.fabs(VerticalVelocity) > 0.0:
        climbTimeElapsed = \
            min(1.0, 
                     ((destinationZ - currentZ)/(VerticalVelocity * timeElapsed)) * timeElapsed)
    newPosition = Spatial.Position(currentX+groundX*elapsedRatio,
                                   currentY+groundY*elapsedRatio,
                                   currentZ + VerticalVelocity*climbTimeElapsed)
    totalFuelBurn = cruiseBurn * timeElapsed + verticalCruiseFuelDiff * climbTimeElapsed
#    print 'totalFuelBurn:' + str(totalFuelBurn) + 'curise:' + str(cruiseBurn * timeElapsed) + \
#        'verticalBurn:' + str(verticalCruiseFuelDiff * climbTimeElapsed)

    intersectedAirspace = Airspace.aircraftInAirspace(airspace, state.AircraftPosition, newPosition)
    timeInTurbulence = 0.0
    if intersectedAirspace.TurbulentZone:
        timeInTurbulence = timeElapsed
    # Aircraft's new state
    return (reachedDestination,  
            FlightTypes.FlightState(
            AircraftPosition=newPosition,
            AirSpeed = airSpeed,
            GroundSpeed = groundSpeed,
            TimeElapsed = timeElapsed,
            FuelConsumed = totalFuelBurn,
            IntersectedAirspace = intersectedAirspace,
            TimeElapsedInTurbulence = timeInTurbulence,
            Messages = []))
Пример #4
0
def calculateMovement(coreFunctions, parameters, weather, state, instruction):
    # (coreFunctions:SimulationCoreFunctions)
    # (parameters:FlightParameters)
    # (weather:WeatherState) (state:FlightState) (instruction:Instruction)
    time = parameters.ActualGateDepartureTime + state.TimeElapsed * 1.0  # <Time/Hours>
    currentPosition = state.AircraftPosition
    altitude = Spatial.positionToAltitude(currentPosition)

    grossWeight = coreFunctions.WeightModel(parameters, state)
    (destination, instructedAirSpeed) = instruction

    currentLocation = Spatial.positionToLocation(currentPosition)
    destinationLocation = Spatial.positionToLocation(destination)
    destinationAltitude = coreFunctions.AltitudeLimiter(
        grossWeight, Spatial.positionToAltitude(destination))
    airSpeed = coreFunctions.AirSpeedLimiter(
        parameters.AircraftType.MaximumMachSpeed, grossWeight, altitude,
        instructedAirSpeed)
    deltaVector = Spatial.calculateLocationDifference(currentLocation,
                                                      destinationLocation)
    distance = Spatial.calculateDistance1(currentLocation, destinationLocation)
    if distance <= 0.0:
        zeroGroundSpeed = Spatial.Vector(0.0, 0.0)
        return (0.0, zeroGroundSpeed, 0.0, 0.0, 0.0, [])
    else:
        #windVector = getWindVelocity(weather, time, currentPosition)
        windVector = Weather.zeroWindVelocity
        groundSpeed = Movement.calculateGroundVelocity(
            airSpeed, Spatial.calculateRadians(deltaVector), windVector)
        groundVector = Movement.rescale(deltaVector, groundSpeed)
        (cruiseBurn, verticalCruiseFuelDiff, verticalVelocity) =  \
        coreFunctions.FuelModel(FuelModel.flightFunctions, grossWeight, altitude,
                                airSpeed,
                                FlightTypes.getVerticalState(altitude, destinationAltitude))
        return (cruiseBurn, groundVector, verticalCruiseFuelDiff,
                verticalVelocity, airSpeed, [])