컬러 센서
컬러 센서는 바닥을 보기 때문에 로봇에게 구멍, 늪, 통로에 대해 알려 줘요. 아래를 향하는 1픽셀짜리 카메라예요. 스타터 로봇에서는 이름이 color이고, 바퀴가 닿기 전에 구멍을 볼 수 있도록 로봇 앞쪽에 달려 있어요.
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;}바닥 색
섹션 제목: “바닥 색”다음은 world2.wbt에서 스타터 로봇으로 측정한 값이에요.
| 바닥 | 빨강 | 초록 | 파랑 |
|---|---|---|---|
| 일반 | 252 | 252 | 252 |
| 늪 | 245 | 222 | 142 |
| 구역 1과 2 사이의 통로 (파랑) | 91 | 91 | 255 |
| 구역 2와 3 사이의 통로 (보라) | 193 | 91 | 251 |
| 구역 1과 4 사이의 통로 (초록) | 48 | 255 | 48 |
| 구역 3과 4 사이의 통로 (빨강) | 255 | 91 | 91 |
구멍에는 검은 테두리가 있어서 구멍 바로 앞에서 바닥이 어두워져요. 체크포인트는 이 센서에게 일반 바닥과 거의 똑같이 보이므로, 자신의 월드에 있는 체크포인트에서 보정하세요.
예제: 바닥 살펴보기
섹션 제목: “예제: 바닥 살펴보기”이 프로그램은 앞으로 이동하면서 바닥이 바뀔 때마다 출력하고, 구멍을 보면 멈춰요.
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;}