control//state estimation//Luenberger observer

A Luenberger observer is a state estimator that runs a copy of the system's model in parallel with the real system, fed with the same inputs, and corrects that copy with a fixed gain times the difference between what the sensor measures and what the copy predicts it should measure. It is the simplest way to estimate a state no sensor reads, and it runs where the model is good and the noise modest: the drive of an electric motor estimates the rotor's position and speed from currents and voltages without an encoder, on the same microcontroller that generates the PWM at tens of kilohertz.


A Luenberger observer is a state estimator that runs a copy of the system's model in parallel with the real system, fed with the same inputs, and corrects that copy with a fixed gain times the difference between what the sensor measures and what the copy predicts it should measure. It is the simplest way to estimate a state no sensor reads, and it runs where the model is good and the noise modest: the drive of an electric motor estimates the rotor's position and speed from currents and voltages without an encoder, on the same microcontroller that generates the PWM at tens of kilohertz.

x^k+1=Ax^k+Buk+L (yk−Cx^k)\hat x_{k+1}=A\hat x_k+Bu_k+L\,(y_k-C\hat x_k)x^k+1​=Ax^k​+Buk​+L(yk​−Cx^k​)

x^\hat xx^ is the estimated state, uuu the input, y−Cx^y-C\hat xy−Cx^ the error in predicting the measurement, and LLL a gain the designer chooses. Subtracting this from the real system, the estimation error e=x−x^e=x-\hat xe=x−x^ evolves as ek+1=(A−LC) eke_{k+1}=(A-LC),e_kek+1​=(A−LC)ek​. If every eigenvalue of A−LCA-LCA−LC has modulus below one, each step multiplies the error by something smaller than one and the copy converges to the real system; if the system is observable, those eigenvalues can be put anywhere. Placing them is pole placement applied to the error, done in practice through the transposed problem, L = control.place(A.T, C.T, poles).T.

Where to put them is a trade-off. A large LLL converges fast and lets almost all the sensor noise through; a small one gives a smooth estimate but trusts the model and corrects its errors slowly. The rule of thumb is an observer several times faster than the control loop it feeds, so the controller sees an estimate that has already settled.

The Kalman filter has exactly this structure, a model copy corrected by the measurement error, and chooses LLL for you at every step from the noise statistics, reporting its own uncertainty as well. The observer is the better choice when the noise is hard to quantify and a gain picked by hand, whose behaviour anyone can read off the eigenvalues, is enough.

The gain does not come from data. It is designed, and with it the observer's speed; nothing in the observer reports how good its estimate is, so an error in the model shows up as a steady estimation error that only an independent measurement reveals.

Combined with state feedback, the observer and the controller can be designed separately and the closed loop keeps both sets of eigenvalues (separation principle), which says nothing about how robust the combination is.