Você pode tentar cancelar o filtro. Isso pode remover o atraso, mas também aumenta o ruído de alta frequência. Depois de fazer isso, você pode tentar controlar o robô com base na nova estimativa de título. Para fazer isso, você deve experimentar os parâmetros do filtro passa-baixo. Por exemplo, em um tempo discreto, você pode encontrar:
onde θ (t)é a posição estimada (saída bússola) no tempot,θé o cabeçalho real (verdade fundamental) no tempot.
θ^(t)=a0θ(t)+a1θ(t−1)+⋯+akθ(t−k)
θ^(t)tθt
Você pode encontrar os parâmetros de fazendo um experimento onde você mede a verdade solo usando outros meios externos. Dado n + k + 1 amostras, tem a seguinte
equação: [ θ ( k ) ⋮ θ ( k + n ) ] = [ θ ( k ) θ ( k - 1 ) ⋯ θ ( 0 ) ⋮ ⋮ain+k+1
⎡⎣⎢⎢⎢θ^(k)⋮θ^(k+n)⎤⎦⎥⎥⎥=⎡⎣⎢⎢θ(k)⋮θ(k+n)θ(k−1)⋮θ(k+n−1)⋯⋯θ(0)⋮θ(n)⎤⎦⎥⎥⎡⎣⎢⎢⎢⎢a0a1⋮ak⎤⎦⎥⎥⎥⎥
E você pode resolver encontrando:
em queM+é a matriz de pseudo-inverso deM. Não há uma maneira definitiva de calculark
⎡⎣⎢⎢⎢⎢a0a1⋮ak⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢θ(k)⋮θ(k+n)θ(k−1)⋮θ(k+n−1)⋯⋯θ(0)⋮θ(n)⎤⎦⎥⎥+⎡⎣⎢⎢⎢θ^(k)⋮θ^(k+n)⎤⎦⎥⎥⎥
M+Mk, então você provavelmente irá adivinhar. Para pontos de bônus, isso pressupõe que o ruído seja branco e independente, mas você pode branquear primeiro para remover o viés e, portanto, melhorar sua estimativa dos parâmetros.
Você pode converter isso em uma função de transferência (também conhecida como transformação Z no domínio do tempo discreto):
Θ^(z)Θ(z)=a0+a1z−1+...+akz−k
θ¯(t)
Θ¯(z)Θ^(z)=1a0+a1z−1+⋯+akz−k
Convertendo de volta para o domínio do tempo:
a0θ¯(t)+a1θ¯(t−1)+⋯+akθ¯(t−k)=θ^(t)
θ¯(t)=θ^(t)−a1θ¯(t−1)−⋯−akθ¯(t−k)a0
θ¯
θ¯
A solução acima ainda não é a melhor maneira. A estimativa barulhenta pode não ser muito útil. Se colocarmos isso em uma equação de espaço de estado, podemos projetar um filtro Kalman e um controlador de feedback de estado completo usando LQR (regulador quadrático linear). A combinação de um filtro Kalman e um controlador LQR também é conhecida como um controlador LQG (gaussiano quadrático linear) e usa a recuperação de transferência de loop para obter um bom controlador.
Para fazer isso, crie as equações de espaço de estado (tempo discreto):
x⃗ (t)=Ax⃗ (t−1)+Bu⃗ (t−1)y⃗ (t)=Cx⃗ (t)
x⃗ (t)=⎡⎣⎢⎢⎢⎢θ(t)θ(t−1)⋯θ(t−k)⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢A110⋮00A201⋮00⋯⋯⋯⋯⋯000⋮10000⋮01000⋮00⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥x⃗ (t−1)+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢B0B10⋮00⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥u⃗ (t−1)
y⃗ (t)=[θ^(t)]=⎡⎣⎢⎢⎢⎢a0a1⋮ak⎤⎦⎥⎥⎥⎥x⃗ (t)
where u⃗ (t−1) represents the power in the motors to turn the robot, and A0, A1, B0, B1 is how much it affects the heading based on position and speed (you can choose non-zero values for the other elements of the B matrix, and first row of the A matrix too).
Then, you can build your observer (Kalman Filter), by choosing noise estimates Qo and Ro for the process noise and measurement noise. The Kalman Filter can then find the optimal estimate of heading, given those assumptions about the noise. After choosing the noise estimates, the implementation just depends on implementing code for the Kalman Filter (equations can be found on Wikipedia, so I won't go over it here).
After that, you can design an LQR controller, this time, choosing Qc and Rc representing the weighting given to regulating the heading, and trying to limit the use of the actuators. In this case, you might choose Qc=⎡⎣⎢⎢⎢⎢10⋮000⋮000⋮0⋯⋯⋯00⋮0⎤⎦⎥⎥⎥⎥ and Rc=[1]. This is done because LQR finds the optimal controller to minimise a cost function: J=∑(x⃗ TQx⃗ +u⃗ TRu⃗ )
Then, you just put it through the discrete time algebraic Riccati equation:
P=Q+AT(P−PB(R+BTPB)−1BTP)A
and solve for a positive definite matrix P.
Thus, your control law can be given by:
u⃗ (t)=−K(x⃗ (t)−x⃗ ref(t))
where K=(R+BTPB)−1(BTPA)
Finally, just doing this won't work very well, and is likely to be unstable because of the noise. Indeed, that means option 1 probably won't work unless you first put θ¯ through a low-pass filter (albeit not necessarily with such a long effective lag time). This is because while LQR is guaranteed stable, as soon as you use a Kalman filter, the guarantee is lost.
To fix this, we use the Loop Transfer Recovery technique, where you adjust the Kalman filter, and instead choose a new Qo=Q0+q2BVBT, where Q0 is your original Q matrix, tuned so that the Kalman filter is optimal. V is any positive definite symmetric matrix, which you can just choose as the identity matrix (V=I). Then, just choose a scalar q. The resulting controller should become (more) stable as q→∞, although the Qo matrix becomes de-tuned, which means it becomes less optimal.
Therefore, you just increase q until it is stable. Another way you can try to make it stable, is to increase Rc (or decrease Qc) to make the LQR controller slower.