News Download Tutorial FAQ Reference Buy

파이썬 : 센서 한 개를 이용한 라인 트레이서

개요
라인 트레이서는 일종의 지능형 로봇으로, 센서를 통해 검출된 선의 정보를 처리하여 정해진 선을 따라 움직이는 로봇을 말합니다. 무인 자동화 생산 공정에서 생산된 물건을 운반하는 용도로 사용될 수 있습니다.
우선 간단하게 햄스터 로봇의 바닥 센서 한 개를 이용하여 주행하는 방법에 대해 알아보도록 하겠습니다.

실습 자료:   PPT PDF
왼쪽 바닥 센서를 이용한 라인 트레이서
실습을 하기 위해 A4 용지를 준비하고, 햄스터 로봇이 이동할 직선을 검은색 테이프 또는 펜으로 그립니다. 미리 제작된 실습 자료를 내려 받아 프린터로 인쇄하여도 됩니다.

햄스터 로봇의 왼쪽 바닥 센서를 사용하여 검은색 선의 오른쪽 테두리를 따라 주행하는 프로그램을 작성하시오.

라인 트레이서의 원리는 의외로 간단합니다. 햄스터 로봇의 왼쪽 바닥 센서가 하얀색 종이 위에 있으면 검은색 선의 오른쪽 테두리로 다가가기 위해 왼쪽으로 움직이고, 왼쪽 바닥 센서가 검은색 선 위에 있으면 오른쪽으로 움직이면 됩니다.

이를 반복하면 다음 그림과 같이 검은색 선의 오른쪽 테두리를 따라서 앞으로 이동할 수 있습니다.

원리는 간단한데 이를 실제로 구현하기 위해서는 두 가지가 필요합니다.

하나씩 문제를 풀어 봅시다.
우선 왼쪽 바닥 센서가 하얀색 종이 위에 있는지, 검은색 선 위에 있는지 알기 위해서는 왼쪽 바닥 센서의 값을 읽어야 합니다. 다음 그림과 같이 햄스터 로봇의 바닥면 좌우에는 바닥 센서(적외선 센서)가 있는데, 종이 위에 그려진 선이나 책상의 가장자리 등을 검출할 때 사용됩니다. 바닥 센서는 적외선을 방출하는 IR-LED와 적외선을 감지하는 광 트랜지스터 한 쌍으로 이루어져 있습니다. IR-LED가 방출하는 적외선이 바닥에 반사되어 들어오는 광량을 광 트랜지스터가 검출합니다. 바닥 센서가 하얀색 종이 위에 있으면 반사된 광량이 많아져서 측정되는 값이 증가하고, 검은색 선 위에 있으면 반사된 광량이 적어져서 측정되는 값이 감소하게 됩니다.

왼쪽 바닥 센서의 값을 읽기 위해서는 read 함수를 사용하면 됩니다. 프로그램을 구현하기 전에 우선 바닥 센서의 값을 관찰해 보도록 합시다. 파이썬의 경우에는 다음 코드와 같이 센서 값을 출력할 수 있습니다.

from roboid.hamster import *

hamster = Hamster()

while True:
    print hamster.read(Hamster.LEFT_FLOOR)

햄스터 로봇의 왼쪽 바닥 센서가 A4 용지의 하얀색 종이 위에 있을 때와 검은색 선 위에 있을 때 센서 값이 어떻게 다른지 관찰하여 기록해 봅시다.

하얀색 종이 위에 있을 때 검은색 선 위에 있을 때
왼쪽 바닥 센서의 값

측정된 센서 값으로부터 햄스터 로봇의 왼쪽 바닥 센서가 하얀색 종이 위에 있는지, 검은색 선 위에 있는지 판단하기 위해서는 크기를 비교하면 됩니다. 기준이 되는 숫자가 필요한데 앞에서 측정한 두 개의 센서 값의 중간 값을 사용해 봅시다. 즉, 하얀색 종이 위에 있을 때 센서 값이 100, 검은색 선 위에 있을 때 센서 값이 0이었다면 기준이 되는 숫자는 50으로 하면 됩니다. 왼쪽 바닥 센서가 하얀색 종이 위에 있는 경우를 다음과 같이 표현할 수 있습니다.

hamster.read(Hamster.LEFT_FLOOR) > 50

이제 두 번째 문제를 풀어 봅시다. 햄스터 로봇을 왼쪽 또는 오른쪽으로 움직여야 합니다. 다양한 방법이 있을 수 있지만 간단하게 하기 위해 한쪽 바퀴를 축으로 회전하는 방법을 사용해 봅시다. 왼쪽으로 회전하기 위해서는 왼쪽 바퀴를 정지하고 오른쪽 바퀴를 앞으로 움직이면 됩니다. 오른쪽으로 회전하기 위해서는 오른쪽 바퀴를 정지하고 왼쪽 바퀴를 앞으로 움직이면 됩니다.

