Ir al contenido
Español

Sensor de color

El sensor de color mira al suelo, así que informa al robot de agujeros, pantanos y pasos. Es una cámara de un solo píxel que apunta hacia abajo. En el robot inicial se llama color y está en la parte delantera del robot, para que vea un agujero antes de que las ruedas lleguen a él.

from controller import Robot
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
colorSensor = robot.getDevice("color")
colorSensor.enable(timeStep)
while robot.step(timeStep) != -1:
image = colorSensor.getImage() # A single pixel
r = colorSensor.imageGetRed(image, 1, 0, 0)
g = colorSensor.imageGetGreen(image, 1, 0, 0)
b = colorSensor.imageGetBlue(image, 1, 0, 0)
print("r:", r, "g:", g, "b:", b)

Estos valores se midieron con el robot inicial en world2.wbt:

Suelo Rojo Verde Azul
Normal 252 252 252
Pantano 245 222 142
Paso entre las áreas 1 y 2 (azul) 91 91 255
Paso entre las áreas 2 y 3 (morado) 193 91 251
Paso entre las áreas 1 y 4 (verde) 48 255 48
Paso entre las áreas 3 y 4 (rojo) 255 91 91

Los agujeros tienen un borde negro, así que el suelo se oscurece justo antes de un agujero. Para este sensor, los puntos de control (checkpoints) parecen casi suelo normal, así que calíbralo sobre uno en tu mundo.

Este programa avanza, imprime el suelo cada vez que cambia y se detiene si ve un agujero:

from controller import Robot
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
colorSensor = robot.getDevice("color")
colorSensor.enable(timeStep)
leftWheel = robot.getDevice("left wheel motor")
rightWheel = robot.getDevice("right wheel motor")
leftWheel.setPosition(float("inf"))
rightWheel.setPosition(float("inf"))
def floorType(r, g, b):
# Tune these ranges for your own robot and worlds
brightness = (r + g + b) / 3
if brightness < 80:
return "hole"
if r > 220 and g > 200 and b < 190:
return "swamp"
if b > 220 and g < 130:
return "purple passage" if r > 150 else "blue passage"
if r > 220 and g < 130 and b < 130:
return "red passage"
if g > 220 and r < 100 and b < 100:
return "green passage"
return "floor"
leftWheel.setVelocity(3.0)
rightWheel.setVelocity(3.0)
last = None
while robot.step(timeStep) != -1:
image = colorSensor.getImage()
floor = floorType(colorSensor.imageGetRed(image, 1, 0, 0),
colorSensor.imageGetGreen(image, 1, 0, 0),
colorSensor.imageGetBlue(image, 1, 0, 0))
if floor != last:
print("Floor:", floor)
last = floor
if floor == "hole": # Stop before falling in
leftWheel.setVelocity(0)
rightWheel.setVelocity(0)
break