Aller au contenu
Français

Capteur de couleur

Le capteur de couleur regarde le sol : il renseigne donc le robot sur les trous, les marécages et les passages. C’est une caméra d’un seul pixel, orientée vers le bas. Sur le robot de départ, il s’appelle color et se trouve à l’avant du robot, pour voir un trou avant que les roues ne l’atteignent.

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)

Ces valeurs ont été mesurées avec le robot de départ sur world2.wbt :

Sol Rouge Vert Bleu
Normal 252 252 252
Marécage 245 222 142
Passage entre les zones 1 et 2 (bleu) 91 91 255
Passage entre les zones 2 et 3 (violet) 193 91 251
Passage entre les zones 1 et 4 (vert) 48 255 48
Passage entre les zones 3 et 4 (rouge) 255 91 91

Les trous ont un bord noir : le sol devient donc sombre juste avant un trou. Pour ce capteur, les points de contrôle (checkpoints) ressemblent presque à un sol normal : faites donc l’étalonnage sur l’un d’eux dans votre monde.

Ce programme avance, affiche le sol à chaque fois qu’il change, et s’arrête s’il voit un trou :

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