hamster.write(Hamster.LEFT_WHEEL, 0)
hamster.write(Hamster.RIGHT_WHEEL, 30)

hamster.write(Hamster.LEFT_WHEEL, 30)
hamster.write(Hamster.RIGHT_WHEEL, 0)

왼쪽 바닥 센서가 하얀색 종이 위에 있는지, 검은색 선 위에 있는지에 따라 햄스터 로봇의 동작을 다르게 하기 위해서는 if else 구문을 사용하면 됩니다. 왼쪽 바닥 센서가 하얀색 종이 위에 있으면, 즉 센서 값이 50보다 크면 왼쪽으로 회전하도록 하고, 아니면 오른쪽으로 회전하도록 프로그램을 작성해 봅시다.

if hamster.read(Hamster.LEFT_FLOOR) > 50:
    hamster.write(Hamster.LEFT_WHEEL, 0)
    hamster.write(Hamster.RIGHT_WHEEL, 30)
else:
    hamster.write(Hamster.LEFT_WHEEL, 30)
    hamster.write(Hamster.RIGHT_WHEEL, 0)

이제 이 코드를 계속 반복하면 프로그램이 완성됩니다.

from roboid.hamster import *

hamster = Hamster()

while True:
    if hamster.read(Hamster.LEFT_FLOOR) > 50:
        hamster.write(Hamster.LEFT_WHEEL, 0)
        hamster.write(Hamster.RIGHT_WHEEL, 30)
    else:
        hamster.write(Hamster.LEFT_WHEEL, 30)
        hamster.write(Hamster.RIGHT_WHEEL, 0)

다음 그림과 같이 햄스터 로봇을 검은색 선의 오른쪽에 올려 놓고 프로그램을 실행해 봅시다.

추가 활동:
  • 크기를 비교하는 기준이 되는 숫자를 변경하면 햄스터 로봇의 동작이 어떻게 달라지는지 관찰하고 그 이유를 토의해 봅시다.
  • 햄스터 로봇의 오른쪽 바닥 센서를 사용하여 검은색 선의 왼쪽 테두리를 따라 주행하는 프로그램을 작성해 봅시다.
곡선 주행과 90도 주행
직선을 따라 주행하는 것은 너무 단순합니다. 곡선을 따라 주행하거나 90도로 꺾어진 길도 잘 달려갈 수 있어야 물건을 이곳저곳으로 운반할 수 있는 멋진 햄스터 로봇이 될 수 있습니다.

우리가 복도를 달려가다가 왼쪽 또는 오른쪽으로 꺾어진 길을 만나면 어떻게 하는지 생각해 봅시다. 속도를 줄여서 모퉁이를 돈 다음 다시 달려가지 않을까요? 하지만 모퉁이가 어디쯤 있는지 알 수 있어야 속도를 줄일 수 있습니다. 앞에서 실습한 햄스터 로봇은 바닥만 보면서 움직입니다. 우리도 바닥만 보면서 복도를 달려간다면 언제 모퉁이가 나타날지 알 수가 없어서 빨리 달리지는 못할 것 같습니다.

작성한 프로그램을 그대로 사용하여 곡선을 따라 주행할 수 있는지 실험해 봅시다. 선을 벗어나지 않고 잘 주행할 수 있도록 햄스터 로봇이 왼쪽 또는 오른쪽으로 회전하는 속도를 조정하면 됩니다. 큰 원에서 시작하여 원의 크기를 조금씩 줄이면서 실험해 봅시다. 원이 클 때와 작을 때 햄스터 로봇의 회전 속도를 어떻게 해야 하는지 실험하고 관찰하여 원의 크기와 회전 속도 간의 관계를 알아봅시다.

왼쪽으로 90도 꺾어진 길은 잘 따라갈 수 있을까요? 문제 없이 잘 따라간다면 설명을 듣기 전에, 작성된 프로그램과 햄스터 로봇의 동작을 관찰하면서 그 이유를 추론하고 토의해 봅시다.

검은색 선을 따라 주행하다가 왼쪽 바닥 센서가 선의 바깥으로 나가게 되는데, 왼쪽 바닥 센서가 하얀색 종이 위에 있는 경우가 되기 때문에 왼쪽 바퀴를 축으로 하여 왼쪽으로 회전하게 됩니다. 즉 왼쪽 바닥 센서가 검은색 선을 만나게 될 때까지 왼쪽으로 회전한 후, 다시 검은색 선을 따라 주행합니다.

