Detalhamento
Implementação do modelo probabilístico da pose do robô simulado (P(x|x_1,u)) no ExplorerSim
Na função UpdateMap do ExplorerSim (ExplorerSim.cs), no final, o comando abaixo envia os dados do LRS para serem colocados no mapa:
_map.Add(-_state.X, _state.Y, (_state.Theta - 90), DistanceMeasurements.Length, DistanceMeasurements);
O vetor pose (_state.X, _state.Y, _state.Theta) (x no modelo probabilístico) neste ponto é preciso na simulação. Assim, o trabalho consiste em mostrar a imprecisão probabilística desta pose no mapa conforme os modelos e algoritmos que estudamos. Os modelos e algoritmos a serem usados são:
- Sample Odometry Motion Model (Slide 25 do arquivo 2-motion-models.ppt - pegar versão atualizada no wiki)
- Particle Filter Algorithm (Slide 16 do arquivo 4-particle-filters.ppt)
A idéia é produzir no mapa uma figura como a do slide 26 do arquivo 2-motion-models.ppt. Isso pode ser feito da seguinte forma:
- Criar uma arquivo à parte para suas implementações
- Neste arquivo, criar uma função que mantenha 500 particulas de pose (cada uma delas é um vetor pose) para cada posição que o robô ocupar
- Devem ser criadas 500 para a posição inicial, mais 500 para a posição após o primeiro movimento, mais 500 para o segundo movimento, etc.
- Ao final de cada movimento do robô, o novo conjunto de partículas deve ser gerado a partir do imediatamente anterior conforme o Particle Filter Algorithm
- Mostrar estas partículas no mapa do mesmo modo que é mostrado o robô, isto é, sem interferir com o algoritmo que usa o mapa (ver arquivo Mapper.cs, função Map)
- As partículas devem ser removidas no início da função Map e os pixels que elas sobrepuseram previamente devem ser restaurados
- Ao final da função Map, os pixels que as partículas vão sobrepor devem ser salvos e só então as partículas devem ser colocadas no mapa (ver arquivo Mapper.cs, função Map)
A solução acima é focada na visualização do funcionamento do Sample Odometry Motion Model e do Particle Filter Algorithm. Numa implementação final (para controlar o robô), apenas um conjunto de 500 partículas será mantido a cada passo (não serão adicionadas mais 500 partículas a cada passo). Levem isso em considerão ao implementar o código para facilitar a migração do código para a versão que usaremos para controlar o robô.
Sobre o estilo do código:
- Escrevam o código em Inglês (ver o código que coloca o robô no mapa)
- Façam o código estruturado: funções pequenas que caibam em uma tela - se passou de uma tela, considere dividir a função em duas ou mais funções que são chamadas por uma terceira
- Abusem do tamanho dos nomes de variáveis e funções para evitar comentários desnecessários
- Pensem antes de escolher um nome de variável ou função
- Usem o padrão de nomes do ExplorerSim (letras maiúsculas e minúsculas e _ em nomes de variáveis e funções)
- Revisem os nomes de variáveis ou funções de tempos em tempos (a medida que o código vai evoluindo, vai ficando mais claro o que cada função faz e o significado de cada variável)
- Usem o Google para checar a ortografia das palavras em Ingles
- Comentem blocos que fazem coisas não óbvias
Trabalhem de modo a produzir código útil. Código incompleto é melhor do que zero código. Zero é péssimo!