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

10

Estoy construyendo un laberinto automático de laberintos y utilizando 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 bola 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 del controlador del motor paso a paso que estoy usando es la placa del controlador del motor paso a paso del huevo: enlace

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 bola?

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

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

enlace

También encontré una herramienta de procesamiento de imágenes en la que resolvieron el mismo problema utilizando puntos de paso para el movimiento de la bola. Al ver demasiadas soluciones para el mismo problema, estoy totalmente confundido en resolver el problema. Soy consciente de que debo implementar un controlador PID. Pero, ¿cómo debo solucionar los problemas en etapas? Estoy atascado y solo frustrado por encontrar una ventaja en la solución del problema.

Mi configuración se ve así:

...yaquíhayunacapturadepantallademisoftware:

Revisión 2: También estoy enfrentando un nuevo problema ahora: Anteriormente, controlaba los motores paso a paso a través del subprograma Java del puerto serie Arduino. Soy capaz de conducir los steppers utilizando 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 obtuve el algoritmo PID implementado. Por favor encuentre el video a continuación: enlace

Ahora tengo un problema con la velocidad a la que se implementa el algoritmo PID. En realidad, mi procesamiento de imágenes finaliza un ciclo en 200 ms, identifica una bola y envía los comandos a la placa del controlador del motor paso a paso. Aunque a mi puerto serie se le envían 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 PID con un límite máximo donde, si el valor PID calculado es mayor que 100, debería enviar un 100. Espero escuchar sus comentarios sobre esto.

La forma en que implementé el controlador PID es que identifiqué el punto de inicio de la plantilla usando el algoritmo de coincidencia de plantillas e identificé la bola usando otro algoritmo de coincidencia de plantillas. Ahora, hice que la bola se moviera al centroide de la plantilla del punto de inicio. ¿Cómo puedo hacer que siga la línea recta con el algoritmo PID?

Revisión 4:

He aislado la trayectoria pero no puedo encontrar la función correcta para imprimir las coordenadas de píxeles correctas desde el punto de inicio. ¿Algún pensamiento?

    
pregunta Sai

2 respuestas

2

Primero, dado que los steppers son excelentes para posicionar (no es necesario un feedback de posición), debes limitar su movimiento como lo has dicho tú mismo. No estoy seguro de cómo se diseña el eje del motor en este momento, pero si se lo fija al motor, permitir que continúe 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á ralentizar mucho las cosas para reducir la velocidad de la bola. Similar a lo que Rocket Surgeon dijo, usted debería 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 bola en cada cuadro. Si desea omitir este paso rápidamente, busque una bola roja en lugar de esta, y luego marque 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 de este a oeste y otro para el de norte a sur. Si tiene dos motores exactos, sus parámetros deben ser iguales.

Para que un controlador PID actúe, debe conocer el error : diferencia entre la posición deseada y la posición real de la bola. 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 debes tener la posición deseada en tu ruta: una trayectoria .

Para obtener la trayectoria, debe procesar la imagen y obtener la ruta , así como su punto de inicio y final. No estoy seguro de si su algoritmo es capaz de distinguir la ruta del resto de la placa en este momento, pero si no es así, tenga en cuenta que este es un algoritmo propio que debe manejarse antes de continuar. De nuevo, 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 la coordenada deseada sobre la ruta, desde el inicio hasta el final. Obviamente, comenzará con una velocidad baja deseada.

Entonces, antes de comenzar con el control, primero debes 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 en su ruta utilizando una velocidad predefinida
  • En cada cuadro:
    • Calcule la diferencia entre la trayectoria y la posición de la bola
    • 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 segmento a segmento , y continuar con el siguiente segmento cuando esa bola termine la anterior. De lo contrario, deberás tener cuidado de que la bola no sobrepase la trayectoria deseada (lo que puede ser difícil de lograr)

    
respondido por el Groo
1

Si tiene una posición fija para la lectura de la cámara y la distancia de ambos ejes, entonces no necesita reconocer la trayectoria pintada, 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 tenga que localizar la ubicación exacta de la bola de metal brillante.

Para ubicar la bola, puede usar 1 LED IR de punto 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 real, Y teniendo en cuenta pasos como:

  • encuentra el píxel más brillante
  • use el ángulo para ambos ejes (lectura desde el servo) para recuperar la distancia desde la cámara
  • use la marca de tiempo para la lectura de la posición de los ejes
  • aplicar la interpolación a través del tiempo para la lectura de la posición si es necesario
  • utiliza la distorsión conocida de la lente
  • traduce el mundo X, Y del píxel al ángulo de reflexión de la esfera perfecta para encontrar el verdadero centro de la bola en el mundo X, Y
  • tiempo delta para recuperar el tiempo real del cuadro
  • interpolación en el momento de la posición en el plano X, Y de placa si es necesario
  • enviar el 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 en su mayoría depende de un par de valores absolutos.

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

    
respondido por el user924

Lea otras preguntas en las etiquetas