Algoritmo para robot que empuja bloques fuera de una zona delimitada por un color

En uno de los grupos de Telegram sobre Arduino en los que participo, un compañero ha solicitado ayuda con un problema de sus estudios de mecatrónica.

Los requisitos vienen a ser los siguientes:

  • Hay un robot en una zona negra circular
  • El exterior de la zona donde está el robot es blanca
  • Dentro de la zona negra hay piezas
  • El robot debe empujar esas piezas fuera de la zona negra
  • Cuenta con dos sensores:
    • De distancia, para detectar objetos
    • De color, para saber si está en la zona negra o la zona blanca
Robot dentro de zona negra, y piezas que tiene que expulsar hacia la zona blanca

Y este es el algoritmo en pseudocódigo que me ha salido en 10 minutos:

ALGORITMO DE RESOLUCION

	VARIABLE AVANCE MAXIMO = RADIO DEL CIRCULO DE LA ZONA NEGRA
	VARIABLE REALIZAR CAMBIO DIRECCION = FALSE

	BUCLE POR SIEMPRE
	
		MIENTRAS DENTRO DE LA ZONA NEGRA
	
			VARIABLE DE DISTANCIA AVANZADA = 0
	
			MIENTRAS DETECTOR DE OBJETO = FALSE
			
				GIRAR 5º
			
				DETECTAR OBJETO
			
			FIN MIENTRAS
	
			AVANZAR 	
			
			REALIZAR CAMBIO DIRECCION = TRUE
			
		FIN MIENTRAS
	
		SI FUERA DE LA ZONA NEGRA && REALIZAR CAMBIO DIRECCION
			
			GIRA A LA DERECHA UN NÚMERO ALEATORIO ENTRE 90 Y 180º
			REALIZAR CAMBIO DIRECCION = FALSE
			
		FIN SI
	
				
		SI VARIABLE DE DISTANCIA AVANZADA < AVANCE MAXIMO
		
			AVANZA 1
			
			VARIABLE DE DISTANCIA AVANZADA = VARIABLE DE DISTANCIA AVANZADA + 1
		
		FIN SI 		
	
	
		SI (VARIABLE DE DISTANCIA AVANZADA >= AVANCE MAXIMO) && FUERA DE LA ZONA NEGRA
		
			REALIZAR CAMBIO DIRECCION = TRUE
			
		FIN SI
		
	
	FIN BUCLE POR SIEMPRE

Consta de dos partes principales:

  1. No salirse de la zona negra y volver en caso de salirse
  2. Empujar la pieza hasta sacarla de la zona negra

La parte de empujar la pieza fuera de la zona negra es la más sencilla. Hacemos una especie de escaneo girando 5º cada vez y avanzamos hasta que estemos fuera de la zona negra:

        MIENTRAS DETECTOR DE OBJETO = FALSE

            GIRAR 5º

            DETECTAR OBJETO

        FIN MIENTRAS

        AVANZAR

Y todo el resto del algoritmo se usa para evitar que el robot salga de la zona negra o que vuelva en caso de que se haya salido. En caso de estar dentro de la zona negra vamos a buscar una pieza y empujarla:

		MIENTRAS DENTRO DE LA ZONA NEGRA
	
			VARIABLE DE DISTANCIA AVANZADA = 0
	
			MIENTRAS DETECTOR DE OBJETO = FALSE
			
				GIRAR 5º
			
				DETECTAR OBJETO
			
			FIN MIENTRAS
	
			AVANZAR 	
			
			REALIZAR CAMBIO DIRECCION = TRUE
			
		FIN MIENTRAS

El resto de condiciones sirven para hacer un giro que nos permita volver a la zona segura, avanzar hasta un máximo que sería el radio del círculo y que en condiciones ideales nos dejaría en el centro, y hacer un nuevo giro en caso de que hayamos avanzado la distancia prevista pero sigamos fuera de la zona negra:

		SI FUERA DE LA ZONA NEGRA && REALIZAR CAMBIO DIRECCION
			
			GIRA A LA DERECHA UN NÚMERO ALEATORIO ENTRE 90 Y 180º
			REALIZAR CAMBIO DIRECCION = FALSE
			
		FIN SI
	
				
		SI VARIABLE DE DISTANCIA AVANZADA < AVANCE MAXIMO
		
			AVANZA 1
			
			VARIABLE DE DISTANCIA AVANZADA = VARIABLE DE DISTANCIA AVANZADA + 1
		
		FIN SI 		
	
	
		SI (VARIABLE DE DISTANCIA AVANZADA >= AVANCE MAXIMO) && FUERA DE LA ZONA NEGRA
		
			REALIZAR CAMBIO DIRECCION = TRUE
			
		FIN SI

Le he pedido que me pase una captura de la implementación que haga.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.