Implementación del algoritmo PID usando visión por computadora

10

Estoy construyendo un solucionador automático de laberintos de laberintos y estoy usando una cámara web para controlar mi laberinto.

Basado en sugerencias en otros foros, estoy tratando de controlar el movimiento de la bola del laberinto al menos en una dirección en este momento. Entonces, estoy tratando de controlar el movimiento de mi pelota entre dos coordenadas 466,288 y 466,152. La entrada a la placa del controlador del motor paso a paso es el tiempo, no hay pasos para rotar para cada eje, es decir, x e y.

La placa controladora del motor paso a paso que estoy usando es la placa controladora del motor paso a paso egg bot: http://www.sparkfun.com/products/10025

Entonces, para moverme entre dos puntos, ¿debo crear una cantidad de puntos intermedios entre los dos puntos, es decir 288 y 152 (digamos 260 240 230 ... 150) y corregir el movimiento de mi pelota?

Mi algoritmo de procesamiento de imágenes no es lo suficientemente rápido como para seguir la bola que la bola simplemente giraría y caería en un agujero.

Algunos sugirieron que use una plantilla estándar como se muestra en el siguiente video y corrija los movimientos de mi bola para la desviación en el camino:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

También me encontré con una herramienta de procesamiento de imágenes donde resolvieron el mismo problema utilizando puntos de paso para el movimiento de la pelota. Al ver demasiadas soluciones al mismo problema, estoy totalmente confundido al resolver el problema. Soy consciente de que debería implementar un controlador PID. Pero, ¿cómo debo resolver los problemas por etapas? Estoy atascado y frustrado al encontrar una ventaja inicial para resolver el problema.

Mi configuración se ve así:

imagen de configuración

... y aquí hay una captura de pantalla de mi software:

captura de pantalla

Revisión 2: Ahora también me enfrento a un nuevo problema: antes controlaba los motores paso a paso a través del applet Java de puerto serie Arduino. Puedo conducir los steppers usando el applet.

Tengo que restablecer la placa cada vez que intento comunicarme a través del puerto serie. Además, el motor paso a paso se energiza en pequeños intervalos cuando no se le envía ningún comando. Cuando el motor paso a paso entra en este modo, no puedo controlar mi placa sin reiniciarla. Cualquier ayuda sería apreciada.

Revisión 3:

Hice algunos progresos donde conseguí implementar el algoritmo PID. Encuentre el video a continuación: http://www.youtube.com/watch?v=MEfp7RqPmqY

Ahora tengo un problema con la velocidad a la que se implementa el algoritmo PID. En realidad, el procesamiento de mi imagen finaliza un ciclo en 200 ms, identifica una bola y envía los comandos a la placa controladora del motor paso a paso. Aunque mi puerto serie recibe comandos para cambiar de dirección, mi stepper sigue girando en la misma dirección. Puedes encontrar el comportamiento extraño en el video de arriba.

Mi idea es que debería restringir los valores de PID con un límite máximo en el que si el valor de PID calculado es mayor que 100, debería enviar un 100. Espero escuchar sus opiniones sobre esto.

La forma en que implementé el controlador PID es que identifiqué el punto de partida de la plantilla usando el algoritmo de coincidencia de plantilla e identifiqué la pelota usando otro algoritmo de coincidencia de plantilla. Ahora, hice que la pelota se moviera al centroide de la plantilla de punto de partida. ¿Cómo hago que siga la línea recta con el algoritmo PID?

Revisión 4:

Trayectoria de la gota aislada

He aislado la trayectoria pero no puedo encontrar la función correcta para imprimir las coordenadas de píxel correctas desde el punto de partida. ¿Alguna idea?

Sai
fuente
1
Re PD: Entonces solo publique un enlace a la imagen y estoy seguro de que alguien vendrá y lo reemplazará con la imagen en sí ...
Majenko
@Matt - ¡Solucionado! Sin embargo, preferiría que el usuario proporcionara el texto para ir con las imágenes, no solo los enlaces a las imágenes. No estoy seguro de dónde @Sai los quería, solo los puse en la parte inferior.
Kevin Vermeer
Wow ... ¿Tienen esos steppers un torque suficiente para mover la tabla a cualquier velocidad? Espero que haya alguna reducción de equipo allí en alguna parte.
Connor Wolf
@Fake: los steppers no deberían tener ningún problema con esto. La tabla no pesa mucho y su peso es equilibrado. Tengo un reloj de pared con agujas de 40 cm de largo y está controlado por el mismo mecanismo pequeño que cualquier otro, que también es un paso a paso. (El mecanismo de 5 cm x 5 cm parece ridículamente pequeño en comparación con el diámetro de 80 cm del reloj)
stevenvh
@Fake: Steve tiene razón. No tengo problema con el paso a paso. Se trata del algoritmo PID
Sai

Respuestas:

2

Primero, dado que los steppers son excelentes para el posicionamiento (no hay necesidad de una retroalimentación de posición), ciertamente debes limitar su movimiento como lo has dicho tú mismo. No estoy seguro de cómo está diseñado el eje del motor en este momento, pero si se fija al motor, dejar que siga girando podría dañar el equipo.

