Source code for objects.aircraft
from copy import deepcopy
from datetime import datetime
from typing import TypeVar
import logger
import objects.maneuvers as maneuvers
M = TypeVar("M", maneuvers.ChangeHeight,
maneuvers.ChangeSpeed, maneuvers.CenterFold)
[docs]
class Aircraft:
"""
The Aircraft object
Provide methods for simulation aircraft object
Contains only logic methods without visualisation
"""
def __init__(self, name: str, position, speed, acceleration,
radius: float = 1):
self.name: str = name
self.position = deepcopy(position)
self.speed = deepcopy(speed)
self.acceleration = deepcopy(acceleration)
self.effective_scattering_area = 10 # meters^2
self.centerfold_radius: float = 10
self.reflection_radius: float = radius
self.__trajectory: list = [deepcopy(position)]
self.__current_maneuvers: list[M] = []
self.__logger = logger.get_aircraft_logger(__name__)
self.__filename = f"trajectories/'{name}'_{datetime.now()}.txt"
open(self.__filename, "w").close()
def __write_position(self):
with open(self.__filename, "a") as file:
c = self.position
file.write(f"{c.x};{c.y};{c.z}\n")
[docs]
def make_maneuver(self, maneuver: M):
"""
Append maneuver to aircraft
:param maneuver: Maneuver to perform
"""
self.__current_maneuvers.append(maneuver)
self.__current_maneuvers[-1].prepare()
[docs]
def update(self, dt: float = 1.0) -> None:
"""
Update the status of aircraft
:param dt: time delta
"""
for_deletion = []
# TODO: make better this code
for i in range(len(self.__current_maneuvers)):
if self.__current_maneuvers[i].is_finished:
self.__logger.info(f"Finished maneuver "
f"{self.__current_maneuvers[i].__class__}")
for_deletion.append(i)
else:
self.__current_maneuvers[i].do()
for index in for_deletion:
self.__current_maneuvers.pop(index)
# this code
self.position += self.speed * dt + (self.acceleration * dt ** 2) / 2
self.speed += self.acceleration * dt
self.__logger.info(f"{self}")
if self.position.z < 5:
self.speed.z = 0
self.__trajectory.append(deepcopy(self.position))
self.__write_position()
[docs]
def get_trajectory(self) -> list:
"""
Return all trajectory of aircraft
:return: list[glm.vec3]
"""
return deepcopy(self.__trajectory)
def __str__(self):
return (f"Aircraft(name: {self.name}, "
f"position: {str(self.position)}, speed: {str(self.speed)}, "
f"acceleration: {str(self.acceleration)})")
def __repr__(self):
return (f"AerialObject({self.name}, {self.position}, {self.speed}, "
f"{self.acceleration})")