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

De Proyecto Butiá
Revisión del 12:26 15 oct 2012 de Lcairelli (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
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 TIEMPO_VOLVER_INICIO = 2.0
local debe_avanzar = true

local function chequear_avance_o_retrocedo()
    -- Avanzar = true, Retroceder = 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_avanzar()
    local ret
    if Grey_2.getValue() < COLOR_MESA and Distanc_6.getValue() >= DISTANCIA_MESA then
        ret = true
    else
        ret = false
    end
    if(not ret) then
        if(Grey_2.getValue() > COLOR_MESA ) then
            --se esta por caer desde la parte de adelante
            debe_avanzar = false
        else
            debe_avanzar = true
        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()
    if (debe_avanzar) 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

while true do
    moverse()
    while (puedo_avanzar()) do
        util.wait(INTERVALO_CHEQUEO)
    end
    volver_inicio()
end