Updated sensors and added empty logger for speedup

This commit is contained in:
dario 2024-06-13 22:16:22 +02:00
parent 382cb9aad4
commit c0ccd93acf
14 changed files with 5080 additions and 5035 deletions

10002
dummy2.csv

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
Time (s), X (m), Y (m), Z (m), Vx (m/s), Vy (m/s), Vz (m/s), Ax (m/s²), Ay (m/s²), Az (m/s²), e0, e1, e2, e3, ω1 (rad/s), ω2 (rad/s), ω3 (rad/s), α1 (rad/s²), α2 (rad/s²), α3 (rad/s²), Pressure (Pa), Latitude (°), Longitude (°)
Time (s), X (m), Y (m), Z (m), Vx (m/s), Vy (m/s), Vz (m/s), Ax (m/s²), Ay (m/s²), Az (m/s²), e0, e1, e2, e3, ω1 (rad/s), ω2 (rad/s), ω3 (rad/s), α1 (rad/s²), α2 (rad/s²), α3 (rad/s²), Pressure (Pa), Longitude (°), Latitude (°)
0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,-0.706864,0.018510,0.018510,-0.706864,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,101325.000000,55.910000,3.370000
0.000991,-0.000000,-0.000000,0.000002,-0.000092,-0.000000,0.001753,-0.092689,-0.000000,1.768612,-0.706864,0.018510,0.018510,-0.706864,-0.000000,-0.000000,-0.000000,-0.000000,-0.000000,0.000000,101324.999979,55.910000,3.370000
0.001335,-0.000000,-0.000000,0.000003,-0.000197,-0.000000,0.003751,-0.304004,-0.000000,5.800733,-0.706864,0.018510,0.018510,-0.706864,0.000000,-0.000000,0.000000,0.000000,0.000000,-0.000000,101324.999964,55.910000,3.370000

Can't render this file because it is too large.

View File

@ -1,12 +1,16 @@
import cProfile
import numpy as np
import tqdm
import math
import matplotlib.pyplot as plt
from spatz.simulation import Simulation
from spatz.simulations.rocketpy import RocketPyCSV
from spatz.sensors.pressure.ms5611 import MS5611
from spatz.sensors.imu.wsen_isds import WSEN_ISDS_ACC, WSEN_ISDS_GYRO
from spatz.sensors.imu.h3lis100dl import H3LIS100DL
from spatz.sensors.gps.erinome1 import Erinome_I
from spatz.observer import Observer
simulation = Simulation().load(RocketPyCSV('nominal_wind.csv'))
@ -15,13 +19,20 @@ barometer = simulation.add_sensor(MS5611)
# Orientation matrix of the WSEN-ISDS IMU on the rocket.
orientation = np.array([
[ 1, 0, 0],
[ 0, 0, -1],
[ 0, -1, 0]
[ 0, 1, 0],
[ 0, 0, 1],
[-1, 0, 0]
])
accelerometer = simulation.add_sensor(WSEN_ISDS_ACC, orientation=orientation)
gyroscope = simulation.add_sensor(WSEN_ISDS_GYRO)
orientation = np.array([
[0, 1, 0],
[0, 0, -1],
[1, 0, 0]
])
high_g = simulation.add_sensor(H3LIS100DL)
erinome = simulation.add_sensor(Erinome_I)
for i in tqdm.tqdm(range(5000)):
@ -30,7 +41,7 @@ for i in tqdm.tqdm(range(5000)):
acc = accelerometer()
omegas = gyroscope()
g = high_g()
gps = erinome()
df = simulation.get_logger().get_dataframe()
df.to_csv('dummy2.csv')

View File

@ -8,4 +8,5 @@ import spatz.transforms as transforms
from spatz.transforms import *
from spatz.dataset import *
from spatz.simulation import *
from spatz.simulation import *
from spatz.simulations import *

View File

@ -1,6 +1,7 @@
import numpy as np
import pandas as pd
from abc import abstractmethod
from typing import Any, Tuple, List
from numpy.typing import ArrayLike
@ -10,6 +11,35 @@ from spatz.simulations.advanceable import Advanceable
class Logger(Advanceable):
def __init__(self) -> None:
super().__init__()
@abstractmethod
def write(self, attrib: str | List[str], value: Any | List[Any] | List[ArrayLike], domain: str = 'all'):
pass
class EmptyLogger(Logger):
def __init__(self) -> None:
super().__init__()
self.__idx = -1
def _on_step(self, _: float):
pass
def _on_reset(self):
pass
def write(self, attrib: str | List[str], value: Any | List[Any] | List[ArrayLike], domain: str = 'all'):
pass
def get_dataframe(self) -> pd.DataFrame:
pass
class CSVLogger(Logger):
def __init__(self) -> None:
super().__init__()
self.__idx = -1
def _on_step(self, _: float):

View File

@ -3,12 +3,13 @@ from typing import List
from numpy.typing import ArrayLike
from spatz.sensors.gps import GPS
from spatz.dataset import ArrayLike, Dataset
from spatz.simulations.data_source import DataSource
from spatz.logger import ArrayLike, Logger
from spatz.transforms import Transform
class Erinome_I(GPS):
def __init__(self, dataset: Dataset, logger: Logger, transforms: List[Transform] = []):
def __init__(self, dataset: DataSource, logger: Logger, transforms: List[Transform] = []):
super().__init__(dataset, logger, transforms)
def _get_name(self):

