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)#include <iostream>#include <webots/Robot.hpp>#include <webots/Camera.hpp>
using namespace webots;using namespace std;
int main() { Robot *robot = new Robot(); int timeStep = (int)robot->getBasicTimeStep();
Camera *colorSensor = robot->getCamera("color"); colorSensor->enable(timeStep);
while (robot->step(timeStep) != -1) { const unsigned char *image = colorSensor->getImage(); // A single pixel int r = Camera::imageGetRed(image, 1, 0, 0); int g = Camera::imageGetGreen(image, 1, 0, 0); int b = Camera::imageGetBlue(image, 1, 0, 0); cout << "r: " << r << " g: " << g << " b: " << b << endl; }
delete robot; return 0;}Colores del suelo
Sección titulada «Colores del suelo»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.
Ejemplo: vigilar el suelo
Sección titulada «Ejemplo: vigilar el suelo»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#include <iostream>#include <cmath>#include <string>#include <webots/Robot.hpp>#include <webots/Camera.hpp>#include <webots/Motor.hpp>
using namespace webots;using namespace std;
// Tune these ranges for your own robot and worldsstring floorType(int r, int g, int b) { int brightness = (r + g + b) / 3; if (brightness < 80) return "hole"; if (r > 220 && g > 200 && b < 190) return "swamp"; if (b > 220 && g < 130) return r > 150 ? "purple passage" : "blue passage"; if (r > 220 && g < 130 && b < 130) return "red passage"; if (g > 220 && r < 100 && b < 100) return "green passage"; return "floor";}
int main() { Robot *robot = new Robot(); int timeStep = (int)robot->getBasicTimeStep();
Camera *colorSensor = robot->getCamera("color"); colorSensor->enable(timeStep); Motor *leftWheel = robot->getMotor("left wheel motor"); Motor *rightWheel = robot->getMotor("right wheel motor"); leftWheel->setPosition(INFINITY); rightWheel->setPosition(INFINITY);
leftWheel->setVelocity(3.0); rightWheel->setVelocity(3.0); string last;
while (robot->step(timeStep) != -1) { const unsigned char *image = colorSensor->getImage(); string floor = floorType(Camera::imageGetRed(image, 1, 0, 0), Camera::imageGetGreen(image, 1, 0, 0), Camera::imageGetBlue(image, 1, 0, 0)); if (floor != last) { cout << "Floor: " << floor << endl; last = floor; } if (floor == "hole") { // Stop before falling in leftWheel->setVelocity(0); rightWheel->setVelocity(0); break; } }
delete robot; return 0;}