News Download Tutorial FAQ Reference Buy

자바 언어 : 브레이튼버그의 로봇

개요
브레이튼버그(Valentino Braitenberg)는 복잡하게 보이는 행위가 사실은 간단한 규칙으로 만들어질 수 있다는 사실을 다양한 사고 실험을 통해 입증하였습니다. 이 사고 실험의 중요한 의미는 인간을 비롯한 생물의 두뇌 구조를 실험과 그림을 통해 이해시키고자 함에 있습니다. 모든 실험은 몇 개의 센서를 장착한 간단한 이동 장치로 이루어지는데, 각 센서와 이동 장치의 모터가 어떻게 연결되는지에 따라 여러 가지 복잡한 행위, 예를 들어 두려움, 용맹함, 사랑 등이 표출됨을 보여 주었습니다. 또한, 이러한 연결은 동물의 신경학적인 연결과 유사하기 때문에 곤충의 지능에 대한 연구에 큰 기여를 하였습니다.

브레이튼버그의 사고 실험은 다음과 같은 주장을 뒷받침하기 위한 것입니다.

사고 실험이나 시뮬레이션만으로 수행되었던 브레이튼버그의 로봇을 햄스터 로봇으로 직접 만들고 실험해 봅시다.
주인을 기다리는 로봇
브레이튼버그가 생각한 첫 번째 로봇은 주인을 기다리는 로봇입니다. 다음 그림과 같이 하나의 센서, 그리고 그 센서와 직접 연결된 모터로 이루어진 아주 간단한 구조의 로봇입니다. 왼쪽 근접 센서의 값이 양쪽 모터의 속도를 결정합니다. '+' 표시는 센서의 값이 증가하면 모터의 속도도 따라서 증가한다는 의미입니다.

주인을 기다리는 로봇을 코딩하기 전에 우선 이 로봇의 행동을 자세히 관찰한 다른 사람의 이야기를 들어 봅시다.

주인님이 주위에 없으면 가만히 기다립니다. 아주 온순하고 착한 햄스터 로봇입니다. 이때 주인님이 멀리서 나타나 손짓합니다. 로봇은 잠에서 깨어난 듯 움찔하면서 반응합니다. 갑자기 주인님이 가버립니다. 바쁜 일이 있나 봅니다. 로봇도 움직임을 멈추고 다시 기다립니다. 잠시 후 다시 주인님이 가까이 와서 손짓합니다. 로봇은 기뻐서 힘차게 주인님을 향해 달려갑니다. 너무 힘차게 뛰는 바람에 주인님과 부딪치지만 주인님은 너그럽게 껴안아 줍니다. 주인님이 돌아서서 뛰어갑니다. 로봇도 오랜만에 주인님을 뒤따라 달리기를 합니다. 아직 어린 로봇이라 주인님이 너무 빨리 뛰면 못 따라 갑니다. 주인님을 놓치면 그냥 가만히 기다립니다.

