Pular para o conteúdo
Português (Brasil)

Sensor de cor

O sensor de cor olha para o piso, então ele informa o robô sobre buracos, pântanos e passagens. Ele é uma câmera de um único pixel, apontada para baixo. No robô inicial, ele se chama color e fica na frente do robô, para que veja um buraco antes que as rodas cheguem até ele.

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)

Estes valores foram medidos com o robô inicial em world2.wbt:

Piso Vermelho Verde Azul
Normal 252 252 252
Pântano 245 222 142
Passagem entre as áreas 1 e 2 (azul) 91 91 255
Passagem entre as áreas 2 e 3 (roxa) 193 91 251
Passagem entre as áreas 1 e 4 (verde) 48 255 48
Passagem entre as áreas 3 e 4 (vermelha) 255 91 91

Os buracos têm uma borda preta, então o piso escurece logo antes de um buraco. Os pontos de controle parecem quase um piso normal para este sensor, então faça a calibração em um deles no seu mundo.

Este programa anda para a frente, mostra o piso toda vez que ele muda e para se vir um buraco:

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