def makePlane(line): # Eliminiate white space and separate values line = line.strip().split() # Create instance of Airplane with values thisPlane = Airplane(line[0], line[1]) return thisPlane
def SpawnAirplanes(name, A1, A2, pMut=1.0/25.0): Genome = (name,) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].Engine,) else: Genome += (random.choice(Engines),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].Airfoil,) else: Genome += (random.choice(Airfoils),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].Chord,) else: Genome += (random.uniform(*GeoLims['Chord']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].Span,) else: Genome += (random.uniform(*GeoLims['Span']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].FlapX,) else: Genome += (random.uniform(*GeoLims['FlapX']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].FlapAngle,) else: Genome += (random.uniform(*GeoLims['FlapAngle']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].FuseBoxLen,) else: Genome += (random.uniform(*GeoLims['FuseBoxLen']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].FusePyramidLen,) else: Genome += (random.uniform(*GeoLims['FusePyramidLen']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].FuseWidth,) else: Genome += (random.uniform(*GeoLims['FuseWidth']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].FuseHeight,) else: Genome += (random.uniform(*GeoLims['FuseHeight']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].TailFoil,) else: Genome += (random.choice(TailFoils),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].HTailChord,) else: Genome += (random.uniform(*GeoLims['HTailChord']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].VTailChord,) else: Genome += (random.uniform(*GeoLims['VTailChord']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].HTailSpan,) else: Genome += (random.uniform(*GeoLims['HTailSpan']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].VTailSpan,) else: Genome += (random.uniform(*GeoLims['VTailSpan']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].MGTW,) else: Genome += (random.uniform(*GeoLims['MGTW']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].Sheet,) else: Genome += (random.choice(Sheets),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].Payload,) else: Genome += (random.uniform(*GeoLims['Payload']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].CruiseAlt,) else: Genome += (random.uniform(*GeoLims['CruiseAlt']),) if random.random() > pMut: Genome += (random.choice([A1, A2])[1].ExtrasWeight,) else: Genome += (random.uniform(*GeoLims['ExtrasWeight']),) A = Airplane.Airplane(*Genome) return (FitnessFunction(A), A)
def MakeRandomAirplane(name): A = Airplane.Airplane(name,\ random.choice(Engines),\ random.choice(Airfoils),\ random.uniform(*GeoLims['Chord']),\ random.uniform(*GeoLims['Span']),\ random.uniform(*GeoLims['FlapX']),\ random.uniform(*GeoLims['FlapAngle']),\ random.uniform(*GeoLims['FuseBoxLen']),\ random.uniform(*GeoLims['FusePyramidLen']),\ random.uniform(*GeoLims['FuseWidth']),\ random.uniform(*GeoLims['FuseHeight']),\ random.choice(TailFoils),\ random.uniform(*GeoLims['HTailChord']),\ random.uniform(*GeoLims['VTailChord']),\ random.uniform(*GeoLims['HTailSpan']),\ random.uniform(*GeoLims['VTailSpan']),\ random.uniform(*GeoLims['MGTW']),\ random.choice(Sheets),\ random.uniform(*GeoLims['Payload']),\ random.uniform(*GeoLims['CruiseAlt']),\ random.uniform(*GeoLims['ExtrasWeight'])) return (FitnessFunction(A), A)
def start(airplane_config, snd_bk_snsrs=True): global fms_thread, craft, magnetic_declination_db, send_back_sensors send_back_sensors = snd_bk_snsrs rcfg = open(airplane_config, 'r') rlines = rcfg.readlines() rcfg.close() if not rlines: raise RuntimeError('Empty config file: %s' % sys.argv[1]) craft = Airplane.Airplane() craft.initialize(rlines) pitchdb = fix.db.get_item(Globals.FD_PITCH_KEY, True) pitchdb.min = -90 pitchdb.max = 90 rolldb = fix.db.get_item(Globals.FD_ROLL_KEY, True) rolldb.min = -90 rolldb.max = 90 altitude_source_db = fix.db.get_item(Globals.ALTITUDE_SOURCE_KEY, True) altitude_source_db.dtype = 'int' altitude_source = altitude_source_db.value altitude_source_db.valueChanged[int].connect(ALTITUDE_SOURCE_changed) selected_altitude_db = fix.db.get_item(Globals.SELECTED_ALTITUDE_KEY, True) selected_altitude_db.dtype = 'int' selected_altitude_db.min = -1000 selected_altitude_db.max = 60000 selected_altitude_db.value = 10000 selected_altitude = selected_altitude_db.value selected_altitude_db.valueChanged[int].connect(SELECTED_ALTITUDE_changed) selected_airspeed_db = fix.db.get_item(Globals.SELECTED_AIRSPEED_KEY, True) selected_airspeed_db.dtype = 'int' selected_airspeed_db.min = 10 selected_airspeed_db.max = 1000 selected_airspeed_db.value = 120 selected_airspeed = selected_airspeed_db.value selected_airspeed_db.valueChanged[int].connect(SELECTED_AIRSPEED_changed) selected_heading_db = fix.db.get_item(Globals.SELECTED_HEADING_KEY, True) selected_heading_db.dtype = 'int' selected_heading_db.min = 0 selected_heading_db.max = 359 selected_heading = selected_heading_db.value selected_heading_db.valueChanged[int].connect(SELECTED_HEADING_changed) selected_climb_rate_db = fix.db.get_item(Globals.SELECTED_CLIMB_RATE_KEY, True) selected_climb_rate_db.dtype = 'int' selected_climb_rate_db.min = -10000 selected_climb_rate_db.max = 10000 selected_climb_rate_db.value = 500 selected_climb_rate = selected_climb_rate_db.value selected_climb_rate_db.valueChanged[int].connect( SELECTED_CLIMB_RATE_changed) magnetic_declination_db = fix.db.get_item(Globals.MAGNETIC_DECLINATION_KEY) ap_on_db = fix.db.get_item(Globals.AP_ON_KEY, True) ap_on_db.dtype = 'bool' fd_on_db = fix.db.get_item(Globals.FD_ON_KEY, True) fd_on_db.dtype = 'bool' ap_on_db.valueChanged[bool].connect(AP_ON_changed) hnav_mode_db = fix.db.get_item(Globals.HNAV_MODE_KEY, True) hnav_mode_db.dtype = 'int' hnav_mode = hnav_mode_db.value hnav_mode_db.valueChanged[int].connect(HNAV_MODE_changed) vnav_mode_db = fix.db.get_item(Globals.VNAV_MODE_KEY, True) vnav_mode_db.dtype = 'int' vnav_mode = vnav_mode_db.value vnav_mode_db.valueChanged[int].connect(VNAV_MODE_changed) start_strategy_db = fix.db.get_item(Globals.START_STRATEGY_KEY, True) start_strategy_db.dtype = 'int' start_strategy = start_strategy_db.value start_strategy_db.valueChanged[int].connect(START_STRATEGY_changed) selected_turn_rate_db = fix.db.get_item(Globals.SELECTED_TURN_RATE_KEY, True) selected_turn_rate = selected_turn_rate_db.value selected_pitch_db = fix.db.get_item(Globals.SELECTED_PITCH_KEY, True) selected_pitch_db.dtype = 'int' selected_pitch_db.min = 0 selected_pitch_db.max = 40 selected_pitch_db.value = 5 selected_pitch = selected_pitch_db.value selected_pitch_db.valueChanged[int].connect(SELECTED_PITCH_changed) selected_glideslope_db = fix.db.get_item(Globals.SELECTED_GLIDESLOPE_KEY, True) selected_glideslope = selected_glideslope_db.value selected_waypoint_db = fix.db.get_item(Globals.SELECTED_WAYPOINT_KEY, True) selected_waypoint_db.dtype = 'int' selected_waypoint_db.min = 0 selected_waypoint_db.max = 256 selected_waypoint_db.value = 0 selected_waypoint_db.valueChanged[int].connect(SELECTED_WAYPOINT_changed) CreateWaypoints() waypoints, WP_altitudes = ReadWaypoints() ConnectWaypoints() craft.initialize_input(selected_altitude, selected_airspeed, selected_heading - magnetic_declination_db.value, selected_climb_rate, hnav_mode, vnav_mode, altitude_source, start_strategy, waypoints, WP_altitudes, selected_turn_rate, selected_pitch, selected_glideslope) fms_thread = threading.Thread(target=thread_run) fms_thread.start()
class FlightSimulator(): def __init__(self, width, height): self.width = width self.height = height self.delay = 30 self.wX = 0 self.wY = 0 self.wZ = 0 self.zoom = 1 self.deltaZoom = 0.1 self.previousMouseX = 0 self.previousMouseY = 0 self.cameraDistance = 25 self.cameraHeight = 4 self.cameraX = 0 + self.cameraDistance self.cameraY = 4 self.cameraZ = 0 self.cameraXRot = 0 self.cameraZRot = 0 self.cameraRotSpeed = 1.5 self.debug = False self.flyingSpeed = 1 glutInit(sys.argv) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE) glutInitWindowSize(self.width, self.height) self.window = glutCreateWindow("Flight Simulator") glutDisplayFunc(self.draw) self.initGL() glutTimerFunc(self.delay, self.timer, self.delay) glutMouseFunc(self.mouse) glutSpecialFunc(self.specialKeys) glutMotionFunc(self.mouseDrag) glutKeyboardFunc(self.keys) self.a = 0 def initGL(self): # self.loadTextures() # glEnable(GL_TEXTURE_2D) # glShadeModel(GL_FLAT) mat_ambient = (0.6, 0.0, 0.0, 1.0) mat_diffuse = (0, 0.0, 1.0, 1.0) mat_specular = (1.0, 1.0, 1.0, 1.0) mat_shininess = (10, ) glClearColor(69 / 255, 160 / 255, 200 / 255, 1.0) glShadeModel(GL_SMOOTH) glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient) glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse) glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular) glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess) glEnable(GL_LIGHTING) self.light_position = (0, 10, 0, .4) glEnable(GL_LIGHT0) glClearDepth(1.0) glMatrixMode(GL_PROJECTION) gluPerspective(45, self.width / self.height, 0.1, 100000.0) # glMatrixMode(GL_MODELVIEW) glEnable(GL_DEPTH_TEST) glEnable(GL_MULTISAMPLE) self.loadObjects() def loadObjects(self): self.airplane = Airplane() self.terrain = Terrain(self.width, self.height) def loadTextures(self): self.textures = glGenTextures(2) ################################################################################ glBindTexture(GL_TEXTURE_2D, self.textures[0]) reader = png.Reader(filename='textures/sky.png') w, h, pixels, metadata = reader.read_flat() if (metadata['alpha']): modo = GL_RGBA else: modo = GL_RGB glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glTexImage2D(GL_TEXTURE_2D, 0, modo, w, h, 0, modo, GL_UNSIGNED_BYTE, pixels.tolist()) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) ################################################################################ glBindTexture(GL_TEXTURE_2D, self.textures[1]) reader = png.Reader(filename='textures/PicknGO.png') w, h, pixels, metadata = reader.read_flat() if (metadata['alpha']): modo = GL_RGBA else: modo = GL_RGB glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glTexImage2D(GL_TEXTURE_2D, 0, modo, w, h, 0, modo, GL_UNSIGNED_BYTE, pixels.tolist()) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) def timer(self, i): glutPostRedisplay() value = i + self.delay self.airplane.timer(self.delay, value) self.terrain.timer(self.delay, value) glutTimerFunc(self.delay, self.timer, value) def run(self): glutMainLoop() def mouse(self, btn, state, mouseX, mouseY): # btn -> 0 == botao esquerdo; 1 == botao rolagem; 2 == botao direito; 3 == rolagem para cima; 4 == rolagem para baixo if btn == 3: # self.zoom -= self.deltaZoom self.zoomCamera(0.8) if btn == 4: # self.zoom += self.deltaZoom self.zoomCamera(1.1) if btn == 0 and state == 0: self.previousMouseX = mouseX self.previousMouseY = mouseY self.isDragging = True if btn == 0 and state == 1: self.isDragging = False # if btn == 2 and state == 0: # pause_rotation = not pause_rotation print(mouseX, mouseY) def mouseDrag(self, x, y): if self.isDragging: self.terrain.mouse(x, y, self.previousMouseX, self.previousMouseY) # self.rotateCameraHorizontal((x-self.previousMouseX)) # self.rotateCameraVertical((y-self.previousMouseY)) self.previousMouseX = x self.previousMouseY = y def specialKeys(self, key, x, y): # self.airplane.command(key) self.terrain.command(key) glutPostRedisplay() def keys(self, key, x, y): # self.airplane.command(key) self.terrain.command(key) if key == b'p': self.debug != self.debug if key == b'r': del self.airplane del self.terrain self.loadObjects() if key == b'i': self.rotateCameraHorizontal(self.cameraRotSpeed) # self.cameraXRot += 0.1 # self.cameraZRot += 0.1 if key == b't': self.a += 1 if key == b'o': self.rotateCameraHorizontal(-self.cameraRotSpeed) # self.cameraXRot -= 0.1 # self.cameraZRot -= 0.1 glutPostRedisplay() def calculateCameraPos(self): # self.cameraX = self.airplane.x # self.cameraY = self.airplane.y + self.cameraHeight # # (+self.airplane.zRot * .2) # self.cameraZ = (self.airplane.z + self.zoom + self.cameraDistance) * \ # self.airplane.zRot # self.cameraX = self.cameraX + self.zoom # self.cameraY = 20 + self.zoom # self.cameraZ = (-20 - self.zoom) self.camLookX = 0 self.camLookY = 0 self.camLookZ = 0 pass def rotateCameraHorizontal(self, rad): self.cameraX = self.cameraX * \ math.cos(Utils.radToDegrees(rad)) - self.cameraZ * \ math.sin(Utils.radToDegrees(rad)) self.cameraZ = self.cameraX * \ math.sin(Utils.radToDegrees(rad)) + self.cameraZ * \ math.cos(Utils.radToDegrees(rad)) def rotateCameraVertical(self, rad): normalizedPosition = Utils.normalize( (self.cameraX, self.cameraY, self.cameraZ)) if normalizedPosition[1] >= 0.98 and rad > 0: return if normalizedPosition[1] <= -0.98 and rad < 0: return proj = Utils.project_onto_plane(normalizedPosition, (0, 1, 0)) proj = Utils.normalize(proj) perpendicular = Utils.perpendicular_vector(proj) rotMat = Utils.rotation_matrix(perpendicular, Utils.radToDegrees(rad)) self.cameraX, self.cameraY, self.cameraZ = Utils.rotate( rotMat, [self.cameraX, self.cameraY, self.cameraZ]) def zoomCamera(self, delta): # self.zoom += delta self.cameraX *= delta self.cameraY *= delta self.cameraZ *= delta def draw(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) self.calculateCameraPos() # print(self.cameraXRot) # print(self.cameraZRot) glPushMatrix() glLightfv(GL_LIGHT0, GL_POSITION, self.light_position) gluLookAt(self.cameraX, self.cameraY, self.cameraZ, self.camLookX, self.camLookY, self.camLookZ, 0, 1, 0) self.airplane.updatePos() self.airplane.draw() self.terrain.draw() # glPushMatrix() # glTranslatef(0, 0, 6) # glRotatef(self.a, 1, 0, 0) # Cubo() # glPopMatrix() # ESFERA NO CENTRO DO MUNDO # glutWireSphere(2, 30, 30) # CUBO NA DIREITA DO CENTRO # glTranslatef(0, 0, 7) # glutSolidCube(4) if self.debug: # print('Zoom', self.zoom) # print('Delta Zoom', self.deltaZoom) glTranslatef(0, 0, 0) Materials.GeneralMaterial((1, 1, 1, 1)) glutSolidSphere(.1, 30, 30) # X Materials.GeneralMaterial((1, 0, 0, 1)) glLineWidth(3.0) glBegin(GL_LINES) glVertex3f(0, 0, 0) glVertex3f(10, 0, 0) glEnd() # Y Materials.GeneralMaterial((0, 1, 0, 1)) glLineWidth(3.0) glBegin(GL_LINES) glVertex3f(0, 0, 0) glVertex3f(0, 10, 0) glEnd() # Z Materials.GeneralMaterial((0, 0, 1, 1)) glLineWidth(3.0) glBegin(GL_LINES) glVertex3f(0, 0, 0) glVertex3f(0, 0, 10) glEnd() glPopMatrix() glutSwapBuffers()
def loadObjects(self): self.airplane = Airplane() self.terrain = Terrain(self.width, self.height)
except: pass rootlogger.addHandler( logging.FileHandler(os.path.join(Globals.LoggingPrefix, 'info.log'))) console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.DEBUG) rootlogger.addHandler(console_handler) rootlogger.log(99, log_start) rcfg = open(args.airplane_config, 'r') rlines = rcfg.readlines() rcfg.close() if not rlines: raise RuntimeError('Empty config file: %s' % sys.argv[1]) craft = Airplane.Airplane() craft.initialize(rlines, args.altitude, args.barometer, (args.wind_heading, args.wind_speed)) if args.magnetic_variation != None: craft.KnownMagneticVariation(args.magnetic_variation) if args.altitude != None: craft.KnownAltitude(args.altitude) ffp = open(args.flight_plan, 'r') craft.FlightPlan = ffp.readlines() ffp.close() if args.way_points: wps = open(args.way_points, 'r') way_points = wps.readlines() wps.close()