WALL-E
Contenido
Introducción
Día a día, el cuidado del medio ambiente resulta cada vez más importante. Son muchas las maneras de ayudar con este problema, una de ellas es el reciclado de materiales. Esta es de vital importancia ya que es una forma directa en la que toda la población puede colaborar. El reciclaje tiene como objetivo, no solamente reducir los desechos en una sociedad, sino también intenta amainar el uso excesivo de los recursos naturales. Por ejemplo, si se recicla el papel, ayuda a reducir la deforestación.
En la educación, sobre todo en la etapa escolar, es cada vez más utilizada la temática del reciclaje. Esta sirve como primer paso para continuar con otras prácticas de cuidado del medioambiente. En Uruguay tambien existen proyectos con el objetivo de generar, desde la primera infancia, concientización sobre el tema; dos ejemplos interesantes son: Repapel [1] y Proyecto de Vermicompostaje en Primaria [2].
A partir de estas dos puntas surge la motivación de este proyecto: utilizar la robótica para transmitir el mensaje a niños y adolescentes, principalmente a escolares de 5º y 6º o liceales de ciclo básico.
La idea del proyecto es crear un robot clasificador de residuos secos. Para poder realizarlo, se definen 3 tipos de residuos y cada uno es representado por estos 3 colores: negro, gris, y blanco. El robot Butiá, a través de un sensor de grises y un sensor de distancia, detecta e identifica el tipo de residuo. Una vez identificado lleva a él mismo por el carril correspondiente (utilizando un seguidor de linea), habiendo 3 carriles, uno para cada residuo. Una vez que lleva el residuo al final del carril, retorna y vuelve a la posición inicial.
Para que el robot pueda arrastrar los objetos se le agrega en cada lado de la parte frontal, plaquetas del kit Butiá para ser utilizadas como brazos.
Materiales
- Kit Robótico Butiá [3].
- 3 sensores de grises.
- 1 sensor de distancia.
- Papel blanco, negro y gris.
- Cartón Duro.
- Cinta Aisladora Negra.
- XO/PC con TurtleBots [4].
Construcción de la Pista
En este tutorial la pista será creada usando cinta aisladora negra sobre un piso claro (si se quiere utilizar cinta aisladora blanca sobre un piso oscuro, al final del tutorial se indican las consideraciones a tener).
En este caso, la pista que se presenta es con forma de tridente, lo que no implica que no pueda tener otra forma. Lo importante es que se mantengan las barreras perpendiculares en las puntas de cada carril.
A continuación se muestra una foto de un ejemplo de pista y sus medidas correspondientes, esto es a modo de guía por lo que las dimensiones pueden variar.
En caso de que se quiera modificar la pista hay que tener en consideración que todas las intersecciones tienen que ser perpendiculares, esto aplica para la intersección central y para las 4 puntas de la pista. También hay que tener en consideración que el largo de cada tramo sea lo suficientemente grande para que el robot pueda hacer un giro de 180 grados y no irse de él mismo.
Construcción del Robot
Armado de módulos:
- Paso 1: Armar el Robot siguiendo la guiá oficial [5]
- Paso 2: Tomar dos barras de encastre y unirlas en forma de T
- Paso 3: Agregar 3 tornillos desde la barra blanca y ajustarlos con 3 tuercas
- Paso 4: Colocar el sensor de distancia utilizando el lado en el que hay solo un tornillo, luego apretarlo con un tuerca
- Paso 5: Colocar el sensor de grises utilizando el lado que tiene 2 tornillos, luego apretarlo con tuercas
- Paso 6: Armar 2 brazos, para cada uno alinear 3 barras de encastre y ajustar cada una con 2 tornillos y tuercas
Uniendo todo:
- Paso 1: Colocar las 2 barras en forma de T en el centro de la parte delantera, de forma que pueda sensar cualquier objeto que se le presente delante de él. Para este tutorial se usaron los mismos 2 tornillos que fueron utilizados para ajustar la rueda loca.
- Paso 2: Colocar cada brazo a cada lado de la pieza que se colocó anteriormente, de modo que el objeto que se detecte quede "atrapado" entre ambos brazos. Para este tutorial se utilizan los mismos tornillos usados para ajustar los brazos que para colocar los sensores de grises que se detallan en el siguiente paso.
- Paso 3: Colocar en la parte delantera los 2 sensores de grises "apuntando" hacia el piso, uno de cada lado del robot (izquierda y derecha). Es importante que la distancia entre ambos sensores sea mayor al ancho de la línea.
- Paso 4: Conectar los sensores a los respectivos puertos de la placa Butiá. En este ejemplo:
Puerto 1 - Sensor de grises frontal Puerto 2 - Sensor de distancia frontal Puerto 4 - Sensor de grises derecho Puerto 5 - Sensor de grises izquierdo
A continuación se muestra un video uniendo todas los módulos del robot.
Armado del residuo:
Crear el objeto que represente al residuo, se recomienda crear un cubo con carton, y pegar en cada cara un papel de los siguientes colores; grises, blanco, y negro.
El ancho y alto de cada una de las caras debe ser mayor a la altura del robot, para evitar que el robot se tranque con el objeto.
Implementación
Se deja disponible el código para TurtleBots Archivo:WALLE-LineaNegra.tb.
A continuación se muestra el código, por el orden de ejecución. En muchas partes de esta sección se menciona la etapa de calibración, toda la información relacionada a esa etapa se encuentra en la sección
Los bloques del Plugin Butiá donde figuran los sensores tienen el siguiente mapeo:
distance Butia: El sensor de grises que está ubicado en la parte frontal, el cual se usa para detectar el objeto. gray Butia: El sensor de grises que está ubicado en la parte frontal, el cual se usa para identificar el objeto. gray Butia1: El sensor de grises ubicado en la parte izquierda, el cual se usa para seguir el carril gray Butia2: El sensor de grises ubicado en la parte derecha, el cual se usa para seguir el carril
- Método Principal:
Aquí se configuran las distintas constantes que deben ser calibradas previo a la ejecución.
Luego se ejecuta de forma infinita el método encargado del control del robot (Clasificar)
- Método Clasificar:
En este método se encuentra todo el código necesario para el control del robot:
1: Primero el robot detecta e identifica el objeto, definiendo el carril que corresponde seguir. 2: Luego avanza hasta la primera intersección que detecta (separación entre carriles). 3: Rota hacia el carril correcto 4: Luego avanza hasta la primera intersección que detecta (final de la pista). 5: Retrocede un poco (para no arrastrar el objeto) y rota 180 grados. 6: Luego avanza hasta la primera intersección que detecta (separación entre carriles). 7: Rota hacia el carril correcto (el carril inicial). 8: Luego avanza hasta la primera intersección que detecta (final de la pista). 9: Rota 180 grados y se vuelve al paso 1.
- Metodo Seleccion Carril:
Aquí se queda en espera hasta que el sensor de distancia detecte un objeto a una distancia menor y a una mayor a las predefinidas (etapa de calibración).
Luego de que se detecta el objeto y se identifica el color, se define el carril a seguir.
Objeto Blanco: Carril central (valor = 0)
Objeto Gris : Carril izquierdo (valor = 1)
Objeto Negro : Carril derecho (valor = 2)
La muestras del sensor de grises y de distancia son obtenidas luego de aplicado un filtro, donde se hace un promedio de N muestras tomadas.
Se realiza el filtro para eliminar posibles ruidos de los sensores.
- Método Tomar Muestra Distancia Objeto:
Como se mencionó anteriormente, se aplica un filtro al sensado de distancia del objeto.
Por lo que aquí se toman N muestras y se guarda el resultado del promedio de estos valores.
- Método Tomar Muestra Color Objeto:
Se aplica un filtro al sensado de grises del objeto.
Por lo que aquí se toman N muestras y se guarda el resultado del promedio de estos valores.
- Método Avanzar Hasta Intersección:
Este método es básicamente un seguidor de líneas, con el detalle de que el robot frena cuando detecta una intersección.
El robot infiere que está sobre una intersección cuando ambos sensores de grises detectan que se está sobre la línea al mismo tiempo.
- Método Rotar Carril Elegido:
Este método se encarga de rotar al carril elegido previamente (0=Saltar intersección, 1=Rotar hacia la izquierda, 2=Rotar hacia la derecha).
Dependiendo del carril se llama al método encargado de realizar la maniobra requerida.
Es importante destacar que cuando hay que rotar hacia la izquierda o derecha, se cambia el valor de carril elegido para que cuando retorne doble hacia el lado inverso.
- Método Rotar Al Carril Izq:
Aquí el robot rota hacia el carril izquierdo, esto lo hace girando el robot por un tiempo predefinido en calibración.
Esto con el objetivo de que el sensor de grises derecho saltee el carril central. Una vez salteado el carril central se sigue doblando hasta que el sensor derecho detecte la línea, que deberá corresponderse con el carril izquierdo.
- Método Rotar Al Carril Der:
Este método es análogo al anterior pero para el carril contrario.
- Método Saltear Intersección:
Cuando se quiere saltear la intersección se avanza un poquito para asegurar que se está sobre la misma. Y se sigue avanzando recto hasta que ambos sensores de grises detecten que están fuera de la línea.
- Método Giro 180:
Este último método realiza un giro 180 sobre la línea. Aquí se gira hacia la derecha sobre el lugar un tiempo predefinido en calibración, para que ambos sensores queden fuera de la línea.
Luego se sigue girando hasta que el sensor de izquierda detecte que está sobre la línea.
Calibración
Para el correcto funcionamiento es necesario calibrar las constantes. Esto se debe hacer en un ambiente similar al de ejecución.
Hay 11 valores a calibrar, todos son definidos en el método Principal. A continuación se detallan cuales son y cómo se deberían calibrar.
Para obtener los valores del sensado se recomienda conectar el robot y hacer click sobre el bloque del sensor que se está calibrando en TurtleBot, con esto se obtiene el valor de sensado.
- umbral_objeto_maximo:
Aquí se define la distancia máxima a la cual el robot detecta el objeto, es importante que esta distancia sea lo suficientemente chica para que el sensor de grises detecte correctamente el color. Para el kit Butiá esta distancia oscila entre 2 a 7 cm.
Para encontrar ese valor se conecta el robot y haciendo click sobre el bloque del sensor en TurtleBot se obtiene el valor de sensado, se debe ir moviendo el objeto delante del sensor buscando encontrar el valor de sensado que asegure que la distancia máxima sea válida.
- umbral_objeto_minimo:
Aquí se define la distancia mínima a partir de la cual el robot comienza a detectar el objeto, es importante que esta distancia sea lo suficientemente cercana a la máxima para que el sensor de grises no tenga muchas variaciones a la hora del sensado.
El valor aquí es aquel que deja al robot detectar el objeto de forma razonable teniendo como tope el máximo definido preventivamente, tratando de minimizar la diferencia entre el máximo y el mínimo.
- umbral_blanco:
Aquí se define el umbral que separa entre el gris y blanco del objeto a clasificar.
Para encontrar este valor, colocar el objeto dentro del rango definido anteriormente. Luego alternar entre las caras blancas y grises para encontrar un valor medio entre las medidas sensadas para ambos colores.
- umbral_gris:
Aquí se define el umbral que separa entre el gris y negro del objeto a clasificar.
El procedimiento es análogo al usado para umbral_blanco, pero con las caras negras y grises.
- umbral_linea_der
Aquí se define el umbral que permite al robot identificar que el sensor derecho está sobre la línea o fuera.
Para encontrar este valor, colocar el sensor sobre el borde de la línea y el valor sensado es el utilizado para este umbral.
- umbral_linea_izq
Aquí se define el umbral que permite al robot identificar que el sensor derecho está sobre la línea o fuera.
Para encontrar este valor, colocar el sensor sobre el borde de la línea y el valor sensado es el utilizado para este umbral.
- vel_rueda_izq_adelante:
Aquí se define la velocidad de la rueda izquierda para avanzar.
Un valor razonable es 600, si se quiere que se vaya más rápido o más lento se puede variar a criterio este valor.
- vel_rueda_der_adelante:
Aquí se define la velocidad de la rueda derecha para avanzar.
Un valor razonable es 600, si se quiere que se vaya más rápido o más lento se puede variar a criterio este valor.
- vel_rueda_izq_atras
Aquí se define la velocidad de la rueda izquierda para atrás.
Un valor razonable es -600, si se quiere que se vaya más rápido o más lento se puede variar a criterio este valor.
- vel_rueda_der_atras
Aquí se define la velocidad de la rueda derecha para atrás.
Un valor razonable es -600, si se quiere que se vaya más rápido o más lento se puede variar a criterio este valor.
- tiempo_rotar_carril:
Aquí se define el tiempo que el robot va a girar en la intersección central antes de empezar a detectar si el sensor está sobre la línea.
Este valor se encuentra experimentando, ejecutando el programa y mirando si el robot no frena cuando el sensor pasa sobre la línea del carril central.
El valor depende de la velocidad definida previamente para la ruedas, pero para una velocidad de 600 un valor de 1.5 es posible que funcione correctamente.
- tiempo_dejar_objeto
Aquí se define el tiempo que el robot va hacia atrás antes de realizar un giro de 180 grados.
Este valor se encuentra experimentando, ejecutando el programa y mirando si el robot no arrastra el objeto cuando gira 180 grados.
El valor depende de la velocidad hacia atrás definida previamente para la ruedas, pero para una velocidad de 600 un valor de 0.5 es posible que funcione correctamente.
- tiempo_giro_180
Aquí se define el tiempo que el robot va a girar antes de empezar a detectar si el sensor está sobre la línea.
Este valor se encuentra experimentando, ejecutando el programa y mirando si el robot logra hacer un giro 180 sobre la línea.
El valor depende de la velocidad de las ruedas definida previamente, pero para una velocidad de 600 un valor de 1.5 es posible que funcione correctamente.
- cantidad_de_muestras
Este valor define la cantidad de muestras utilizadas para hacer el promedio de los valores sensados. Se utiliza para el sensor de grises y de distancia aplicados sobre el objeto a clasificar.
Un valor de 10 muestras es razonable, cuanto más alto este valor menor posibilidad de ruido pero con un mayor tiempo de respuesta del robot, y cuanto menor el valor mayor posibilidad de ruido en el sensado pero con un menor tiempo de respuesta.
Tip: Un tip para probar que todo haya quedado calibrado correctamente, es setear todas las velocidades en 0 y ejecutar el programa usando el modo debug (Caracol). Una vez iniciado el programa ir moviendo el robot con la mano simulando el recorrido, con esto podemos ver en el programa TurtleBots como el programa avanza. Esto nos permite ver que todo haya quedado calibrado correctamente y que no haya problemas en el código generado.
En acción
En el siguiente video se puede ver como el robot clasifica el objeto dependiendo la cara que se le muestre. Cuando detecta la cara de color gris va hacia el carril izquierdo, cuando detecta el blanco utiliza el carril central, y si detecta el color negro va hacia el carril derecho.
Para iniciar el clasificador, hay que ejecutar el programa haciendo click en el modo liebre del programa TurtleBot. Es necesario previo a la ejecución tener todos los sensores conectados y el robot conectado a la laptop.
Usar línea blanca sobre un piso oscuro
Si se quiere usar una cinta blanca en lugar de una negra, es necesario realizar modificaciones en el código brindado anteriormente, los cambios son pequeños pero importantes.
Lo que hay que realizar para soportar este cambio es invertir cada comparación entre los valores de los sensores de grises usados para seguir la línea y los umbrales asociados.
Por lo que en cada una de esas comparaciones, hay que cambiar las que son de menor estricto a unas de mayor estricto, y las que son de mayor estricto a una de menor estricto.
Trabajos a futuro
Existen 2 áreas en la que hay espacio a mejoras, la primera es el agarre/empuje del residuo y la otra es la identificación del mismo.
Sobre la primero, existen muchas posibles modificaciones en la forma de que el robot lleva el residuo al destino.
Por ejemplo se pueden utilizar dos abrazaderas para presionar al objeto luego de detectado. También se puede utilizar una pinza para que levante el objeto en vez de arrastrarlo.
Para la identificación, hay 2 cambios que resultan interesantes:
- El primer cambio no aumenta demasiado la dificultad, la idea es cambiar el sensor de grises por uno de colores. Con esto se pueden identificar mayor variedad de objetos, utilizando más cantidad de colores y no solo 3 colores.
- El segundo cambio conlleva un aumento en la dificultad, la idea es reemplazar el sensor de grises por una cámara. Utilizando la cámara se puede reconocer distintos objetos por su forma, por ejemplo identificar botellas, latas, etc.
Posibles Fallas
Luego de ejecutar toda una vuelta, el robot queda un poco torcido
Al hacer el giro 180 al final del recorrido puede pasar que el robot gire un poco más de lo esperado, esto hace que quede un poco desviado, y si bien no debería afectar al funcionamiento es algo que se puede solucionar de forma sencilla.
Para arreglar esto, se puede agregar al final del método ‘Clasificar’ tres bloques. El primero es el bloque para mover la rueda izquierda hacia atrás, luego se debe colocar el bloque de esperar por un tiempo definido y por último la instrucción de frenar el robot Butiá. La velocidad seteada para la rueda y el tiempo de espera se deben seleccionar experimentando con el robot hasta que se logre que quede correctamente alineado luego de una vuelta entera.
No detecta correctamente el tipo de residuo (negro, gris, blanco)
Este problema, como la mayoría de las potenciales fallas, recaen sobre la correcta calibración de las constantes.
Dado que el sensor de grises es muy sensible a la distancia del objeto, es necesario definir un límite estrecho entre la mínima y máxima distancia a la cual el objeto es detectado.
Otra posible causa pueden ser variaciones de luminosidad en el ambiente, es recomendable que las condiciones lumínicas sean constantes a lo largo de la operación del robot.
También la luminosidad del ambiente debe ser similar tanto en la calibración como en la ejecución.
No avanza en línea recta
En muchos casos la velocidad real de cada rueda es diferente entre ellas para una velocidad definida.
Una forma de solucionar esto es ajustar la constantes de la velocidad izquierda y derecha de forma que la velocidad real sea igual para ambas ruedas.
Problemas siguiendo las líneas y detectando intersecciones
La mayoría de los problemas de este tipo son generados por una mala calibración, es importante re-calibrar si el robot no realiza el circuito correctamente.