A continuación, el retraso de transporte de 200 ms en su sensor probablemente será demasiado lento, de lo contrario, deberá reducir la velocidad mucho para reducir la velocidad de la bola. De manera similar a lo que dijo el cirujano de cohetes , debe simplificar el algoritmo de procesamiento de imágenes para calcular la ruta solo una vez y luego calcular rápidamente solo la posición de la pelota en cada cuadro. Si desea omitir este paso rápidamente, busque una bola roja en lugar de esta, y luego verifique solo el componente rojo en su imagen RGB, hasta que encuentre un algoritmo mejor.

Para el control PID, comience con el hecho de que realmente necesita dos controladores PID separados, uno para el motor este-oeste y el otro para el norte-sur. Si tiene dos motores exactos, sus parámetros deben ser iguales.

Para que un controlador PID actúe, necesita conocer el error : diferencia entre la posición deseada y la posición real de la pelota. Los componentes X e Y de este desplazamiento serán las entradas para dos controladores PID (uno para cada motor). Para obtener el error, primero debe tener la posición deseada en su camino: una trayectoria .

Para obtener la trayectoria, debe procesar la imagen y obtener la ruta , así como su punto de inicio y finalización. No estoy seguro de si su algoritmo es capaz de distinguir la ruta del resto del tablero en este momento, pero si no, tenga en cuenta que este es un algoritmo propio para manejar antes de continuar. Nuevamente, puede omitir esta parte ingresando manualmente los puntos de unión, si está ansioso por ver algunos resultados rápidamente. En cualquier caso, debe poder definir la velocidad del punto de ajuste y hacer que su software mueva la posición de coordenadas deseada sobre la ruta, desde el principio hasta el final. Obviamente, comenzará con una velocidad baja deseada.

Entonces, antes de comenzar con el control, primero debe revisar la siguiente lista de verificación:

  • Simplifique su algoritmo de procesamiento de imágenes para obtener una respuesta más rápida
  • Cree un algoritmo que cree una trayectoria sobre su camino utilizando una velocidad predefinida
  • En cada cuadro:
    • Calcule la diferencia entre la trayectoria y la posición de la pelota.
    • Pase el componente delta-X al PID este-oeste, pase el delta-Y al PID norte-sur

Puede resultar que es mejor crear la trayectoria un segmento a la vez , y continuar con el siguiente segmento cuando esa bola termina el anterior. De lo contrario, deberá asegurarse de que la pelota no sobrepase la trayectoria deseada (que puede ser difícil de lograr)

Groo
fuente
1

Si tiene una posición fija para la cámara y una lectura momentánea para ambos ejes, entonces no necesita reconocer el camino pintado, los agujeros y las paredes en los marcos. Se puede hacer de una sola vez durante el tiempo de configuración. En tiempo de ejecución, es posible que solo necesite detectar la ubicación exacta de la única bola de metal brillante.

Para detectar la bola, puede usar 1 LED IR fijo y filtro de banda estrecha en la cámara. El algoritmo debe calcular el píxel más brillante y traducir X, Y a X, Y real teniendo en cuenta pasos como:

  • encontrar el píxel más brillante
  • use el ángulo para ambos ejes (lectura del servo) para recuperar la distancia desde la cámara
  • use la marca de tiempo para la lectura de posición de los ejes
  • aplicar interpolación a través del tiempo para la lectura de posición si es necesario
  • usar distorsión de lente conocida
  • traduce el mundo X, Y del píxel al ángulo de reflexión desde la esfera perfecta para encontrar el verdadero centro de la bola en el mundo X, Y
  • tiempo delta para recuperar el tiempo real del fotograma
  • interpolación en el momento de la posición en el plano X, Y si es necesario
  • enviar resultado X, Y (t) al algoritmo PID
  • enviar el segundo objetivo de alimentación X, Y (t) desde el generador / secuencia de trayectoria
  • Deje que PID decida sobre la salida
  • ejecutar salida (los últimos pasos se pueden hacer en paralelo)

No debe ser computacionalmente intensivo y depende principalmente de un par de valores absolutos.

Normalmente, una CPU pequeña debería hacerlo con el ritmo de la velocidad de fotogramas.


fuente
No estoy seguro de entender tu solución. Encuentro su solución interesante. ¿Cómo me aseguro de que mi bola sigue el camino correcto? ¿Debo asegurarme de tener un conjunto de puntos de referencia a seguir?
Sai
Si. El software de control de movimiento siempre debe tener un "generador de trayectoria", que es una rutina que produce una secuencia finita ideal de X, Y (t) para cualquier paso dado en el tiempo. Esta secuencia se alimenta a la primera entrada del bucle de control, la segunda entrada del bucle de control es la secuencia de posiciones reales. La rutina de control debe calcular los errores de posición / velocidad / aceleración y amplificar / sumar todos los errores de acuerdo con el PID y producir las señales de corrección resultantes.