Sensor warna
Sensor warna melihat ke lantai, jadi sensor ini memberi tahu robot tentang lubang, rawa, dan lorong penghubung. Sensor ini adalah kamera satu piksel yang menghadap ke bawah. Pada robot pemula, namanya color, dan letaknya di bagian depan robot, agar bisa melihat lubang sebelum roda mencapainya.
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;}Warna lantai
Section titled “Warna lantai”Nilai-nilai ini diukur dengan robot pemula di world2.wbt:
| Lantai | Merah | Hijau | Biru |
|---|---|---|---|
| Normal | 252 | 252 | 252 |
| Rawa | 245 | 222 | 142 |
| Lorong penghubung Area 1 dan 2 (biru) | 91 | 91 | 255 |
| Lorong penghubung Area 2 dan 3 (ungu) | 193 | 91 | 251 |
| Lorong penghubung Area 1 dan 4 (hijau) | 48 | 255 | 48 |
| Lorong penghubung Area 3 dan 4 (merah) | 255 | 91 | 91 |
Lubang punya tepi hitam, jadi lantai menjadi gelap tepat sebelum lubang. Bagi sensor ini, checkpoint terlihat hampir sama dengan lantai normal, jadi lakukan kalibrasi pada salah satu checkpoint di world-mu.
Contoh: mengamati lantai
Section titled “Contoh: mengamati lantai”Program ini membuat robot maju, mencetak jenis lantai setiap kali berubah, dan berhenti jika melihat lubang:
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;}