Duas coisas.
Se você planeja fazer o mapeamento, precisa de um algoritmo de Localização e Mapeamento Simultâneo (SLAM) completo. Veja: Localização e Mapeamento Simultâneos (SLAM): Parte I Os Algoritmos Essenciais . No SLAM, estimar o estado do robô é apenas metade do problema. Como fazer isso é uma pergunta maior do que pode ser respondida aqui.
Em relação à localização (estimativa do estado do robô), este não é um trabalho para um filtro Kalman. A transição de
para x ( t + 1 )x(t)=[x,y,x˙,y˙,θ,θ˙]x(t+1)não é uma função linear devido às acelerações e velocidades angulares. Portanto, você precisa considerar estimadores não lineares para esta tarefa. Sim, existem maneiras padrão de fazer isso. Sim, eles estão disponíveis na literatura. Sim, normalmente todas as entradas são colocadas no mesmo filtro. Posição, velocidade, orientação e velocidade angular do robô são usadas como saídas. E sim, apresentarei uma breve introdução aos temas comuns aqui. As principais opções de take-away são
- inclua o viés Gyro e IMU no seu estado ou suas estimativas divergirão
- Um filtro Kalman estendido (EKF) é comumente usado para esse problema
- As implementações podem ser derivadas do zero e geralmente não precisam ser "pesquisadas".
- Existem implementações para a maioria dos problemas de localização e SLAM, portanto, não faça mais trabalho do que o necessário. Consulte: ROS do sistema operacional do robô
Agora, para explicar o EKF no contexto do seu sistema. Temos um IMU + Gyro, GPS e odometria. O robô em questão é uma unidade diferencial, como mencionado. A tarefa de filtragem é para levar a estimativa atual pose do robô
x t , as entradas de controlo de u t , e as medições a partir de cada sensor, z t , e produzir a estimativa na etapa seguinte tempo
x t + 1 . Vamos chamar as medições IMU de I t , o GPS é G t e a odometria, O t .x^tutztx^t+1ItGtOt
Presumo que estamos interessados em estimar a pose robô como
. O problema com IMU e giroscópios é drift. Existe um viés não estacionário nas acelerações que você deve considerar no EKF. Isso é feito (geralmente) colocando o viés no estado estimado. Isso permite estimar diretamente o viés a cada etapa do tempo.
x t = x , y , ˙ x , ˙ y , θ , ˙ θ , bxt=x,y,x˙,y˙,θ,θ˙xt=x,y,x˙,y˙,θ,θ˙,b, para um vetor de vieses .b
Estou assumindo:
- = duas medições de distância representando a distância que os degraus percorreram em um pequeno incremento de tempoOt
- = três medidas de orientação α , β , θ e três medidas de aceleração ¨ x , ¨ y , ¨ z .Itα,β,θx¨,y¨,z¨
- = a posição do robô noquadroglobal,
G x t , G y t .GtGxt,Gyt
Normalmente, é difícil mapear o resultado das entradas de controle (velocidades desejadas para cada banda de rodagem) para as saídas (a mudança na posição do robô). No lugar de , é comum (consulte Thrun , Odometry Question ) usar a odometria como o "resultado" do controle. Essa suposição funciona bem quando você não está em uma superfície quase sem atrito. O IMU e o GPS podem ajudar a corrigir o deslizamento, como veremos.u
Assim, a primeira tarefa é a de prever o próximo estado a partir do estado
. No caso de um robô com acionamento diferencial, essa previsão pode ser obtida diretamente da literatura (consulte Sobre a cinemática dos robôs móveis com rodas ou o tratamento mais conciso em qualquer livro de robótica moderno) ou derivada do zero, como mostrado aqui: Pergunta de odometria .x^t+1=f(x^t,ut)
Assim, agora podemos prever x t + 1 = f ( x t , O t ) . Esta é a etapa de propagação ou previsão. Você pode operar um robô simplesmente propagando. Se os valores de S t são completamente precisos, você nunca terá uma estimativa x , que não é igual exatamente o seu verdadeiro estado. Isso nunca acontece na prática.x^t+1=f(x^t,Ot)Otx^
Isso fornece apenas um valor previsto da estimativa anterior e não nos diz como a precisão da estimativa diminui com o tempo. Portanto, para propagar a incerteza, você deve usar as equações EKF (que propagam a incerteza na forma fechada sob as premissas de ruído gaussianas), um filtro de partículas (que usa uma abordagem baseada em amostragem) *, o UKF (que usa uma abordagem pontual aproximação da incerteza) ou uma de muitas outras variantes.
PtftPtUt2×2.1×I2×2f
Fx=∂f∂x and Fu=∂f∂u, then propagate the uncertainty as,
Pt+1=Fx∗Pt∗FTx+Fu∗Ut∗FTu
Now we can propagate the estimate and the uncertainty. Note the
uncertainty will monotonically increase with time. This is expected.
To fix this, what is typically done, is to use the It and Gt to
update the predicted state. This is called the measurement step of the
filtering process, as the sensors provide an indirect measurement of
the state of the robot.
First, use each sensor to estimate some part of the robot state
as some function hg() and hi() for GPS, IMU. Form
the residual or innovation which is the difference of the
predicted and measured values.
Then, estimate the accuracy for each sensor estimate in
the form of a covariance matrix R for all sensors (Rg, Ri in
this case). Finally, find the Jacobians of h and update the state
estimate as follows:
For each sensor s with state estimate zs (Following wikipedia's entry)
vs=zs−hs(x^t+1)
Ss=Hs∗Pt+1∗HTs+Rs
K=Pt+1∗HTsS−1s
x^t+1=x^t+1−K∗v
Pt+1=(I−K∗Hs)∗Pt+1
In the case of GPS, the measurement zg=hg() it is probably just a
transformation from latitude and longitude to the local frame of the
robot, so the Jacobian Hg will be nearly Identity. Rg is
reported directly by the GPS unit in most cases.
In the case of the IMU+Gyro, the function zi=hi() is an integration of
accelerations, and an additive bias term. One way to handle the IMU is
to numerically integrate the accelerations to find a position and
velocity estimate at the desired time. If your IMU has a small
additive noise term pi for each acceleration estimate, then you
must integrate this noise to find the accuracy of the position
estimate. Then the covariance Ri is the integration of all the
small additive noise terms, pi. Incorporating the update for the
bias is more difficult, and out of my expertise. However, since you are interested in planar motion, you can probably simplify the problem.
You'll have to look in literature for this.
Some off-the-top-of-my-head references:
Improving the Accuracy of EKF-Based Visual-Inertial
Odometry
Observability-based Consistent EKF Estimators for Multi-robot
Cooperative
Localization
Adaptive two-stage EKF for INS-GPS loosely coupled system with
unknown fault bias
This field is mature enough that google (scholar) could probably find
you a working implementation. If you are going to be doing a lot of
work in this area, I recommend you pick up a solid textbook. Maybe
something like Probablistic Robotics by S. Thrun of Google Car fame.
(I've found it a useful reference for those late-night
implementations).
*There are several PF-based estimators available in the
Robot Operating System (ROS). However, these have
been optimized for indoor use. Particle filters deal with the
multi-modal PDFs which can result from map-based localization (am I
near this door or that door). I believe most outdoor
implementations (especially those that can use GPS, at least
intermittently) use the Extended Kalman Filter (EKF). I've
successfully used the Extended Kalman Filter for an outdoor, ground
rover with differential drive.
You can greatly simplify the problem in most common cases:
The "typical" solution for us is to use odometry + IMU to get an ego-motion estimate and then use GPS to correct X,Y,Z and heading bias.
Here is an EKF implementation that we extensively used. If you need to estimate the IMU's orientation (i.e. if it does not already have a built-in filter), you can also use on of these two filter: UKF and EKF.
fonte