Butialo: Ejemplo 7 - Robot que no se caiga de la mesa con eventos, utilizando un sensor de grises y uno de distancia - Código

De Proyecto Butiá
Saltar a: navegación, buscar
local COLOR_MESA = 55000
local INTERVALO_CHEQUEO = 0.05
local TIEMPO_RETROCESO = 0.1
local VELOCIDAD_RETROCESO = 500
local VELOCIDAD_GIRO = 500
local MOTOR_VEL = 500
local MIN_TIEMPO_GIRO = 0.5
local MAX_TIEMPO_GIRO = 2
local MIN_TIEMPO_RETROCESO = 1.5
local MAX_TIEMPO_RETROCESO = 2.5
local DISTANCIA_MESA = 21000
local debe_avanzar = true
local tiempo_volver_inicio = 2.0
local ADELANTE_FUERA_MESA, ATRAS_FUERA_MESA, EN_LA_MESA = 1, 2, 3

local function chequear_avance_o_retrocedo()
	-- Avanzar = true, Retriceder = false
	local sentido = math.random (0, 1)
	return sentido > 0.5
end


local function moverse()
   local sentido = chequear_avance_o_retrocedo();
   if(sentido) then
	    Motors.setvel2mtr(0, MOTOR_VEL, 0, MOTOR_VEL)
	  else
	    Motors.setvel2mtr(1, MOTOR_VEL, 1, MOTOR_VEL)
	  end
end

local function puedo_seguir()

   if Grey_2.getValue() > COLOR_MESA then
     --retroceder
     ret = ADELANTE_FUERA_MESA
   else
     if Distanc_6.getValue() < DISTANCIA_MESA then
       --avanzar
       ret = ATRAS_FUERA_MESA
     else
       --puedo seguir
       ret = EN_LA_MESA
     end
   end
   return ret   
	 
end

local function chequear_giro_izquierda()
	-- Para girar random izq o der, uso un entero del 0-1
	-- Si valor random > 0.5 es izq, sino der
	-- DERECHA = false, IZQUIERDA = true
	local sentido = math.random (0, 1)
	return sentido > 0.5
end

local function girar_aleatorio()
	local tiempo_giro = math.random(MIN_TIEMPO_GIRO, MAX_TIEMPO_GIRO)
	local izquierda = chequear_giro_izquierda()
	if (izquierda) then
		Motors.setvel2mtr(0, VELOCIDAD_GIRO, 1, VELOCIDAD_GIRO)
	else
		Motors.setvel2mtr(1, VELOCIDAD_GIRO, 0, VELOCIDAD_GIRO)
	end
	util.wait(tiempo_giro)
end

local function volver_inicio()
 -- se que los posibles valores de ret son: ADELANTE_FUERA_MESA o ATRAS_FUERA_MESA
   if (ret == ATRAS_FUERA_MESA) then
	    Motors.setvel2mtr(0, VELOCIDAD_RETROCESO, 0, VELOCIDAD_RETROCESO)
	else
	   Motors.setvel2mtr(1, VELOCIDAD_RETROCESO, 1, VELOCIDAD_RETROCESO) 
	end
	util.wait(tiempo_volver_inicio)
	girar_aleatorio()
end

events.add(puedo_seguir, '==', ADELANTE_FUERA_MESA, volver_inicio)
events.add(puedo_seguir, '==', ATRAS_FUERA_MESA, volver_inicio)
events.add(puedo_seguir, '==', EN_LA_MESA, moverse)

events.go()