Пример #1
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=[]))
Пример #2
0
def loadZonesFromFile(file):
    f = csv.reader(open(file, 'rb'), delimiter=',')
    taxi = {}
    f.next()
    zones = []
    for row in f:
        latlongVertStrings = row[3]
        lambertVertStrings = row[4]
        llArray = []
        lamArray = []
        for latlong in latlongVertStrings.split(' '):
            vs = [float(v) for v in latlong.split(':')]
            llArray.append(Spatial.Location(vs[0], vs[1]))
        for lambert in lambertVertStrings.split(' '):
            vs = [float(v) for v in lambert.split(':')]
            lamArray.append(Spatial.Location(vs[0], vs[1]))
        zones.append(Zone.Zone(row[0],
                               llArray,
                               Spatial.Polyhedron(lamArray, float(row[1]), float(row[2]))
                               ))
    return zones