Professional Documents
Culture Documents
C Algorithms
C Algorithms
C Algorithms
'''
AGORYTMMY
W tyn probgrami mogą być przechowywane rózne algorytmy. Umieszczony filtr Kalmana
składa się z metod obliczających oraz
służących do bezpośredniej interakcji (interakkcja również jest zamieszczona w tym
miejscu ponieważ rózne algorytmy mogą
potrzebować różnych parametrów, stąd taki podział)
KLASY:
SETTERY:
- delta_t : Setter umożliwijaćy zapisywanie paranetru
_delta_t i podczas jego zmiany aktualizację
parametru sample_amount
- time : Setter umożliwijaćy zapisywanie paranetru time
i podczas jego zmiany aktualizację
parametru sample_amount
PUBLIC:
- generate_measures : Generowanie pomiarów z wykorzytsaniem poł
chronionych
- show_algorithm_params : Wyseitlanie parametrów
- algorithm_configure : Konfiguracja paramterów. Wywołanie
_set_transition_model do ustawienia macierzy F
oraz _set_observation_model do ustawienia
macierzy H
PRIVATE:
- _set_transition_model
- _set_observation_model
STATIC :
- _new_matrix_question : Dodanie nowegj macierzyy
'''
class KalmanFilter:
def __init__(self):
self.sample_amount = 0
self._time = TIME
self.delta_t = DT
# ilość parametrów
states_num = INIT_X0.shape[0]
self.init_XO = INIT_X0
self.init_cov = INIT_COV
# przypisanie stałych parametrów
self.F = INIT_F
self.B = INIT_B
self.H = INIT_H
self.sigma_x = INIT_SIGMA_X
self.sigma_z = INIT_SIGMA_Z
self.update_matrix_online = UPDATE_TRANSITION_ONLINE
self.err_cov_matrix_params = [0,0,0,0]
@property
def delta_t(self):
print(self._delta_t)
return self._delta_t
@delta_t.setter
def delta_t(self, val):
if self.time is not None:
self.sample_amount = int(self.time / val)
print(val)
self._delta_t = val
@property
def time(self):
print(f"TUTAJ ---- 1")
return self._time
@time.setter
def time(self, val):
if self._delta_t is not None:
self.sample_amount = int(val / self.delta_t)
self._time = val
def show_algorithm_params(self):
print_info(title="Filtr Kalmana",
data=(self.init_XO, self.init_cov,
self.sigma_z,self.sigma_x,self.F,self.B,self.H,),
data_title=("Początkowa wartość x0", "Początkowa wartość
macierzy kowariancji",
"Wartość macierzy błędu kowariancji obserwacji R",
"Wartość macierzy błędu kowariancji szumu Q",
"F", "B",
"H", ))
def algorithm_configure(self):
n = self.mi_est.shape[0]
is_models_to_define = input("Zdefiniować model przejść?:\n1.Tak\n2.Nie\n")
if is_models_to_define == '1':
self.set_transition_model(n)
self.set_observation_model(n)
mi_est[:, 0] = self.init_XO
print(f"mi_est[:, 0] = {mi_est[:, 0]}")
sigma_t_est[:, :,0 ] = self.init_cov
# predykcja
mi_pred[:, k + 1] = self.F @ mi_est[:, k]
sigma_t_pred[:, :, k + 1] = self.F @ sigma_t_est[:, :, k] @ self.F.T +
self.sigma_x
# aktualizacja
K[:, :, k + 1] = sigma_t_pred[:, :, k + 1] \
@ self.H.T @ \
np.linalg.inv(self.H @ sigma_t_pred[:, :, k + 1] @
self.H.T + self.sigma_z)
mi_est[:, k + 1] = mi_pred[:, k + 1] + K[:, :, k + 1] @ (measurement[:,
k] - self.H @ mi_pred[:, k + 1])
sigma_t_est[:, :, k + 1] = (np.eye(num_of_states) - K[:, :, k + 1] @
self.H) @ sigma_t_pred[:, :, k + 1]
self.measurements = measurement
self.mi_est = mi_est
return mi_est
@staticmethod
def _new_matrix_question(n=0, m=0):
val = []
for i in range(m):
row = []
for j in range(n):
elem = input('#')
elem = float(elem) if elem != '' else 0
if m > 0:
row.append(elem)
else:
val.append(row)
if m > 0:
val.append(row)
val = np.array(val)
return val