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.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.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
|
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 cProfile
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import tqdm
|
import tqdm
|
||||||
|
import math
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
from spatz.simulation import Simulation
|
from spatz.simulation import Simulation
|
||||||
from spatz.simulations.rocketpy import RocketPyCSV
|
from spatz.simulations.rocketpy import RocketPyCSV
|
||||||
from spatz.sensors.pressure.ms5611 import MS5611
|
from spatz.sensors.pressure.ms5611 import MS5611
|
||||||
from spatz.sensors.imu.wsen_isds import WSEN_ISDS_ACC, WSEN_ISDS_GYRO
|
from spatz.sensors.imu.wsen_isds import WSEN_ISDS_ACC, WSEN_ISDS_GYRO
|
||||||
from spatz.sensors.imu.h3lis100dl import H3LIS100DL
|
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'))
|
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 matrix of the WSEN-ISDS IMU on the rocket.
|
||||||
orientation = np.array([
|
orientation = np.array([
|
||||||
[ 1, 0, 0],
|
[ 0, 1, 0],
|
||||||
[ 0, 0, -1],
|
[ 0, 0, 1],
|
||||||
[ 0, -1, 0]
|
[-1, 0, 0]
|
||||||
])
|
])
|
||||||
accelerometer = simulation.add_sensor(WSEN_ISDS_ACC, orientation=orientation)
|
accelerometer = simulation.add_sensor(WSEN_ISDS_ACC, orientation=orientation)
|
||||||
gyroscope = simulation.add_sensor(WSEN_ISDS_GYRO)
|
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)
|
high_g = simulation.add_sensor(H3LIS100DL)
|
||||||
|
erinome = simulation.add_sensor(Erinome_I)
|
||||||
|
|
||||||
|
|
||||||
for i in tqdm.tqdm(range(5000)):
|
for i in tqdm.tqdm(range(5000)):
|
||||||
@ -30,7 +41,7 @@ for i in tqdm.tqdm(range(5000)):
|
|||||||
acc = accelerometer()
|
acc = accelerometer()
|
||||||
omegas = gyroscope()
|
omegas = gyroscope()
|
||||||
g = high_g()
|
g = high_g()
|
||||||
|
gps = erinome()
|
||||||
|
|
||||||
df = simulation.get_logger().get_dataframe()
|
df = simulation.get_logger().get_dataframe()
|
||||||
df.to_csv('dummy2.csv')
|
df.to_csv('dummy2.csv')
|
@ -8,4 +8,5 @@ import spatz.transforms as transforms
|
|||||||
from spatz.transforms import *
|
from spatz.transforms import *
|
||||||
|
|
||||||
from spatz.dataset 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 numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
|
from abc import abstractmethod
|
||||||
from typing import Any, Tuple, List
|
from typing import Any, Tuple, List
|
||||||
from numpy.typing import ArrayLike
|
from numpy.typing import ArrayLike
|
||||||
|
|
||||||
@ -10,6 +11,35 @@ from spatz.simulations.advanceable import Advanceable
|
|||||||
class Logger(Advanceable):
|
class Logger(Advanceable):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
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
|
self.__idx = -1
|
||||||
|
|
||||||
def _on_step(self, _: float):
|
def _on_step(self, _: float):
|
||||||
|
@ -3,12 +3,13 @@ from typing import List
|
|||||||
from numpy.typing import ArrayLike
|
from numpy.typing import ArrayLike
|
||||||
from spatz.sensors.gps import GPS
|
from spatz.sensors.gps import GPS
|
||||||
from spatz.dataset import ArrayLike, Dataset
|
from spatz.dataset import ArrayLike, Dataset
|
||||||
|
from spatz.simulations.data_source import DataSource
|
||||||
from spatz.logger import ArrayLike, Logger
|
from spatz.logger import ArrayLike, Logger
|
||||||
from spatz.transforms import Transform
|
from spatz.transforms import Transform
|
||||||
|
|
||||||
|
|
||||||
class Erinome_I(GPS):
|
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)
|
super().__init__(dataset, logger, transforms)
|
||||||
|
|
||||||
def _get_name(self):
|
def _get_name(self):
|
||||||
|
@ -8,6 +8,7 @@ from numpy.typing import ArrayLike
|
|||||||
from pandas import NA
|
from pandas import NA
|
||||||
|
|
||||||
from spatz.dataset import ArrayLike, Dataset
|
from spatz.dataset import ArrayLike, Dataset
|
||||||
|
from spatz.simulations.data_source import DataSource
|
||||||
from spatz.logger import ArrayLike, Logger
|
from spatz.logger import ArrayLike, Logger
|
||||||
from spatz.sensors import Sensor
|
from spatz.sensors import Sensor
|
||||||
from spatz.transforms import Transform
|
from spatz.transforms import Transform
|
||||||
@ -17,25 +18,24 @@ from spatz.transforms import Transform
|
|||||||
|
|
||||||
|
|
||||||
class GPS(Sensor):
|
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:
|
"""GPS Module which provides the following information:
|
||||||
- Longitude (in °)
|
- Longitude (in °)
|
||||||
- Latitiude (in °)
|
- Latitiude (in °)
|
||||||
- Altitude (in m)
|
- Altitude (in m)
|
||||||
|
- Lock (1 or 0)
|
||||||
"""
|
"""
|
||||||
super().__init__(dataset, logger, transforms)
|
super().__init__(dataset, logger, transforms)
|
||||||
|
|
||||||
def _get_data(self) -> ArrayLike:
|
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?
|
self._log('longitude', long)
|
||||||
if vel / self._dataset.get_speed_of_sound() > 1:
|
self._log('latitude', lat)
|
||||||
return np.array([0, 0, 0])
|
self._log('altitude', alt)
|
||||||
|
self._log('lock', lock)
|
||||||
x = self._dataset.fetch_values(['latitude', 'longitude', 'altitude'])
|
|
||||||
x = self._sensor_specific_effects(x)
|
|
||||||
|
|
||||||
# Convert to degrees.
|
return np.array([long, lat, alt, lock])
|
||||||
x *= 180 / math.pi
|
|
||||||
|
|
||||||
return x
|
|
||||||
|
@ -27,6 +27,11 @@ class WSEN_ISDS_ACC(Accelerometer):
|
|||||||
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
|
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
|
||||||
t = self._dataset.get_time()
|
t = self._dataset.get_time()
|
||||||
|
|
||||||
|
g = 9.81
|
||||||
|
|
||||||
|
# Convert to milli-g.
|
||||||
|
x = x / g * 1000
|
||||||
|
|
||||||
# Apply noise to the true values.
|
# Apply noise to the true values.
|
||||||
y = self.__noise(t, x)
|
y = self.__noise(t, x)
|
||||||
noise = y - x
|
noise = y - x
|
||||||
@ -37,8 +42,7 @@ class WSEN_ISDS_ACC(Accelerometer):
|
|||||||
self._logger.write('acc_z_noise', noise[2], self._get_name())
|
self._logger.write('acc_z_noise', noise[2], self._get_name())
|
||||||
|
|
||||||
# The WSEN-ISDS accelerometer only measures acceleration between -16g and 16g.
|
# The WSEN-ISDS accelerometer only measures acceleration between -16g and 16g.
|
||||||
g = 9.81
|
y = np.clip(y, -16000, +16000)
|
||||||
y = np.clip(y, -16*g, +16*g)
|
|
||||||
|
|
||||||
return y
|
return y
|
||||||
|
|
||||||
@ -51,8 +55,8 @@ class WSEN_ISDS_GYRO(Gyroscope):
|
|||||||
return 'WSEN_ISDS_GYRO'
|
return 'WSEN_ISDS_GYRO'
|
||||||
|
|
||||||
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
|
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
|
||||||
# Convert to degrees per second.
|
# Convert to milli-degrees per second.
|
||||||
x = (x / np.pi) * 180
|
x = (x / np.pi) * 180 * 1000
|
||||||
|
|
||||||
# TODO: Noise model.
|
# TODO: Noise model.
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ class Sensor:
|
|||||||
def _get_data(self) -> ArrayLike | float:
|
def _get_data(self) -> ArrayLike | float:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def get_init_data() -> ArrayLike:
|
def get_init_data(self) -> ArrayLike:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def __call__(self) -> ArrayLike | float:
|
def __call__(self) -> ArrayLike | float:
|
||||||
|
@ -3,12 +3,13 @@ from typing import List, AnyStr
|
|||||||
|
|
||||||
from spatz.transforms.noise import GaussianNoise
|
from spatz.transforms.noise import GaussianNoise
|
||||||
from spatz.dataset import Dataset
|
from spatz.dataset import Dataset
|
||||||
|
from spatz.simulations.data_source import DataSource
|
||||||
from spatz.sensors import TemperatureSensor
|
from spatz.sensors import TemperatureSensor
|
||||||
from spatz.transforms import Transform
|
from spatz.transforms import Transform
|
||||||
|
|
||||||
|
|
||||||
class MS5611Temperature(TemperatureSensor):
|
class MS5611Temperature(TemperatureSensor):
|
||||||
def __init__(self, dataset: Dataset, transforms: List[Transform] = []):
|
def __init__(self, dataset: DataSource, transforms: List[Transform] = []):
|
||||||
super().__init__(dataset, transforms)
|
super().__init__(dataset, transforms)
|
||||||
|
|
||||||
self.__noise = GaussianNoise(0, 0.5)
|
self.__noise = GaussianNoise(0, 0.5)
|
||||||
|
@ -8,7 +8,7 @@ from spatz.dataset import Dataset
|
|||||||
from spatz.logger import Logger
|
from spatz.logger import Logger
|
||||||
from spatz.sensors import Sensor
|
from spatz.sensors import Sensor
|
||||||
from spatz.dataset import Dataset, Phase
|
from spatz.dataset import Dataset, Phase
|
||||||
from spatz.logger import Logger
|
from spatz.logger import Logger, EmptyLogger
|
||||||
from spatz.sensors import Sensor
|
from spatz.sensors import Sensor
|
||||||
from spatz.observer import Observer
|
from spatz.observer import Observer
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ class Simulation(Advanceable):
|
|||||||
|
|
||||||
def load(self, source: DataSource):
|
def load(self, source: DataSource):
|
||||||
self.__data_source = source
|
self.__data_source = source
|
||||||
self.__logger = Logger()
|
self.__logger = EmptyLogger()
|
||||||
|
|
||||||
for sensor in self.__sensors:
|
for sensor in self.__sensors:
|
||||||
sensor.set_dataset(self.__data_source)
|
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'))
|
speed = np.linalg.norm(self.get_velocity('global'))
|
||||||
|
|
||||||
return speed / self.get_speed_of_sound()
|
return speed / self.get_speed_of_sound()
|
||||||
|
|
||||||
|
def get_temperature(self) -> float:
|
||||||
|
return Atmosphere(self.get_altitude()).temperature
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_length(self) -> float:
|
def get_length(self) -> float:
|
||||||
@ -57,10 +60,6 @@ class DataSource(Advanceable):
|
|||||||
def get_static_pressure(self) -> float:
|
def get_static_pressure(self) -> float:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
def get_temperature(self) -> float:
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_longitude(self) -> float:
|
def get_longitude(self) -> float:
|
||||||
pass
|
pass
|
||||||
|
@ -72,9 +72,6 @@ class RocketPyCSV(CSVSource):
|
|||||||
def get_static_pressure(self) -> float:
|
def get_static_pressure(self) -> float:
|
||||||
return self.fetch_value(' Pressure (Pa)')
|
return self.fetch_value(' Pressure (Pa)')
|
||||||
|
|
||||||
def get_temperature(self) -> float:
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
def get_longitude(self) -> float:
|
def get_longitude(self) -> float:
|
||||||
return self.fetch_value(' Longitude (°)')
|
return self.fetch_value(' Longitude (°)')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user