types.control_classical.LuenbergerObserverResult

types.control_classical.LuenbergerObserverResult()

Luenberger observer (deterministic state estimator) design result.

Observer dynamics: x̂˙ = Ax̂ + Bu + L(y - Cx̂) Error dynamics: e˙ = (A - LC)e

Choose L to place observer poles (eigenvalues of A - LC).

Fields

gain : GainMatrix Observer gain L (nx, ny) desired_poles : np.ndarray Desired observer eigenvalues achieved_poles : np.ndarray Actual eigenvalues of (A - LC) is_observable : bool System must be observable for arbitrary placement

Examples

>>> A = np.array([[0, 1], [-2, -3]])
>>> C = np.array([[1, 0]])  # Measure position
>>>
>>> # Place observer poles faster than controller
>>> desired_poles = np.array([-10, -12])
>>> result: LuenbergerObserverResult = design_observer(A, C, desired_poles)
>>>
>>> L = result['gain']
>>> print(result['is_observable'])  # True
>>>
>>> # Observer-based control
>>> x_hat = np.zeros(2)
>>> for k in range(N):
...     u = -K @ x_hat  # Control law
...     y_meas = C @ x_true + noise
...
...     # Observer update
...     x_hat_dot = A @ x_hat + B @ u + L @ (y_meas - C @ x_hat)
...     x_hat = x_hat + dt * x_hat_dot  # Euler integration