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)
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))
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))
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"])
def test_initSampledRadioSondeModel(self): self.simDefinition.setValue("Environment.MeanWindModel", "SampledRadioSondeData") mWM = meanWindModelFactory(self.envReader, silent=True)