오른쪽으로 90도 꺾어진 길에서는 어떻게 될까요? 설명을 듣기 전에 실험을 통해 관찰하면서 햄스터 로봇이 그렇게 동작하는 이유를 추론하고 토의해 봅시다.

검은색 선을 따라 주행하다가 오른쪽으로 90도 꺾어진 길을 만나면 왼쪽 바닥 센서는 검은색 선 위에 있기 때문에 오른쪽 바퀴를 축으로 오른쪽으로 회전하게 됩니다. 오른쪽으로 회전하면 왼쪽 바닥 센서가 선의 바깥으로 나가게 되어 하얀색 종이 위에 있는 경우가 되고, 검은색 선을 만나게 될 때까지 왼쪽 바퀴를 축으로 왼쪽으로 회전합니다. 즉 검은색 선을 따라 왔던 길을 되돌아 가게 됩니다.




추가 활동:
  • 햄스터 로봇이 오른쪽으로 90도 꺾어진 길을 따라 주행하려면 어떻게 해야 할지 생각해 봅시다.
부드럽게 주행하기
앞에서 작성한 프로그램을 실행하면 햄스터 로봇이 좌우로 엉덩이를 흔들며 주행합니다. 뒤뚱뒤뚱 오리처럼 움직이는 햄스터 로봇이 귀엽기는 하지만 좀 더 똑바로 움직이도록 해야겠습니다.

왜 뒤뚱뒤뚱 움직일 수밖에 없을까요? 왼쪽 바닥 센서가 검은색 선의 오른쪽 테두리 가까이 있든 멀리 있든 일정한 속도로 움직이기 때문입니다. 테두리 가까이 있을 때는 조금만 움직여도 되지 않을까요?

우선 왼쪽 바닥 센서의 위치에 따라 센서 값이 어떻게 달라지는지 관찰해 보도록 합시다. 다음 그림과 같이 햄스터 로봇을 1번 위치에 놓았을 때와 2번 위치에 놓았을 때, 3번 위치에 놓았을 때 왼쪽 바닥 센서의 값이 어떻게 되는지 측정하여 기록해 봅시다.

1번 위치에 있을 때 2번 위치에 있을 때 3번 위치에 있을 때
왼쪽 바닥 센서의 값

검은색 선을 따라 주행하는 원리는 같습니다. 다른 점은 왼쪽 바닥 센서의 값에 따라 왼쪽 바퀴와 오른쪽 바퀴의 속도를 변경한다는 것입니다. 규칙을 한번 생각해 봅시다.

이를 왼쪽 바퀴와 오른쪽 바퀴 관점에서 정리하면 다음과 같습니다.

즉, 왼쪽 바퀴의 속도는 왼쪽 바닥 센서의 값과 반비례 관계를 가지고, 오른쪽 바퀴의 속도는 왼쪽 바닥 센서의 값과 정비례 관계를 가집니다. 왼쪽 바닥 센서의 값은 0 ~ 100의 범위이고 바퀴의 속도는 -100 ~ 100의 범위인데, 앞으로 이동해야 하기 때문에 바퀴의 속도도 0 ~ 100의 범위가 되도록 해야 합니다. 이를 수식으로 표현하면 다음과 같습니다.

햄스터 로봇의 속도가 너무 빠르면 곡선을 주행하거나 90도로 꺾어진 길에서 급하게 회전하기가 어려워지기 때문에 최대 속도가 50이 되도록 0.5를 곱하여 다음과 같이 프로그램을 작성해 봅시다.

from roboid.hamster import *

hamster = Hamster()

while True:
    left = hamster.read(Hamster.LEFT_FLOOR)
    hamster.write(Hamster.LEFT_WHEEL, (100 - left) * 0.5)
    hamster.write(Hamster.RIGHT_WHEEL, left * 0.5)

곱한 숫자 0.5를 변경해 보면서 햄스터 로봇의 움직임이 어떻게 달라지는지 살펴 보도록 합시다.

추가 활동:
  • 수정된 프로그램을 사용하여 햄스터 로봇이 원을 따라 주행할 수 있는지 실험해 봅시다.
  • 수정된 프로그램을 사용하여 햄스터 로봇이 왼쪽으로 90도 꺾어진 길을 따라 주행할 수 있는지 실험해 봅시다.
목차
수업 준비
  1. 소프트웨어 설치
  2. 로봇과 PC 연결하기
  3. 소프트웨어 실행
기초
  1. 센서 한 개를 이용한 라인 트레이서
  2. 센서 두 개를 이용한 라인 트레이서
심화
Copyright Robot Software Education Institute. All rights reserved.
Please contact prof. Kwang-Hyun Park (akaii@kw.ac.kr) if you have any problem.