Better logging and added BHI160 sensor

This commit is contained in:
dario 2024-01-13 22:54:13 +01:00
parent 4def93041e
commit 29db73ccd4
6 changed files with 44 additions and 16 deletions

View File

@ -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,6 +64,10 @@ class Logger(Advanceable):
value (Any): The value to log.
domain (str, optional): The domain the value belongs to. Defaults to 'any'.
"""
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:

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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]

View File

@ -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