mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/SPATZ.git
synced 2025-06-10 01:55:59 +00:00
Updated sensors and added empty logger for speedup
This commit is contained in:
parent
382cb9aad4
commit
c0ccd93acf
10002
dummy2.csv
10002
dummy2.csv
File diff suppressed because it is too large
Load Diff
@ -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.
|
@ -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')
|
@ -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 *
|
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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])
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -0,0 +1 @@
|
||||
from spatz.simulations.rocketpy import RocketPyCSV
|
@ -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
|
||||
|
@ -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 (°)')
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user