View File

@ -8,6 +8,7 @@ from numpy.typing import ArrayLike
from pandas import NA
from spatz.dataset import ArrayLike, Dataset
from spatz.simulations.data_source import DataSource
from spatz.logger import ArrayLike, Logger
from spatz.sensors import Sensor
from spatz.transforms import Transform
@ -17,25 +18,24 @@ from spatz.transforms import Transform
class GPS(Sensor):
def __init__(self, dataset: Dataset, logger: Logger, transforms: List[Transform] = []):
def __init__(self, dataset: DataSource, logger: Logger, transforms: List[Transform] = []):
"""GPS Module which provides the following information:
- Longitude (in °)
- Latitiude (in °)
- Altitude (in m)
- Lock (1 or 0)
"""
super().__init__(dataset, logger, transforms)
def _get_data(self) -> ArrayLike:
vel = self._dataset.get_total_velocity()
long = self._dataset.get_longitude()
lat = self._dataset.get_latitude()
alt = self._dataset.get_altitude()
lock = 1
# TODO: At which speed do we assume that GPS becomes unreliable?
if vel / self._dataset.get_speed_of_sound() > 1:
return np.array([0, 0, 0])
x = self._dataset.fetch_values(['latitude', 'longitude', 'altitude'])
x = self._sensor_specific_effects(x)
self._log('longitude', long)
self._log('latitude', lat)
self._log('altitude', alt)
self._log('lock', lock)
# Convert to degrees.
x *= 180 / math.pi
return x
return np.array([long, lat, alt, lock])

View File

@ -27,6 +27,11 @@ class WSEN_ISDS_ACC(Accelerometer):
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
t = self._dataset.get_time()
g = 9.81
# Convert to milli-g.
x = x / g * 1000
# Apply noise to the true values.
y = self.__noise(t, x)
noise = y - x
@ -37,8 +42,7 @@ class WSEN_ISDS_ACC(Accelerometer):
self._logger.write('acc_z_noise', noise[2], self._get_name())
# The WSEN-ISDS accelerometer only measures acceleration between -16g and 16g.
g = 9.81
y = np.clip(y, -16*g, +16*g)
y = np.clip(y, -16000, +16000)
return y
@ -51,8 +55,8 @@ class WSEN_ISDS_GYRO(Gyroscope):
return 'WSEN_ISDS_GYRO'
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
# Convert to degrees per second.
x = (x / np.pi) * 180
# Convert to milli-degrees per second.
x = (x / np.pi) * 180 * 1000
# TODO: Noise model.

View File

@ -50,7 +50,7 @@ class Sensor:
def _get_data(self) -> ArrayLike | float:
raise NotImplementedError()
def get_init_data() -> ArrayLike:
def get_init_data(self) -> ArrayLike:
pass
def __call__(self) -> ArrayLike | float:

View File

@ -3,12 +3,13 @@ from typing import List, AnyStr
from spatz.transforms.noise import GaussianNoise
from spatz.dataset import Dataset
from spatz.simulations.data_source import DataSource
from spatz.sensors import TemperatureSensor
from spatz.transforms import Transform
class MS5611Temperature(TemperatureSensor):
def __init__(self, dataset: Dataset, transforms: List[Transform] = []):
def __init__(self, dataset: DataSource, transforms: List[Transform] = []):
super().__init__(dataset, transforms)
self.__noise = GaussianNoise(0, 0.5)

View File

@ -8,7 +8,7 @@ from spatz.dataset import Dataset
from spatz.logger import Logger
from spatz.sensors import Sensor
from spatz.dataset import Dataset, Phase
from spatz.logger import Logger
from spatz.logger import Logger, EmptyLogger
from spatz.sensors import Sensor
from spatz.observer import Observer
@ -84,7 +84,7 @@ class Simulation(Advanceable):
def load(self, source: DataSource):
self.__data_source = source
self.__logger = Logger()
self.__logger = EmptyLogger()
for sensor in self.__sensors:
sensor.set_dataset(self.__data_source)

View File

@ -0,0 +1 @@
from spatz.simulations.rocketpy import RocketPyCSV

View File

@ -20,6 +20,9 @@ class DataSource(Advanceable):
speed = np.linalg.norm(self.get_velocity('global'))
return speed / self.get_speed_of_sound()
def get_temperature(self) -> float:
return Atmosphere(self.get_altitude()).temperature
@abstractmethod
def get_length(self) -> float:
@ -57,10 +60,6 @@ class DataSource(Advanceable):
def get_static_pressure(self) -> float:
pass
@abstractmethod
def get_temperature(self) -> float:
pass
@abstractmethod
def get_longitude(self) -> float:
pass

View File

@ -72,9 +72,6 @@ class RocketPyCSV(CSVSource):
def get_static_pressure(self) -> float:
return self.fetch_value(' Pressure (Pa)')
def get_temperature(self) -> float:
raise NotImplementedError()
def get_longitude(self) -> float:
return self.fetch_value(' Longitude (°)')