Esempio n. 1
0
 def setUp(self):
     self.rocket = "fakeNewsRocket"  # May have to convert this into a real Rocket at some point, but it's faster this way
     self.simDefinition = SimDefinition(
         "MAPLEAF/Examples/Simulations/Wind.mapleaf", silent=True)
     self.simDefinition.setValue("Environment.MeanWindModel", "Constant")
     envReader = SubDictReader("Environment", self.simDefinition)
     self.mWM = meanWindModelFactory(envReader, self.rocket)
    def setUp(self):
        configFilePath = "MAPLEAF/Examples/Simulations/Wind.mapleaf"
        self.simDef = SimDefinition(configFilePath, silent=True)
        self.simDef.setValue("Environment.MeanWindModel", "Constant")
        self.simDef.setValue("SimControl.loggingLevel", "0")
        rocketDictReader = SubDictReader("Rocket", self.simDef)
        envReader = SubDictReader("Environment", self.simDef)
        self.rocket = Rocket(rocketDictReader, silent=True)

        self.mWM = meanWindModelFactory(envReader, self.rocket)
Esempio n. 3
0
    def test_getMeanWind_CustomProfile(self):
        # Make sure custom profile model is used
        self.simDefinition.setValue("Environment.MeanWindModel",
                                    "CustomWindProfile")
        self.simDefinition.setValue(
            "Environment.CustomWindProfile.filePath",
            "MAPLEAF/Examples/Wind/testWindProfile.txt")
        # Re-initialize mWM
        mWM = meanWindModelFactory(self.envReader, self.rocket)

        assertVectorsAlmostEqual(self, mWM.getMeanWind(8000),
                                 Vector(-5, -4, -2))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(7000),
                                 Vector(-5, -4, -2))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(6500),
                                 Vector(10, -2, -1))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(1000), Vector(10, 0, 0))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(0), Vector(10, 0, 0))
Esempio n. 4
0
    def test_getMeanWind_Hellman(self):
        # Make sure custom profile model is used
        self.simDefinition.setValue("Environment.MeanWindModel", "Hellman")
        self.simDefinition.setValue("Environment.Hellman.alphaCoeff", "0.1429")
        self.simDefinition.setValue("Environment.Hellman.altitudeLimit",
                                    "1000")
        # Set ground velocity
        self.simDefinition.setValue("Environment.Hellman.groundWindModel",
                                    "Constant")
        self.simDefinition.setValue("Environment.ConstantMeanWind.velocity",
                                    "(5 1 0)")
        # Re-initialize mWM
        mWM = meanWindModelFactory(self.envReader, self.rocket)

        assertVectorsAlmostEqual(self, mWM.getMeanWind(8000),
                                 Vector(9.655394088, 1.931078818, 0))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(2000),
                                 Vector(9.655394088, 1.931078818, 0))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(1000),
                                 Vector(9.655394088, 1.931078818, 0))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(500),
                                 Vector(8.744859132, 1.748971826, 0))
        assertVectorsAlmostEqual(self, mWM.getMeanWind(0), Vector(5, 1, 0))
Esempio n. 5
0
    def __init__(self, simDefinition=None, silent=False):
        ''' Sets up the Wind, Atmospheric, and Earth models requested in the Sim Definition file '''
        self.launchRail = None

        if simDefinition != None:
            # Whenever we're running a real simulation, should always end up here
            envDictReader = SubDictReader("Environment", simDefinition)

            self.meanWindModel = meanWindModelFactory(envDictReader, silent=silent)
            self.turbulenceModel = turbulenceModelFactory(envDictReader, silent=silent)
            self.atmosphericModel = atmosphericModelFactory(envDictReader=envDictReader)
            self.earthModel = earthModelFactory(envDictReader)

            self.launchSiteElevation = envDictReader.tryGetFloat("LaunchSite.elevation")
            self.launchSiteLatitude = envDictReader.tryGetFloat("LaunchSite.latitude")
            self.launchSiteLongitude = envDictReader.tryGetFloat("LaunchSite.longitude")

            # Check if being launched from a launch rail
            launchRailLength = envDictReader.getFloat("LaunchSite.railLength")
            
            if launchRailLength > 0:
                # Initialize a launch rail, aligned with the rocket's initial direction
                initialRocketPosition_towerFrame = envDictReader.getVector("Rocket.position")

                # Check whether precise initial orientation has been specified
                rotationAxis = envDictReader.tryGetVector("Rocket.rotationAxis", defaultValue=None)
                if rotationAxis != None:
                    rotationAngle = math.radians(envDictReader.getFloat("Rocket.rotationAngle"))
                    initOrientation = Quaternion(rotationAxis, rotationAngle)
                else:
                    # Calculate initial orientation quaternion in launch tower frame
                    rotationAxis = envDictReader.tryGetVector("Rocket.rotationAxis", defaultValue=None)
                    if rotationAxis != None:
                        rotationAngle = math.radians(self.rocketDictReader.getFloat("Rocket.rotationAngle"))
                        initOrientation = Quaternion(rotationAxis, rotationAngle)
                    else:
                        # Calculate initial orientation quaternion in launch tower frame
                        initialDirection = envDictReader.getVector("Rocket.initialDirection").normalize()
                        angleFromVertical = Vector(0,0,1).angle(initialDirection)
                        rotationAxis = Vector(0,0,1).crossProduct(initialDirection)
                        initOrientation = Quaternion(rotationAxis, angleFromVertical)

                    # TODO: Get from rocket, or calculate the same way - so that it works with rotationAxis + Angle
                    initialDirection = envDictReader.getVector("Rocket.initialDirection").normalize()
                    angleFromVertical = Vector(0,0,1).angle(initialDirection)
                    rotationAxis = Vector(0,0,1).crossProduct(initialDirection)
                    initOrientation = Quaternion(rotationAxis, angleFromVertical)

                initPosition_seaLevelENUFrame = initialRocketPosition_towerFrame + Vector(0, 0, self.launchSiteElevation)
                launchTowerState_local = RigidBodyState(position=initPosition_seaLevelENUFrame, orientation=initOrientation)
                launchTowerState_global = self.earthModel.convertIntoGlobalFrame(launchTowerState_local, self.launchSiteLatitude, self.launchSiteLongitude)
                towerDirection_global = launchTowerState_global.orientation.rotate(Vector(0, 0, 1))                
                self.launchRail = LaunchRail(launchTowerState_global.position, towerDirection_global, launchRailLength, earthRotationRate=self.earthModel.rotationRate)
                
        else:
            # Construct default environment from default parameters when no sim definition is passed in
            # Need additional default value here in case a SimDefinition is not passed in (otherwise SimDefinition takes care of default values)
            self.meanWindModel = meanWindModelFactory()
            self.turbulenceModel = None
            self.atmosphericModel = atmosphericModelFactory()
            self.earthModel = earthModelFactory()

            self.launchSiteElevation = float(defaultConfigValues["Environment.LaunchSite.elevation"])
            self.launchSiteLatitude = float(defaultConfigValues["Environment.LaunchSite.latitude"])
            self.launchSiteLongitude = float(defaultConfigValues["Environment.LaunchSite.longitude"])
Esempio n. 6
0
 def test_initSampledRadioSondeModel(self):
     self.simDefinition.setValue("Environment.MeanWindModel",
                                 "SampledRadioSondeData")
     mWM = meanWindModelFactory(self.envReader, silent=True)