Complete migration of SPATZ to this repository

This commit is contained in:
dario
2023-12-12 19:22:17 +01:00
parent c60629b4c9
commit b4c34e9582
30 changed files with 14482 additions and 34 deletions

View File

@@ -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 *

View File

View 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):

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,2 +1 @@
from pressure import PressureSensor
from ms5611_01ba03 import MS5611_01BA03
from spatz.sensors.pressure.pressure import PressureSensor

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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
View File

@@ -0,0 +1 @@
from spatz.utils.preprocess import preprocess_file

189
spatz/utils/preprocess.py Normal file
View 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)