Mobot#
Artículo de Cosku Acay, Edwin Cho, Kenneth Li y Nishant Pol. PDF.
Descripción del proyecto#
En la competición Mobot de Carnegie Mellon, los robots deben pasar por una serie de 14 puertas colocadas sobre una línea blanca curva de 255 pies en una acera al aire libre. El recorrido incluye dos rampas empinadas y un área de punto de decisión donde el robot debe seleccionar la ruta correcta para pasar por las 14 puertas en orden serial. Dado que la línea está al aire libre y bajo el clima de Pittsburgh, el robot debe funcionar en una variedad de condiciones. Este año estuvo lluvioso y ventoso el día de la competición. Puede encontrar más información en http://www.cs.cmu.edu/mobot/mobot.html


Solución con la CMUcam4#
Elegimos abordar la tarea de seguimiento de líneas usando la CMUcam4 porque requería un hardware mínimo y tenía una interfaz muy adecuada para rastrear una línea.

La CMUcam4 captura una imagen de la línea a 30 fotogramas por segundo y alimenta la imagen de seguimiento de color al Arduino Mega a través de una de las tres líneas serie. El Arduino Mega procesa entonces esta imagen (consulte la descripción del software más abajo) y entrega comandos de velocidad del motor y de giro al controlador PID a través de otra línea serie. El controlador PID a su vez proporciona al Arduino Mega los conteos de encoder de las ruedas derecha e izquierda, lo que nos permite hacer un seguimiento de nuestra posición y orientación relativa a la puerta 0.
El controlador PID (MD-25) está fabricado por Robot-Electronics en el Reino Unido. Impulsa dos motores de escobillas de CC con reductora y encoders magnéticos en el eje del motor. La pantalla LCD es para fines de depuración. Teníamos dos rieles de alimentación, 12V para los motores y 5V para la lógica, compartiendo la misma tierra y ambos alimentados desde una única batería recargable de 12V.
Inicialmente planeamos hacer un prototipo con una base de madera para entrar rápidamente en la fase de programación, y luego trabajar en una base más rápida y fiable como un coche de RC. Sin embargo, descubrimos que el prototipo era muy fiable y fácil de manejar, así que lo conservamos para el diseño final. La impermeabilización del cuerpo consistió en una capa de envoltura de celofán bajo una capa de cinta de embalaje. Sin embargo, la lluvia se filtraba a través de la cinta de embalaje, pero afortunadamente no a través de la envoltura de celofán. La cámara estaba cubierta por un cuadrado de plástico de una bolsa Ziploc, ya que descubrimos que el «filtro» mejoraba la capacidad de la cámara de ignorar pequeños tramos de la línea que, para la cámara, parecían el hormigón de fondo.
Descripción del algoritmo#
Antecedentes#
Usamos la CMUcam4 en modo de seguimiento de color con el modo YUV habilitado, lo que nos da una representación de imagen binaria de la línea. El software de la cámara filtra todo lo que no es blanco (es decir, el fondo) y pone un píxel «encendido» donde hay una línea (donde es blanco). Usamos el modo YUV para que el seguimiento de color sea insensible a la intensidad de la luz, de modo que nuestro robot pueda funcionar bajo una amplia variedad de condiciones, incluidas interiores y exteriores.
Seguimiento de líneas#
La CMUcam4 proporciona a nuestro chip Arduino una imagen binaria de 80 por 60. Muestreamos 10 filas de píxeles equidistantes de la imagen y calculamos el centroide de los píxeles «encendidos» (véase aquí: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Luego asumimos que la línea se encuentra sobre el centroide. Al hacer esto en 10 filas diferentes de la imagen, obtenemos una buena aproximación de la línea conectando los puntos. Podemos entonces usar estos datos encontrando cuán lejos está cada punto de la línea de la línea vertical que se encuentra en el centro de la imagen para obtener un valor que representa cuán curvada está la línea. Esto puede verse como algo parecido a encontrar el área entre la línea tangente y una curva y usar esa área para determinar cuánto necesitamos girar. El signo determina si el giro es a la izquierda o a la derecha, mientras que la magnitud determina cuánto necesitamos girar para seguir la línea. Como cabría esperar, si medimos área cero, entonces la línea está directamente frente al robot y es una línea recta. Si la magnitud del área es grande, entonces el robot necesita girar para intentar minimizar la magnitud de esta área.
Puntos de decisión#
Para determinar si el robot está en un punto de decisión, tomamos los datos que la cámara recopila del seguimiento de líneas y comprobamos cuántos puntos centrales promedio aparecen en el espacio negro. Esto funciona basándose en el supuesto de que el punto promedio entre dos líneas no debería estar en ninguna de las líneas, a menos que las líneas sean la misma línea. Si el robot detecta múltiples puntos promedio en el espacio negro, puede concluir que debe haber dos líneas aquí. Entonces selecciona el giro apropiado y sesga su giro hacia esa dirección hasta que ve solo una línea.
Vaya a https://github.com/cacay/Mobot para ver una versión simplificada de nuestro código o aquí para una copia local.

