Renk sensörü
Renk sensörü zemine bakar; böylece robota çukurlar, bataklıklar ve geçitler hakkında bilgi verir. Aşağıya bakan, tek piksellik bir kameradır. Başlangıç robotunda adı color’dır ve tekerlekler bir çukura ulaşmadan önce çukuru görebilmesi için robotun önündedir.
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;}Zemin renkleri
Bölüm başlığı “Zemin renkleri”Bu değerler başlangıç robotuyla world2.wbt üzerinde ölçüldü:
| Zemin | Kırmızı | Yeşil | Mavi |
|---|---|---|---|
| Normal | 252 | 252 | 252 |
| Bataklık | 245 | 222 | 142 |
| 1. ve 2. alanlar arasındaki geçit (mavi) | 91 | 91 | 255 |
| 2. ve 3. alanlar arasındaki geçit (mor) | 193 | 91 | 251 |
| 1. ve 4. alanlar arasındaki geçit (yeşil) | 48 | 255 | 48 |
| 3. ve 4. alanlar arasındaki geçit (kırmızı) | 255 | 91 | 91 |
Çukurların siyah bir kenarı vardır, bu yüzden zemin bir çukurun hemen önünde kararır. Kontrol noktaları bu sensöre neredeyse normal zemin gibi görünür, bu yüzden kalibrasyonu kendi dünyandaki bir kontrol noktası üzerinde yap.
Örnek: zemini izleme
Bölüm başlığı “Örnek: zemini izleme”Bu program ileri gider, zemin her değiştiğinde onu yazdırır ve bir çukur görürse durur:
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;}