boschresearch / nonlinest

Apache License 2.0
2 stars 1 forks source link

Question about Dimenions - Help needed #4

Closed BastelBaus closed 3 months ago

BastelBaus commented 3 months ago

I just tried to get the library running and directly failed when change the example to a single dimension measurement. Any guidance which example to look at ? BR, BastelBaus

# import library
from nonlinear_estimation_toolbox.filters.ekf import EKF
from nonlinear_estimation_toolbox.distributions import Gaussian
from nonlinear_estimation_toolbox.system_models import AdditiveNoiseSystemModel
from nonlinear_estimation_toolbox.measurement_models import AdditiveNoiseMeasurementModel, MeasurementModel
from nonlinear_estimation_toolbox.utils import ColumnVectors
import numpy as np

# create a filter
filter = EKF()

# set the initial state
initial_state = Gaussian(ColumnVectors([1,2]), np.eye(2))
filter.set_state(initial_state)

# define system model
class SquareSysModel(AdditiveNoiseSystemModel):
    def system_equation(self, state_samples: ColumnVectors) -> ColumnVectors:
        return np.square(state_samples)

# instantiate system model and noise
sys_model = SquareSysModel()
sys_noise = Gaussian(ColumnVectors([0,0]), np.eye(2))
sys_model.set_noise(sys_noise)

# prediction step
filter.predict(sys_model)
print(filter.get_state())

# define measurement model
class CubicMeasModel(AdditiveNoiseMeasurementModel):
    def measurement_equation(self, state_samples: ColumnVectors) -> ColumnVectors:
        return np.power(state_samples[0], 3)

# instantiate measurement model and noise
meas_model = CubicMeasModel()
meas_noise = Gaussian(ColumnVectors([0]), np.eye(1))
meas_model.set_noise(meas_noise)
measurement = ColumnVectors([4])

# measurement update step
filter.update(meas_model, measurement)
print(filter.get_state())

leads to

  File c:\users\pagantroll\dokumente\01_projekte\03_bastelbaus\14_galaxy6d\other\nonlinest\nonlinear_estimation_toolbox\utils.py:248 in get_jacobian
    jacobian = values[:, idx] - values[:, dim + idx]

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

looking here it seams that I could go from an N=2 state vector to M=1 measurements but probably I missed some aspects ... https://nonlinearestimation.bitbucket.io/additive-noise-measurement-model.html

BastelBaus commented 3 months ago

I found my bug by myself. Needed to precess multiple samples at one time and stack them back. See line return np.stack( [np.power(state_samples[0], 3)])

BR, BastelBaus

# import library
from nonlinear_estimation_toolbox.filters.ekf import EKF
from nonlinear_estimation_toolbox.distributions import Gaussian
from nonlinear_estimation_toolbox.system_models import AdditiveNoiseSystemModel
from nonlinear_estimation_toolbox.measurement_models import AdditiveNoiseMeasurementModel, MeasurementModel
from nonlinear_estimation_toolbox.utils import ColumnVectors
import numpy as np

# create a filter
filter = EKF()

# set the initial state
initial_state = Gaussian(ColumnVectors([1,2]), np.eye(2))
filter.set_state(initial_state)

# define system model
class SquareSysModel(AdditiveNoiseSystemModel):
    def system_equation(self, state_samples: ColumnVectors) -> ColumnVectors:
        return np.square(state_samples)

# instantiate system model and noise
sys_model = SquareSysModel()
sys_noise = Gaussian(ColumnVectors([0,0]), np.eye(2))
sys_model.set_noise(sys_noise)

# prediction step
filter.predict(sys_model)
print(filter.get_state())

# define measurement model
class CubicMeasModel(AdditiveNoiseMeasurementModel):
    def measurement_equation(self, state_samples: ColumnVectors) -> ColumnVectors:
        return np.stack( [np.power(state_samples[0], 3)])

# instantiate measurement model and noise
meas_model = CubicMeasModel()
meas_noise = Gaussian(ColumnVectors([0]), np.eye(1))
meas_model.set_noise(meas_noise)
measurement = ColumnVectors([4])

# measurement update step
filter.update(meas_model, measurement)
print(filter.get_state())
BastelBaus commented 3 months ago

closed