mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/SPATZ.git
synced 2025-09-28 21:17:33 +00:00
Complete migration of SPATZ to this repository
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
import spatz.connections as connections
|
||||
from connections import *
|
||||
from spatz.connections import *
|
||||
|
||||
import spatz.utils as utils
|
||||
from utils import *
|
||||
from spatz.utils import *
|
||||
|
||||
import spatz.transforms as transforms
|
||||
from spatz.transforms import *
|
||||
|
0
spatz/_tests/test_dataset.py
Normal file
0
spatz/_tests/test_dataset.py
Normal file
@@ -8,7 +8,7 @@ from typing import List
|
||||
from numpy.typing import ArrayLike
|
||||
from scipy.spatial.transform import Rotation
|
||||
|
||||
from logger import Advanceable
|
||||
from spatz.logger import Advanceable
|
||||
|
||||
|
||||
class Phase(Enum):
|
||||
|
@@ -1,6 +1,4 @@
|
||||
from sensor import Sensor
|
||||
from compound import CompoundSensor
|
||||
|
||||
from imu import Accelerometer
|
||||
from imu import Gyroscope
|
||||
from imu import IMU
|
||||
from spatz.sensors.sensor import Sensor
|
||||
from spatz.sensors.imu import Accelerometer, Gyroscope, IMU
|
||||
from spatz.sensors.pressure import PressureSensor
|
||||
from spatz.sensors.compound import CompoundSensor
|
@@ -3,7 +3,7 @@ import numpy as np
|
||||
from typing import List
|
||||
from numpy.typing import ArrayLike
|
||||
|
||||
from sensor import Sensor
|
||||
from spatz.sensors import Sensor
|
||||
from spatz.dataset import Dataset, List
|
||||
from spatz.logger import Logger
|
||||
from spatz.transforms import Transform
|
||||
|
@@ -1,2 +1,3 @@
|
||||
from accelerometer import Accelerometer
|
||||
from gyroscope import Gyroscope
|
||||
from spatz.sensors.imu.accelerometer import Accelerometer
|
||||
from spatz.sensors.imu.gyroscope import Gyroscope
|
||||
from spatz.sensors.imu.imu import IMU
|
@@ -1,7 +1,8 @@
|
||||
from typing import List
|
||||
from spatz.dataset import Dataset, List
|
||||
from spatz.logger import Logger
|
||||
from spatz.sensors import CompoundSensor, Accelerometer, Gyroscope
|
||||
from spatz.sensors.compound import CompoundSensor
|
||||
from spatz.sensors.imu import Accelerometer, Gyroscope
|
||||
from spatz.sensors.sensor import Sensor
|
||||
from spatz.transforms import Transform
|
||||
|
||||
|
@@ -1,2 +1 @@
|
||||
from pressure import PressureSensor
|
||||
from ms5611_01ba03 import MS5611_01BA03
|
||||
from spatz.sensors.pressure.pressure import PressureSensor
|
@@ -1,8 +1,7 @@
|
||||
from typing import List, AnyStr
|
||||
from numpy.typing import ArrayLike
|
||||
|
||||
from pressure import PressureSensor
|
||||
|
||||
from spatz.sensors import PressureSensor
|
||||
from spatz.dataset import Dataset, Phase
|
||||
from spatz.logger import Logger
|
||||
from spatz.transforms import GaussianNoise, Transform
|
||||
|
@@ -51,14 +51,4 @@ class Sensor:
|
||||
for i in range(len(out)):
|
||||
self._log(f'out_{i}', out[i])
|
||||
|
||||
return out
|
||||
|
||||
|
||||
class CompoundSensor(Sensor):
|
||||
def __init__(self, sensors: List[Sensor]):
|
||||
super(CompoundSensor, self).__init__(None)
|
||||
|
||||
self.__sensors = sensors
|
||||
|
||||
def _get_data(self) -> ArrayLike:
|
||||
return np.stack([sensor() for sensor in self.__sensors])
|
||||
return out
|
@@ -5,9 +5,9 @@ from tqdm import tqdm
|
||||
from spatz.dataset import Dataset
|
||||
from spatz.logger import Logger
|
||||
from spatz.sensors import Sensor
|
||||
from dataset import Dataset
|
||||
from logger import Logger
|
||||
from sensor import Sensor
|
||||
from spatz.dataset import Dataset
|
||||
from spatz.logger import Logger
|
||||
from spatz.sensors import Sensor
|
||||
|
||||
|
||||
class UniformTimeSteps:
|
||||
|
@@ -1,3 +1,3 @@
|
||||
from failures import *
|
||||
from noise import *
|
||||
from transform import *
|
||||
from spatz.transforms.transform import Transform
|
||||
from spatz.transforms.noise import GaussianNoise
|
||||
from spatz.transforms.failures import Downtime
|
1
spatz/utils/__init__.py
Normal file
1
spatz/utils/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from spatz.utils.preprocess import preprocess_file
|
189
spatz/utils/preprocess.py
Normal file
189
spatz/utils/preprocess.py
Normal file
@@ -0,0 +1,189 @@
|
||||
import os
|
||||
import math
|
||||
import pathlib
|
||||
import pandas as pd
|
||||
|
||||
from numpy import log10
|
||||
|
||||
|
||||
__all__ = [
|
||||
'preprocess_file'
|
||||
]
|
||||
|
||||
|
||||
def filter_zero_steps(df: pd.DataFrame) -> pd.DataFrame:
|
||||
"""Filter all rows with time steps of length 0.
|
||||
|
||||
Args:
|
||||
df (pd.DataFrame): The dataframe to preprocess.
|
||||
|
||||
Returns:
|
||||
pd.DataFrame: The preprocessed dataframe.
|
||||
"""
|
||||
dts = df['Time'].diff().fillna(1)
|
||||
df['dts'] = dts
|
||||
|
||||
return df[dts != 0]
|
||||
|
||||
|
||||
def preprocess_velocity(df: pd.DataFrame) -> pd.DataFrame:
|
||||
"""Transforms the velocities from km/s to m/s.
|
||||
|
||||
Args:
|
||||
df (pd.DataFrame): The DataFrame to preprocess.
|
||||
|
||||
Returns:
|
||||
pd.DataFrame: The modified DataFrame.
|
||||
"""
|
||||
for axis in ['x', 'y', 'z']:
|
||||
df['v{}_FL'.format(axis)] *= 1e3
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def preprocess_position(df: pd.DataFrame) -> pd.DataFrame:
|
||||
for axis in ['x', 'y', 'z']:
|
||||
df['{}_FL'.format(axis)] *= 1e3
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def compute_acceleration(df: pd.DataFrame) -> pd.DataFrame:
|
||||
"""
|
||||
|
||||
Args:
|
||||
df (pd.DataFrame): _description_
|
||||
|
||||
Returns:
|
||||
pd.DataFrame: _description_
|
||||
"""
|
||||
# Time deltas.
|
||||
dts = df['Time'].diff().fillna(0)
|
||||
|
||||
for axis in ['x', 'y', 'z']:
|
||||
# Raw differences between velocity across time steps.
|
||||
das = df['v{}_FL'.format(axis)].diff().fillna(0)
|
||||
|
||||
# Velocity differences divided by time deltas.
|
||||
df['a{}_FL'.format(axis)] = das.divide(dts).fillna(0)
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def preprocess_rotations(df: pd.DataFrame) -> pd.DataFrame:
|
||||
df['pitch_l'] *= math.pi / 180
|
||||
df['yaw_l'] *= math.pi / 180
|
||||
df['roll_l'] *= math.pi / 180
|
||||
df['declination'] *= math.pi / 180
|
||||
df['longitude'] *= math.pi / 180
|
||||
df['latitude'] *= math.pi / 180
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def compute_omegas(df: pd.DataFrame) -> pd.DataFrame:
|
||||
dts = df['Time'].diff().fillna(0)
|
||||
|
||||
for axis in ['X', 'Y', 'Z']:
|
||||
# Raw differences between omegas across time steps.
|
||||
dos = df['OMEGA_{}'.format(axis)].diff().fillna(0)
|
||||
|
||||
# Omega differences divided by time deltas.
|
||||
df['omega_{}'.format(axis)] = dos.divide(dts).fillna(0)
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def preprocess_file(path):
|
||||
"""_summary_
|
||||
|
||||
Args:
|
||||
path (_type_): _description_
|
||||
|
||||
Returns:
|
||||
_type_: _description_
|
||||
"""
|
||||
df = pd.read_csv(path, delimiter="\t" , encoding='latin')
|
||||
df = df.drop(0, axis=0)
|
||||
df = df.astype(float)
|
||||
|
||||
df['Phase'] = df['Phase'].replace({
|
||||
1: 'onpad', # rocket waiting on pad
|
||||
2: 'loi', # rocket liftoff
|
||||
3: 'rci', # rail clearance
|
||||
4: 'eci', # engine cutoff
|
||||
5: 'adi' # apogee and drogue
|
||||
})
|
||||
|
||||
# Select all the relevant columns
|
||||
df = df[[
|
||||
'Time',
|
||||
'Phase',
|
||||
'declination',
|
||||
'longitude',
|
||||
'latitude',
|
||||
'altitude',
|
||||
'mach',
|
||||
'sonic_velocity',
|
||||
'x_FL',
|
||||
'y_FL',
|
||||
'z_FL',
|
||||
'vx_FL',
|
||||
'vy_FL',
|
||||
'vz_FL',
|
||||
'OMEGA_X',
|
||||
'OMEGA_Y',
|
||||
'OMEGA_Z',
|
||||
'pitch_l',
|
||||
'yaw_l',
|
||||
'roll_l',
|
||||
'flightpath_speed',
|
||||
'acc_total',
|
||||
'atmos_pressure',
|
||||
'atmos_temperature',
|
||||
'drag',
|
||||
'mass_total'
|
||||
]]
|
||||
|
||||
df = filter_zero_steps(df)
|
||||
df = preprocess_position(df)
|
||||
df = preprocess_velocity(df)
|
||||
df = compute_acceleration(df)
|
||||
df = compute_omegas(df)
|
||||
df = preprocess_rotations(df)
|
||||
|
||||
renaming = {
|
||||
'sonic_velocity': 'speedofsound',
|
||||
'Time': 'time',
|
||||
'Phase': 'phase',
|
||||
'flightpath_speed': 'velocity',
|
||||
'acc_total': 'acceleration',
|
||||
'atmos_pressure': 'pressure',
|
||||
'atmos_temperature': 'temperature',
|
||||
'x_FL': 'x',
|
||||
'y_FL': 'y',
|
||||
'z_FL': 'z',
|
||||
'vx_FL': 'vx',
|
||||
'vy_FL': 'vy',
|
||||
'vz_FL': 'vz',
|
||||
'ax_FL': 'ax',
|
||||
'ay_FL': 'ay',
|
||||
'az_FL': 'az'
|
||||
}
|
||||
|
||||
df = df.rename(renaming, axis=1)
|
||||
|
||||
return df
|
||||
|
||||
|
||||
def to_traj_file(path, name, df: pd.DataFrame):
|
||||
with open(path, 'w') as f:
|
||||
f.write(f"#epsg 0\n#name { name }\n#fields t,px,py,pz,ex,ey,ez,vx,vy,vz\n")
|
||||
|
||||
df.to_csv(path, columns=['time', 'x', 'y', 'z', 'pitch', 'yaw', 'roll', 'vx_global', 'vy_global', 'vz_global'], header=False, index=False, mode='a')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
for file in os.listdir('data/simulations/'):
|
||||
df = preprocess_file('data/simulations/' + file)
|
||||
|
Reference in New Issue
Block a user