SPATZ/spatz/sensors/imu/wsen_isds.py

55 lines
1.6 KiB
Python

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