Pergunta

Eu tenho um robô que usa um mouse óptico como uma pista de posição. Basicamente, como os movimentos do robô é capaz de controlar alterações em X e Y instruções usando o rato. O rato também faixas que direcção em que se movem - ou seja negativa ou X X. positivo Estes valores são somados em separado X e Y registos.

Agora, a rotação do robô no lugar e se move para frente única. Assim, o movimento do robô é idealmente em linhas retas (embora o rastreamento do mouse desvios pode pegar se você desviar) em ângulos específicos. Um conjunto específico de movimentos do robô seria como:
A: Girar 45 graus, mova 3 polegadas
B: Rodar 90 graus, mover 10 polegadas
C: Rodar -110 graus, movimento 5 polegadas
D: Girar 10 graus, mover uma polegada
Mas cada vez que os registros do mouse X e rato Y dar as distâncias reais que moveu em cada direção.
Agora, se eu quiser repetir o conjunto movimento vai de A a D somente, como posso fazer isso usando as informações que já recolhidas. Eu sei que posso basicamente somar todos os ângulos e distâncias I alimentam-lo já, mas este viria a ser imprecisa se havia grandes erros em cada ordens de movimento. Como posso usar a informação bruta do meu mouse? Um amigo forneceu uma ideia que eu poderia continuamente seno e cosseno os valores do mouse e calcular o vector final, mas eu realmente não estou certo de como isso iria funcionar.

O problema é que o rato só dá leituras relativas de modo rotativo ou se movendo para trás, você está potencialmente apagar informações. Então, sim, o que eu estou querendo saber é como você pode implementar o algoritmo para que ele possa continuamente rastrear alterações para dar-lhe um caminho mais curto se você moveu em ziguezagues para chegar lá originalmente.

Foi útil?

Solução

Eu acho que o algoritmo básico que você precisa fazer é o seguinte:

currentX = currentY = 0;
heading = 0; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}

Você está certo em sua idéia de que isso não vai ser preciso. É chamado de "navegação estimada" por uma razão.

Onde você pode obter o seu deltas.Heading baseado no "X" coordenar (a fórmula será (deltax em polegadas) / (distância do sensor do mouse em polegadas do centro de rotação). Além disso, o deltas.Distance viria de o "Y" sensor, depois de convertê-lo de pixels para polegadas.

Depois de realizar os passos, você poderia fazer algo como:

robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
    heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();

... etc ...

Outras dicas

Não é uma resposta à sua pergunta, mas talvez um conto preventivo ... Eu fiz exatamente este tipo de robô como um projeto da escola um ano atrás. Foi um fracasso total, embora eu aprendi um pouco ao fazê-lo. Quanto a usar o mouse para acompanhar o quão longe você tem impulsionado: Não funcionou bem para nós em tudo, ou qualquer um dos outros grupos. Provavelmente porque a câmera no rato estava fora de foco devido ao fato de que precisávamos para ter o mouse alguns mm acima do piso. No ano seguinte nenhum grupo fazendo o mesmo projeto usado este methid. Eles, em vez colocar marcas nas weels e usou um ir-sensor de simples para calcular quantas revoluções as rodas feitas.

Eu sei que estou um pouco necroing esta discussão, mas se você queria rastreamento ângulo mais preciso, dois ratos ópticos seria o ideal. Basicamente, se você cancelou o movimento na mesma direção, você ficaria com o movimento que os ratos fizeram em relação ao outro. De lá, ele seria apenas uma matemática simples para determinar com precisão o quanto o 'bot se transformou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top