이렇게 복잡한 행동을 하는 로봇을 어떻게 코딩할 수 있을지 걱정되지만 의외로 간단히 만들 수 있습니다. 주인을 기다리는 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int speed;
        while(true) {
            // 왼쪽 근접 센서 값으로 양쪽 바퀴의 속도를 설정한다.
            speed = hamster.leftProximity();

            hamster.wheels(speed, speed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

근접 센서의 값이 아주 작은 경우에도 미세하나마 바퀴가 움찔움찔 움직이는 것을 관찰할 수 있는데 이를 없애기 위해 값이 아주 작은 경우에는 무시하도록 합시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    private static int denoise(int value) {
        return (value < 10) ? 0 : value; // 값이 작으면 무시한다.
    }

    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int speed;
        while(true) {
            // 왼쪽 근접 센서 값으로 양쪽 바퀴의 속도를 설정한다.
            speed = denoise(hamster.leftProximity());

            hamster.wheels(speed, speed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

왼쪽 근접 센서와 손까지의 거리에 따라 양쪽 바퀴의 속도를 결정합니다. 햄스터 로봇의 근접 센서는 반사되는 광량이 적으면, 즉 물체가 멀리 있거나 주위에 아무 것도 없으면 값이 작아지고, 물체가 가까이 있으면 반사되는 광량이 많아져서 값이 커집니다. 즉, 물체가 가까이 있으면 더욱 빨리 움직이게 되는 것입니다.

코드를 실행하면, 처음에는 아무런 움직임도 일어나지 않습니다. 이제 이 로봇을 진짜 햄스터라고 생각하고 앞 문장을 기억하면서 다음 그림과 같이 로봇의 왼쪽 근접 센서 앞에 손을 가져가 봅시다. 어떻게 반응하나요? 잠깐 가로막거나 오랫동안 앞을 가려 봅시다. 멀리서 점점 가까이 가거나, 따라오면 재빨리 멀리 가는 등 여러 가지 방법으로 로봇에게 생명력을 부여해 봅시다. 다른 사람이 관찰한 내용과 로봇의 행동이 유사한지 다른지 확인해 봅시다.

외부의 자극에 대한 방향성 있는 행동 특성을 주성이라고 하는데, 거의 모든 종류의 생명체에서 찾아볼 수 있습니다. 나방이 등불에 끌리는 행동(주광성), 추우면 따뜻한 장소를 찾는 행동(주열성)은 매우 보편적입니다. 자극원으로 가까이 다가가는 행동을 양의 주성이라고 하고, 반대로 자극원을 멀리하는 행동을 음의 주성이라고 합니다.
내성적인 로봇
주인을 기다리는 로봇과 같이 놀아보면 앞으로만 갈 수 있으니 좀 단순하다는 생각이 듭니다. 이제, 두 번째 소개할 로봇은 내성적인 성격의 로봇입니다. 여러분이 창조할 로봇은 다음과 같은 특성을 가집니다.

주인님이 주위에 없으면 가만히 기다립니다. 아주 온순하고 착한 햄스터 로봇입니다. 이때 주인님이 멀리서 나타나 손짓합니다. 로봇은 잠에서 깨어난 듯 움찔하면서 반응합니다. 갑자기 주인님이 가버립니다. 바쁜 일이 있나 봅니다. 로봇도 움직임을 멈추고 다시 기다립니다. 잠시 후 다시 주인님이 정면으로 가까이 와서 손짓합니다. 로봇은 기뻐서 힘차게 주인님을 향해 달려갑니다. 주인님이 돌아서서 뛰어갑니다. 로봇도 오랜만에 주인님을 뒤따라 달리기를 합니다. 하지만 주인님이 옆에서 나타나면 수줍은 듯이 고개를 돌려 피합니다. 제 성격이 너무 내성적인가 봐요. 수줍은 성격이지만 가끔 주인님이 앞을 가로막고 부르면 기뻐서 주인님의 품속으로 뛰어들기도 합니다. 아직 어린 로봇이라 주인님이 너무 빨리 뛰면 못 따라갑니다. 주인님을 놓치면 그냥 가만히 기다립니다.

다음 그림과 같이 왼쪽 근접 센서는 왼쪽 모터의 속도를 결정합니다. 동시에 오른쪽 근접 센서는 오른쪽 모터의 속도를 결정합니다. '+' 기호는 센서의 값이 증가하면 모터의 속도도 따라서 증가한다는 의미입니다.

이제 다음과 같이 내성적인 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    private static int denoise(int value) {
        return (value < 10) ? 0 : value; // 값이 작으면 무시한다.
    }

    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int leftSpeed, rightSpeed;
        while(true) {
            // 왼쪽 근접 센서 값으로 왼쪽 바퀴의 속도를, 오른쪽 근접 센서 값으로 오른쪽 바퀴의 속도를 설정한다.
            leftSpeed = denoise(hamster.leftProximity());
            rightSpeed = denoise(hamster.rightProximity());

            hamster.wheels(leftSpeed, rightSpeed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

주인을 기다리는 로봇과 마찬가지로 거리가 가까우면 바퀴의 속도를 빠르게 합니다. 왼쪽 근접 센서의 값은 왼쪽 바퀴의 속도를 결정하고, 오른쪽 근접 센서의 값은 오른쪽 바퀴의 속도를 결정합니다. 코드를 실행하고 햄스터 로봇의 행동을 살펴봅시다.

정확히 정면에 손을 가져가면 주인을 기다리는 로봇과 차이점이 없습니다. 이번에는 다음 그림과 같이 오른쪽으로 손을 가져가 봅시다. 수줍은 듯이 고개를 반대로 돌립니다. 왼쪽으로 손을 가져가도 마찬가지입니다. 앞을 갑자기 가로막으면 손 안으로 뛰어들기도 합니다. 손을 점점 멀리하면 계속 따라옵니다. 하지만 방향이 조금 틀어지면 다른 쪽을 보면서 정지하므로 손바닥을 약간 둥근 모양으로 해서 따라오게 하는 것이 좋습니다.

적극적인 로봇
내성적인 로봇에 이어 세 번째 소개할 로봇은 적극적인 성격의 로봇입니다. 여러분이 창조할 로봇은 다음과 같은 특성을 가집니다.

주인님이 주위에 없으면 가만히 기다립니다. 아주 온순하고 착한 햄스터 로봇입니다. 이때 주인님이 멀리서 나타나 손짓합니다. 갑자기 주인님이 가버립니다. 바쁜 일이 있나 봅니다. 로봇도 움직임을 멈추고 다시 기다립니다. 잠시 후 다시 주인님이 정면으로 가까이 와서 손짓합니다. 로봇은 기뻐서 힘차게 주인님을 향해 달려갑니다. 주인님이 돌아서서 뛰어 갑니다. 로봇도 오랜만에 주인님을 뒤따라 달리기를 합니다. 가끔 주인님이 앞을 가로막고 부르면 기뻐서 주인님의 품속으로 뛰어들기도 합니다. 기뻐서도 그렇지만 원래 성격이 너무 적극적인가 봐요. 주인님이 오른쪽 옆에서 나타나면 적극적으로 고개를 오른쪽으로 돌리면서 맞이합니다. 주인님이 왼쪽 옆에서 나타나면 고개를 왼쪽으로 돌리면서 맞이합니다. 앞서 달리는 주인님을 쫓아가면서 왼쪽으로 가면 왼쪽으로 따라가고 반대로 가면 반대로 따라갑니다. 아직 어린 로봇이라 주인님이 너무 빨리 뛰면 못 따라갑니다. 주인님을 놓치면 다시 찾을 줄 몰라서 그냥 가만히 기다립니다.

다음 그림과 같이 왼쪽 근접 센서는 오른쪽 모터의 속도를 결정합니다. 동시에 오른쪽 근접 센서는 왼쪽 모터의 속도를 결정합니다. '+' 기호는 센서의 값이 증가하면 모터의 속도도 따라서 증가한다는 의미입니다.

다음과 같이 적극적인 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    private static int denoise(int value) {
        return (value < 10) ? 0 : value; // 값이 작으면 무시한다.
    }

    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int leftSpeed, rightSpeed;
        while(true) {
            // 오른쪽 근접 센서 값으로 왼쪽 바퀴의 속도를, 왼쪽 근접 센서 값으로 오른쪽 바퀴의 속도를 설정한다.
            leftSpeed = denoise(hamster.rightProximity());
            rightSpeed = denoise(hamster.leftProximity());

            hamster.wheels(leftSpeed, rightSpeed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

왼쪽 근접 센서의 값은 오른쪽 바퀴의 속도를 결정하고, 오른쪽 근접 센서의 값은 왼쪽 바퀴의 속도를 결정하도록 서로 바꾸어 연결되어 있습니다. 이 조그만 차이로 로봇의 성격이 180도 바뀔 수 있을까요? 코드를 실행하고 햄스터 로봇의 행동을 살펴 봅시다.

정확히 정면에 손을 가져가면 주인을 기다리는 로봇과 차이점이 없습니다. 이번에는 다음 그림과 같이 오른쪽으로 손을 가져갑시다. 로봇이 적극적으로 손을 향해 고개를 돌립니다. 왼쪽으로 손을 가져가도 마찬가지로 손을 향해 왼쪽으로 고개를 돌립니다. 로봇의 정면에 손을 가지고 가면 로봇이 손 안으로 뛰어들기도 합니다.

사랑하는 로봇
이번에 소개할 로봇은 주인님을 너무 사랑하는 로봇입니다. 사랑하는 로봇은 다음과 같은 특성을 가집니다.

아무도 없는 넓은 책상에서 마음껏 달립니다. 하지만 주인님이 계신지 주의를 게을리하지 않습니다. 멀리서 주인님이 서있는 것을 발견합니다. 주인님이 있는 방향으로 고개를 돌리고 주인님 근처로 달려갑니다. 앞에 도착한 후에는 달리기를 멈추고 조심스럽게 앉아서 기다립니다. 주인님의 발걸음이 오른쪽으로 향합니다. 같이 오른쪽으로 따라 갑니다. 주인님이 서면 같이 섭니다. 방향을 바꾸면 같이 바꿉니다. 주인님을 너무 사랑하기 때문에 어느 곳이든 같이 있고 싶어요.

다음 그림과 같이 왼쪽 근접 센서는 왼쪽 바퀴의 속도를 결정합니다. 동시에 오른쪽 근접 센서는 오른쪽 바퀴의 속도를 결정합니다. '–' 기호는 센서의 값이 증가하면 모터의 속도는 반대로 감소한다는 의미입니다.

다음과 같이 사랑하는 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    private static int denoise(int value) {
        return (value < 10) ? 0 : value; // 값이 작으면 무시한다.
    }

    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int leftSpeed, rightSpeed;
        while(true) {
            // 왼쪽 근접 센서 값으로 왼쪽 바퀴의 속도를, 오른쪽 근접 센서 값으로 오른쪽 바퀴의 속도를 설정한다.
            leftSpeed = denoise(60 - hamster.leftProximity());
            rightSpeed = denoise(60 - hamster.rightProximity());

            hamster.wheels(leftSpeed, rightSpeed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

지금까지는 거리가 가까우면, 즉 근접 센서의 값이 클수록 바퀴의 속도가 더 빨라졌습니다. 이것을 자극성 관계라고 합니다. 반대로 하면 어떻게 될까요? 근접 센서의 값에 반비례할 경우 억제성 관계라고 합니다. 사랑하는 로봇은 손과 가까워지면, 즉 근접 센서의 값이 커지면 바퀴의 속도가 감소하는 억제성 관계를 나타냅니다. 코드를 실행하고 동작을 관찰해 봅시다. 사랑하는 로봇은 애완동물처럼 성가시게 따라다닐 것입니다. 같이 놀아주지 않으면 혼자서 어디론가 달려가 버리기 때문에 조심해야 합니다.
호기심 로봇
이번에 등장하는 호기심 로봇은 다음과 같은 특성을 가집니다.

아무도 없는 넓은 책상에서 마음껏 달립니다. 하지만 주인님이 계신지 주의를 게을리하지 않습니다. 멀리서 주인님이 서있는 것을 발견합니다. 주인님이 있는 방향으로 고개를 돌리고 주인님 근처로 달려갑니다. 앞에 도착한 후에는 달리기를 멈추고 조심스럽게 앉아서 기다립니다. 하지만 새로운 일에 호기심이 많아서 그냥 가만히 있지 않습니다. 주인님이 조금만 빈틈을 보이면 잠시도 참지 못하고 고개를 내밀고 다른 곳으로 주의를 돌립니다. 오른쪽을 막으면 왼쪽으로 피해 달아나기도 하고, 왼쪽을 막으면 오른쪽으로 용케 빠져 나갑니다. 좀 엄하게 다룰 필요가 있는 로봇입니다.

호기심 로봇은 억제성 관계의 또 다른 예입니다. 호기심 로봇은 사랑하는 로봇의 센서와 모터 간의 연결을 X자 형태로 바꾼 경우입니다. 이번에는 손 안에서 가만히 멈추어 있지 않고 여기저기 호기심을 보이며 고개를 돌립니다. 다음 그림과 같이 왼쪽 근접 센서는 오른쪽 모터의 속도를 결정합니다. 동시에 오른쪽 근접 센서는 왼쪽 모터의 속도를 결정합니다. '–' 기호는 센서의 값이 증가하면 모터의 속도는 반대로 감소한다는 의미입니다.

다음과 같이 호기심 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    private static int denoise(int value) {
        return (value < 10) ? 0 : value; // 값이 작으면 무시한다.
    }

    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int leftSpeed, rightSpeed;
        while(true) {
            // 오른쪽 근접 센서 값으로 왼쪽 바퀴의 속도를, 왼쪽 근접 센서 값으로 오른쪽 바퀴의 속도를 설정한다.
            leftSpeed = denoise(60 - hamster.rightProximity());
            rightSpeed = denoise(60 - hamster.leftProximity());

            hamster.wheels(leftSpeed, rightSpeed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

코드를 실행하고 동작을 관찰해 봅시다. 호기심 로봇은 훈련되지 않은 야생동물처럼 기회만 나면 다른 곳으로 가려고 할 것입니다.
우유부단 로봇
센서와 모터 간의 연결 방식을 바꾸면 다양한 성격이 나타남을 알 수 있습니다. 주인을 기다리는 로봇을 다음 그림과 같이 바꾸어 봅시다.

주인을 기다리는 로봇과의 차이점은 다음과 같습니다. 센서의 값이 직접 모터의 속도를 제어하는 단순한 자극성 관계를 갖지 않고, 중간에 변환 함수를 거쳐 모터의 속도를 결정합니다. 이 함수를 다양하게 정의하면 수많은 성격의 로봇을 창조할 수 있습니다. 여기서는 센서의 값이 일정한 기준 값보다 작으면 앞으로 천천히 다가가고, 기준 값 이상이면 뒤로 급하게 물러나는 행동을 코드로 작성합니다. 다음과 같이 우유부단 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        while(true) {
            // 왼쪽 근접 센서 값에 따라 양쪽 바퀴의 속도를 설정한다.
            if(hamster.leftProximity() < 40) {
                hamster.wheels(30, 30);
            } else {
                hamster.wheels(-50, -50);
            }

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

코드를 실행하고 로봇의 행동을 자세히 관찰한 후 문장으로 표현해 봅시다. 정체를 모르는 먹이를 발견하고, 뭔가 두려움에 적극적으로 접근하지 못하면서 다른 먹이를 찾아 멀리 가버리지도 못하는 우유부단한 로봇입니다. 앞에 손을 가져가면 우물쭈물하고 있는 햄스터 로봇의 행동이 안타깝습니다.
편집증 로봇
편집증이란 어떤 사람이나 사물에 비정상적으로 집착하는 성격을 말하는데 편집증 로봇은 다음과 같은 특징이 있습니다.

주위에 아무도 없으면 외롭고 불안해요. 불안하면 제자리에서 빙빙 돌아요. 누구라도 앞에 나타나면 따라갑니다. 혼자 두면 또 불안해져요.

다음과 같이 편집증 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        while(true) {
            // 왼쪽 근접 센서 값에 따라 양쪽 바퀴의 속도를 설정한다.
            if(hamster.leftProximity() < 40) {
                hamster.wheels(-50, 50);
            } else {
                hamster.wheels(30, 30);
            }

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

우유부단 로봇과 차이를 모를 정도로 비슷합니다. 하지만 이 조그만 차이가 전혀 상반된 성격을 만들어 냅니다. 코드를 실행하면 로봇이 제자리에서 돌기 시작합니다. 이때, 손으로 앞을 가로막으면 돌기를 멈추고 앞으로 이동합니다. 손을 가만히 있으면 충돌해 버립니다. 요령 있게 손을 뒤로 후퇴시키면 다시 앞으로 이동하지만 금방 방향을 잃고 돌기 시작합니다. 아직 따라가는 능력은 없습니다. 편집증 로봇에 적극적인 로봇의 따라가는 능력을 결합해 보도록 합시다.
변심하는 로봇
앞에서 나온 내성적인 로봇을 다음 그림과 같이 바꾸어 봅시다.

내성적인 로봇과 변심하는 로봇의 차이점은 다음과 같습니다. 센서의 값이 직접 모터의 속도를 제어하는 단순한 자극성 관계를 갖지 않고, 중간에 변환 함수를 거쳐 모터의 속도를 결정합니다. 이제까지는 단조 증가 또는 단조 감소하는 함수였으나, 이번에는 다음 그림과 같이 중간에 마음을 바꾸는 함수를 만들어 봅시다.

위 그래프를 보면 센서 값에 따라 성격이 달라집니다. 근접 센서의 값이 작으면, 즉 손과의 거리가 멀면 내성적인 로봇이지만, 근접 센서의 값이 크면, 즉 어떤 거리 이내가 되면 사랑하는 로봇으로 바뀝니다.

다음과 같이 변심하는 로봇을 만들어 봅시다.

import org.roboid.hamster.Hamster;
import org.roboid.runtime.Runner;

public class Controller {
    private static int denoise(int value) {
        return (value < 10) ? 0 : value; // 값이 작으면 무시한다.
    }

    private static int calcSpeed(int proximity) {
        if(proximity < 30) { // 거리가 멀면 (센서 값이 작으면)
            return denoise(proximity * 2); // 내성적인 로봇
        } else { // 아니면
            return denoise((60 - proximity) * 2); // 사랑하는 로봇
        }
    }

    public static void main(String[] args) {

        Hamster hamster = new Hamster();

        int leftSpeed, rightSpeed;
        while(true) {
            // 왼쪽 근접 센서 값으로 왼쪽 바퀴의 속도를, 오른쪽 근접 센서 값으로 오른쪽 바퀴의 속도를 설정한다.
            leftSpeed = calcSpeed(hamster.leftProximity());
            rightSpeed = calcSpeed(hamster.rightProximity());

            hamster.wheels(leftSpeed, rightSpeed);

            Runner.wait(10); // 너무 빨리 반복하지 않도록 한다.
        }
    }
}

코드를 실행하고 여러 가지 방법으로 로봇의 행동을 자세히 관찰한 후 문장으로 표현해 봅시다.

주인님이 주위에 없으면 가만히 기다립니다. 아주 온순하고 착한 햄스터 로봇입니다. 이때, 주인님이 멀리서 나타나 손짓합니다. 로봇은 잠에서 깨어난 듯 움찔하면서 반응합니다. 갑자기 주인님이 가버립니다. 바쁜 일이 있나 봅니다. 로봇도 움직임을 멈추고 다시 기다립니다. 잠시 후 다시 주인님이 정면으로 가까이 와서 손짓합니다. 로봇은 기뻐서 힘차게 주인님을 향해 달려갑니다. 주인님이 돌아서서 뛰어 갑니다. 로봇도 오랜만에 주인님을 뒤따라 달리기를 합니다. 하지만 주인님이 옆에서 나타나면 수줍은 듯이 고개를 돌려 피합니다. 아직 어린 로봇이라 주인님이 너무 빨리 뛰면 못 따라갑니다. 주인님을 놓치면 그냥 가만히 기다립니다. 주인님이 옆길로 가면 수줍은 저는 따라가지 못하고 제자리에 서버립니다. 답답해진 주인님은 빨리 따라오라고 가만히 서서 기다립니다. 힘차게 주인님 근처로 달려갑니다. 발 앞에 도착한 후에는 달리기를 멈추고 조심스럽게 앉아서 기다립니다. 주인님의 발걸음이 오른쪽으로 향합니다. 같이 오른쪽으로 따라 갑니다. 주인님이 서면 같이 섭니다. 방향을 바꾸면 같이 바꿉니다. 주인님과 가까운 곳에 있으면 수줍음이 사라지는 것 같아요. 주인님을 너무 사랑하기 때문에 이제부터는 어느 곳이든 같이 있고 싶어요.

코드의 내용을 모르고 위의 문장을 읽은 사람은 이 로봇이 몇 줄짜리의 짧은 코드로 이루어졌다는 것을 상상하기 힘들 것입니다.
목차
Hardware
  1. Hamster robot
  2. USB dongle
Preparation for Class
  1. Software installation
  2. Robot to PC connection
  3. Run example files
Basic
  1. Create a new project
  2. Work in the cloud PC environment (optional)
  3. Move on a board #1 (sequence, repetition)
  4. Move and turn
  5. Turn on LEDs and make a sound
  6. Command in order repeatedly
  7. Use proximity sensors
  8. Move on a board #2 (repeat while)
  9. Use floor sensors
  10. Use light and acceleration sensors
  11. Braitenberg's robot
Advanced
  1. Create a board game
  2. Keyboard events
  3. Graphical interface
  4. Line following with one sensor
  5. Line following with two sensors
  6. Follow hamster friends (2 people 1 pair)
  7. Follow a wall
  8. Imitating a robot cleaner
  9. Line following at intersection
  10. Escape a maze
Extension Kit
  1. Assembling
  2. Pin/socket layout
  3. Digital input - Press button to beep
  4. Digital output - LED is on when it is dark
  5. Digital output - flashing twinkling LED
  6. Digital output - LED is on in tilting direction
  7. Analog input - Rotating the potentiometer changes the pitch.
  8. Analog input - please do not let it get hot
  9. Analog Input - Move along the light
  10. PWM output - LED light gently brighter and darker
  11. PWM output - LED candle shakes in the wind
  12. Analog servo output - hamster robot has tail
More Advanced
  1. Behavior based robot control
  2. Path navigation
  3. Swap
Copyright Robot Software Education Institute. All rights reserved.
Please contact prof. Kwang-Hyun Park (akaii@kw.ac.kr) if you have any problem.