Diferencia entre revisiones de «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á
Línea 16: | Línea 16: | ||
local function chequear_avance_o_retrocedo() | local function chequear_avance_o_retrocedo() | ||
− | + | -- Avanzar = true, Retriceder = false | |
− | + | local sentido = math.random (0, 1) | |
− | + | return sentido > 0.5 | |
end | end | ||
local function moverse() | 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 | end | ||
local function puedo_seguir() | 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 | end | ||
local function chequear_giro_izquierda() | 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 | end | ||
local function girar_aleatorio() | 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 | end | ||
local function volver_inicio() | 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 | end | ||
Revisión actual del 12:54 15 oct 2012
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()