Quais são os métodos para lidar com o atraso da bússola (histerese dependente da taxa)?


12

Eu tenho um robô com banda de rodagem, com codificadores de roda de baixa precisão para rastrear a distância e uma bússola eletrônica para determinar a direção. A bússola apresenta um atraso significativo (> 1 segundo) quando o robô gira rapidamente, por exemplo, após atingir um ponto de passagem - girando no local para apontar para o novo rumo.

Quais são as maneiras de lidar com o atraso? Eu acho que se poderia fazer muitas medições e modelar a resposta da bússola. No entanto, isso parece problemático, pois depende da taxa e eu não sei a taxa instantânea.

Como uma abordagem simples, mas lenta, eu tenho o robô girando até que seja apontado mais ou menos na direção certa e, em seguida, faça voltas incrementais muito pequenas com breves pausas de medição até apontar o caminho certo. Existem outras maneiras de lidar com isso?

Respostas:


12

O atraso na bússola é causado por um filtro passa-baixo, para suprimir ruídos de alta frequência.

  • Existem magnetômetros mais caros, com menos ruído e, portanto, menos lag.
  • Também é possível usar um giroscópio para melhorar a precisão. De fato, é isso que as Unidades de Medição Inercial (IMUs) fazem. Isso pode ser feito usando um filtro Kalman. Melhorar a precisão ajuda a diminuir o atraso, porque a precisão aumentada reduz a dependência de um filtro passa-baixo para suprimir o ruído. O filtro Kalman funde os dados do magnetômetro e também do giroscópio (que mede a taxa de mudança de posição).

Se você ficar com sua bússola atual, há duas soluções possíveis (aviso, isso fica cada vez mais avançado, mas a opção 1 deve estar acessível para a maioria das pessoas sem muito trabalho).

  1. 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θ(t1)++akθ(tk)
    θ^(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)θ(k1)θ(0)θ(k+n)θ(k+n1)θ(n)][a0a1ak]

    E você pode resolver encontrando: em queM+é a matriz de pseudo-inverso deM. Não há uma maneira definitiva de calculark

    [a0a1ak]=[θ(k)θ(k1)θ(0)θ(k+n)θ(k+n1)θ(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+a1z1+...+akzk

    θ¯(t)

    Θ¯(z)Θ^(z)=1a0+a1z1++akzk

    Convertendo de volta para o domínio do tempo:

    a0θ¯(t)+a1θ¯(t1)++akθ¯(tk)=θ^(t)

    θ¯(t)=θ^(t)a1θ¯(t1)akθ¯(tk)a0

    θ¯

    θ¯

  2. 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(t1)+Bu(t1)y(t)=Cx(t)

    x(t)=[θ(t)θ(t1)θ(tk)]=[A1A200010000010000010000010]x(t1)+[B0B1000]u(t1)

    y(t)=[θ^(t)]=[a0a1ak]x(t)

    where u(t1) 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=[100000000000] and Rc=[1]. This is done because LQR finds the optimal controller to minimise a cost function: J=(xTQx+uTRu)

    Then, you just put it through the discrete time algebraic Riccati equation:

    P=Q+AT(PPB(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)xref(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.

The concepts in this post does get quite advanced, but if you need to solve things like the Riccati equation, you can use MATLAB or other software to do this. There may also be libraries already implementing the Kalman filter (again, I believe MATLAB also does this).

For an embedded application, you may need to implement the Kalman filter yourself, although there is probably a C implementation.


Thanks for you excellent and in-depth answer. I follow the gist of your first solution and I'm sure I can work through it. The second one, as you say, is more challenging and I'll have to work to see if I can follow it all.
ViennaMike

4

A gyro is the simple answer. I've always heard, gyro for the short measurements, compass for the long. And realistically a cup of kallman filter between the two most of the time. The price of a 6DOF gyro/acc board is less than $20 these days, far too cheap to not use one.

At one time, I worked through someone else's Kallman filter. and got it working. A kallman filter is actually more of an approach, not a exact implementation, and in the gyro case, the end result does not need to use matrix math. It makes for much simpler code.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.