SPATZ migration + proper directory structure

This commit is contained in:
dario
2023-12-10 14:11:54 +01:00
parent f819b24bfa
commit c60629b4c9
24 changed files with 938 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
from accelerometer import Accelerometer
from gyroscope import Gyroscope

View File

@@ -0,0 +1,50 @@
import numpy as np
from typing import List
from numpy.typing import ArrayLike
from spatz.sensors import Sensor
from spatz.transforms import Transform
from spatz.dataset import Dataset
from spatz.logger import Logger
__all__=[
'Accelerometer'
]
# Local definition of gravitation
g = 9.81
class Accelerometer(Sensor):
def __init__(self, dataset: Dataset, logger: Logger, offset: float = 0, transforms: List[Transform] = []):
super().__init__(dataset, logger, transforms)
self._offset = np.array([offset, 0, 0])
def _get_data(self) -> ArrayLike | float:
acc = self._dataset.get_acceleration(frame='FL')
acc += np.array([0, 0, g])
self._logger.write('FL_x', acc[0], self._get_name())
self._logger.write('FL_y', acc[1], self._get_name())
self._logger.write('FL_z', acc[2], self._get_name())
# Convert FL to body
acc = self._dataset.launch_rail_to_body() @ acc
self._logger.write('B_x', acc[0], self._get_name())
self._logger.write('B_y', acc[1], self._get_name())
self._logger.write('B_z', acc[2], self._get_name())
# Flip axes to sensor's perspective.
acc *= -1
# Add the effects of the imu's offset.
omega = self._dataset.get_angular_velocities()
acc += (np.cross(omega, self._offset) + np.cross(omega, np.cross(omega, self._offset)))
return acc

View File

@@ -0,0 +1,20 @@
from numpy.typing import ArrayLike
from typing import List
from spatz.sensors import Sensor
from spatz.transforms import Transform
from spatz.dataset import Dataset
from spatz.logger import Logger
class Gyroscope(Sensor):
def __init__(self, dataset: Dataset, logger: Logger, offset: float = 0, transforms: List[Transform] = []):
super().__init__(dataset, logger, transforms)
self._offset = offset
def _get_data(self) -> ArrayLike | float:
# Rotation in rad/sec
x = self._dataset.get_rotation_rates()
return x

25
spatz/sensors/imu/imu.py Normal file
View File

@@ -0,0 +1,25 @@
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.sensor import Sensor
from spatz.transforms import Transform
class IMU(CompoundSensor):
def __init__(self,
dataset: Dataset,
logger: Logger,
acc: Accelerometer,
gyro: Gyroscope,
transforms: List[Transform] = []):
"""_summary_
Args:
dataset (Dataset): _description_
logger (Logger): _description_
acc (Accelerometer): _description_
gyro (Gyroscope): _description_
transforms (List[Transform], optional): _description_. Defaults to [].
"""
super().__init__(dataset, logger, [acc, gyro], transforms)

View File

@@ -0,0 +1,54 @@
import numpy as np
from typing import AnyStr, List
from numpy.typing import ArrayLike
from spatz.sensors import Accelerometer, Gyroscope, IMU
from spatz.transforms import Transform, GaussianNoise
from spatz.dataset import Dataset
from spatz.logger import Logger
class WSEN_ISDS(IMU):
pass
class WSEN_ISDS_ACC(Accelerometer):
def __init__(self, dataset: Dataset, logger: Logger, offset: float, transforms: List[Transform] = []):
super().__init__(dataset, logger, offset, transforms)
self.__variance = 0.05
self.__noise = GaussianNoise(np.zeros(3), np.identity(3) * self.__variance)
def _get_name(self) -> AnyStr:
return 'WSEN_ISDS'
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
t = self._dataset.get_time()
# Apply noise to the true values.
y = self.__noise(t, x)
noise = y - x
# Log the chosen noise values.
self._logger.write('acc_x_noise', noise[0], self._get_name())
self._logger.write('acc_y_noise', noise[1], self._get_name())
self._logger.write('acc_z_noise', noise[2], self._get_name())
return y
class WSEN_ISDS_GYRO(Gyroscope):
def __init__(self, dataset: Dataset, logger: Logger, offset: float, transforms: List[Transform] = []):
super().__init__(dataset, logger, offset, transforms)
def _get_name(self) -> AnyStr:
return 'WSEN_ISDS'
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
# Convert to degrees per second.
x = (x / np.pi) * 180
# TODO: Noise model.
return x