mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/SPATZ.git
synced 2025-06-10 01:55:59 +00:00
Better logging and added BHI160 sensor
This commit is contained in:
parent
4def93041e
commit
29db73ccd4
@ -1,7 +1,7 @@
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
from typing import Any, Tuple
|
||||
from typing import Any, Tuple, List
|
||||
from numpy.typing import ArrayLike
|
||||
|
||||
from abc import abstractmethod
|
||||
@ -56,7 +56,7 @@ class Logger(Advanceable):
|
||||
def _on_reset(self):
|
||||
self.__df = pd.DataFrame.from_dict({'time': [self.get_time()]}).astype(np.float64)
|
||||
|
||||
def write(self, attrib: str, value: Any, domain: str = 'all'):
|
||||
def write(self, attrib: str | List[str], value: Any | List[Any] | List[ArrayLike], domain: str = 'all'):
|
||||
"""Writes a value to the logger.
|
||||
|
||||
Args:
|
||||
@ -64,12 +64,16 @@ class Logger(Advanceable):
|
||||
value (Any): The value to log.
|
||||
domain (str, optional): The domain the value belongs to. Defaults to 'any'.
|
||||
"""
|
||||
name = f'{domain}/{attrib}'
|
||||
if not isinstance(attrib, str):
|
||||
for attr, val in zip(attrib, value):
|
||||
self.write(attr, val, domain=domain)
|
||||
else:
|
||||
name = f'{domain}/{attrib}'
|
||||
|
||||
if name not in self.__df.columns:
|
||||
self.__df[name] = pd.Series([pd.NA] * len(self.__df))
|
||||
if name not in self.__df.columns:
|
||||
self.__df[name] = pd.Series([pd.NA] * len(self.__df))
|
||||
|
||||
self.__df.at[self.__idx, name] = value
|
||||
self.__df.at[self.__idx, name] = value
|
||||
|
||||
def get_dataframe(self) -> pd.DataFrame:
|
||||
return self.__df
|
@ -6,6 +6,9 @@ from numpy.typing import ArrayLike
|
||||
|
||||
def inv(val):
|
||||
if np.isscalar(val):
|
||||
if val == 0:
|
||||
return 0
|
||||
|
||||
return 1 / val
|
||||
|
||||
if len(val) == 1:
|
||||
@ -76,6 +79,8 @@ class KalmanFilter:
|
||||
H = self.__H
|
||||
R = self.__R
|
||||
|
||||
n = len(x)
|
||||
|
||||
if hasattr(self.__H, '__call__'):
|
||||
H = self.__H(dt)
|
||||
|
||||
@ -86,9 +91,9 @@ class KalmanFilter:
|
||||
K = err @ H.T @ inv(H @ err @ H.T + R)
|
||||
|
||||
# Compute the corrected state.
|
||||
x = x + K @ (z - H @ x)
|
||||
x = x + (K @ (z - H @ x)).T
|
||||
|
||||
# Compute the error after correction.
|
||||
err = (np.identity('TODO') - K @ H) @ err
|
||||
err = (np.identity(n) - K @ H) @ err
|
||||
|
||||
return x, err
|
||||
return np.squeeze(np.asarray(x)), err
|
@ -1,4 +1,4 @@
|
||||
from typing import List
|
||||
from typing import List, AnyStr
|
||||
|
||||
from numpy.typing import ArrayLike
|
||||
from spatz.dataset import ArrayLike, Dataset
|
||||
@ -8,13 +8,27 @@ from spatz.transforms import Transform
|
||||
|
||||
|
||||
class BHI160Gyro(Gyroscope):
|
||||
def __init__(self, dataset: Dataset, logger: Logger, offset: float = 0, transforms: List[Transform] = ...):
|
||||
def __init__(self, dataset: Dataset, logger: Logger, offset: float = 0, transforms: List[Transform] = []):
|
||||
super().__init__(dataset, logger, offset, transforms)
|
||||
|
||||
def _get_name(self) -> AnyStr:
|
||||
return 'BHI160'
|
||||
|
||||
def _get_data(self) -> ArrayLike:
|
||||
rots = self._dataset.fetch_values(['roll_l', 'pitch_l', 'yaw_l'])
|
||||
|
||||
|
||||
return rots
|
||||
|
||||
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
|
||||
return x
|
||||
|
||||
|
||||
class BHI160Acc(Accelerometer):
|
||||
def __init__(self, dataset: Dataset, logger: Logger, offset: float = 0, transforms: List[Transform] = []):
|
||||
super().__init__(dataset, logger, offset, transforms)
|
||||
|
||||
def _get_name(self) -> AnyStr:
|
||||
return 'BHI160'
|
||||
|
||||
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
|
||||
return x
|
||||
|
@ -47,8 +47,10 @@ class Sensor:
|
||||
out = self._get_data()
|
||||
out = self._sensor_specific_effects(out)
|
||||
|
||||
t = self._dataset.get_time()
|
||||
|
||||
for transform in self._transforms:
|
||||
out = transform(out)
|
||||
out = transform(t, out)
|
||||
|
||||
# Log the outputs of the sensor.
|
||||
if np.isscalar(out):
|
||||
|
@ -35,7 +35,6 @@ class UniformTimeSteps:
|
||||
return self.__dt + noise
|
||||
|
||||
|
||||
|
||||
class Simulation:
|
||||
def __init__(self, time_steps=UniformTimeSteps(0.01)):
|
||||
self.__dataset = None
|
||||
@ -123,4 +122,3 @@ class Simulation:
|
||||
|
||||
return self.__sensors[-1]
|
||||
|
||||
|
@ -26,4 +26,9 @@ class Downtime(Transform):
|
||||
if self.__state == 1:
|
||||
return x
|
||||
|
||||
return np.zeros_like(x)
|
||||
if np.isscalar(x):
|
||||
x = 0
|
||||
else:
|
||||
x = np.zeros_like(x)
|
||||
|
||||
return x
|
||||
|
Loading…
x
Reference in New Issue
Block a user