Pregunta

Tengo un robot que utiliza un ratón óptico como una pista de posición. Básicamente, como el robot se mueve, es capaz de realizar un seguimiento de cambio en direcciones X e Y utilizando el ratón. El ratón también rastrea qué dirección se está moviendo - es decir, X negativo o positivo X. Estos valores se suman en X independiente y registros y.

Ahora, el robot gira en su lugar y se mueve hacia delante solamente. Por lo que el movimiento del robot es lo ideal en línea recta (aunque el seguimiento del ratón puede desviaciones de recogida Si desviarse) en ángulos particulares. Un conjunto particular de movimientos del robot sería como:
A: Girar 45 grados, mueva 3 pulgadas
B: girar 90 grados, mover 10 pulgadas
C: Girar -110 grados, mueva 5 pulgadas
D: Girar 10 grados, mover 1 pulgada
Pero cada vez que el ratón y X registros de ratón Y dan las distancias reales que movió en cada dirección.
Ahora, si quiero repetir el movimiento conjunto de ir de A a D solamente, ¿cómo puedo hacer esto utilizando la información que ha recopilado. Sé que básicamente puedo resumir todos los ángulos y distancias que se introduce en él ya, pero esto resultaría ser inexacto si hubo grandes errores en cada órdenes de movimiento. ¿Cómo puedo utilizar la información en bruto del mouse? Un amigo proporciona una idea que pude continua seno y coseno los valores del ratón y calcular el vector final, pero no estoy muy seguro de cómo funcionaría.

El problema es que el ratón sólo da lecturas relativas de modo que giran o se desplazan hacia atrás, que están borrando información potencialmente. Así que sí, lo que me pregunto es cómo se puede implementar el algoritmo para que pueda realizar un seguimiento de los cambios continuamente para darle un camino más corto si la trasladó en zigzag para llegar allí en un principio.

¿Fue útil?

Solución

Creo que el algoritmo básico que tiene que hacer es lo siguiente:

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;
}

Tiene usted razón en su idea de que esto no será precisa. Se llama "navegación a estima" por una razón.

¿Dónde puede obtener su deltas.Heading basado en la "X" de coordenadas (la fórmula será (deltax en pulgadas) / (distancia del sensor del ratón en pulgadas desde el centro de rotación). Además, el deltas.Distance vendría de el sensor de "Y", después de convertir desde píxeles a pulgadas.

A continuación, para llevar a cabo los pasos, usted podría hacer algo como:

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

... etc ...

Otros consejos

No es una respuesta a su pregunta, pero tal vez una advertencia ... Hice exactamente este tipo de robot como un proyecto de la escuela un año atrás. Fue un completo fracaso, aunque he aprendido un poco mientras lo hace. En cuanto a usar el ratón para el seguimiento de lo lejos que han impulsado: No funcionó bien para nosotros en absoluto, o cualquiera de los otros grupos. Probablemente porque la cámara en el ratón estaba fuera de foco debido al hecho de que teníamos que tener el ratón unos pocos mm por encima del suelo. Al año siguiente, ningún grupo haciendo el mismo proyecto utilizó este methid. En su lugar, poner marcas en los weels y utilizan un simple ir-sensor para calcular el número de revoluciones de las ruedas hechas.

Sé que estoy un poco necroing este hilo, pero si quería seguimiento más preciso del ángulo, dos ratones ópticos sería ideal. Básicamente si canceló a cabo el movimiento en la misma dirección, que se quedaría con el movimiento que los ratones hizo en relación a unos de otros. A partir de ahí, no sería más que un poco de matemática simple para determinar con precisión hasta qué punto el 'bot ha convertido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top