Zum Inhalt springen
Deutsch

Farbsensor

Der Farbsensor schaut auf den Boden und informiert den Roboter so über Löcher, Sümpfe und Durchgänge. Er ist eine Kamera mit einem einzigen Pixel, die nach unten zeigt. Beim Starter-Roboter heißt er color und sitzt vorne am Roboter, damit er ein Loch sieht, bevor die Räder es erreichen.

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)

Diese Werte wurden mit dem Starter-Roboter in world2.wbt gemessen:

Boden Rot Grün Blau
Normal 252 252 252
Sumpf 245 222 142
Durchgang zwischen Bereich 1 und 2 (blau) 91 91 255
Durchgang zwischen Bereich 2 und 3 (lila) 193 91 251
Durchgang zwischen Bereich 1 und 4 (grün) 48 255 48
Durchgang zwischen Bereich 3 und 4 (rot) 255 91 91

Löcher haben einen schwarzen Rand, daher wird der Boden kurz vor einem Loch dunkel. Checkpoints sehen für diesen Sensor fast wie normaler Boden aus, also kalibriere ihn auf einem Checkpoint in deiner Welt.

Dieses Programm fährt vorwärts, gibt den Boden jedes Mal aus, wenn er sich ändert, und hält an, wenn es ein Loch sieht:

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