상황에 따라 동작하기
햄스터 로봇의 앞을 손으로 막을 때마다 일정 시간 뒤로 이동하게 해봅시다.
from roboid import *
hamster = Hamster()
while True:
if hamster.left_proximity() > 30 or hamster.right_proximity() > 30:
hamster.wheels(-30) # 뒤로 이동한다.
wait(1000) # 1초
hamster.stop() # 정지한다.
wait(20) # 너무 빨리 반복하지 않도록 한다.
이번에는 햄스터 로봇의 바닥 센서가 검은색 선을 만날 때마다 삐 소리를 내도록 해봅시다.
from roboid import *
hamster = Hamster()
while True:
if hamster.left_floor() < 20 or hamster.right_floor() < 20:
hamster.beep()
wait(20) # 너무 빨리 반복하지 않도록 한다.
각 조건에 해당하는 상황이 발생하는 것을 이벤트라고 합니다.
이번에는 이벤트 방식으로 코드를 작성해 봅시다.
우선 각각의 상황을 판단하는 함수와 각 상황에 대한 동작을 수행하는 함수를 만듭니다.
이 때, 상황을 판단하는 함수는 True 또는 False를 반환해야 합니다.
from roboid import *
hamster = Hamster()
def when_hand_found():
return hamster.left_proximity() > 30 or hamster.right_proximity() > 30
def do_move_backward():
hamster.wheels(-30)
wait(1000)
hamster.stop()
def when_on_black_line():
return hamster.left_floor() < 20 or hamster.right_floor() < 20
def do_sound():
hamster.beep()
이제 이 함수들을 when_do 함수에 넣어 주면 됩니다.
when_do 함수를 호출하는 순서는 중요하지 않습니다.
from roboid import *
hamster = Hamster()
def when_hand_found():
return hamster.left_proximity() > 30 or hamster.right_proximity() > 30
def do_move_backward():
hamster.wheels(-30)
wait(1000)
hamster.stop()
def when_on_black_line():
return hamster.left_floor() < 20 or hamster.right_floor() < 20
def do_sound():
hamster.beep()
when_do(when_hand_found, do_move_backward)
when_do(when_on_black_line, do_sound)
# Ctrl+C 키를 누를 때까지 계속 기다립니다.
wait(-1)
두 대의 햄스터가 상황에 따라 동작하기
두 대의 햄스터가 쌍둥이처럼 같은 상황에서 같은 동작을 하게 하려면 어떻게 해야 할까요?
from roboid import *
hamster1 = Hamster()
hamster2 = Hamster()
def when_hand_found1():
return hamster1.left_proximity() > 30 or hamster1.right_proximity() > 30
def do_move_backward1():
hamster1.wheels(-30)
wait(1000)
hamster1.stop()
def when_on_black_line1():
return hamster1.left_floor() < 20 or hamster1.right_floor() < 20
def do_sound1():
hamster1.beep()
def when_hand_found2():
return hamster2.left_proximity() > 30 or hamster2.right_proximity() > 30
def do_move_backward2():
hamster2.wheels(-30)
wait(1000)
hamster2.stop()
def when_on_black_line2():
return hamster2.left_floor() < 20 or hamster2.right_floor() < 20
def do_sound2():
hamster2.beep()
when_do(when_hand_found1, do_move_backward1)
when_do(when_on_black_line1, do_sound1)
when_do(when_hand_found2, do_move_backward2)
when_do(when_on_black_line2, do_sound2)
# Ctrl+C 키를 누를 때까지 계속 기다립니다.
wait(-1)
동작은 하겠지만 코드가 비효율적입니다.
햄스터가 10대면 어떻게 될지 생각해 봅시다.
when_do 함수는 when에 해당하는 함수와 do에 해당하는 함수에게 인자를 전달해 줄 수 있습니다.
인자는 자료형이 무엇이든 그대로 전달해 줍니다.
또한 인자는 when에 해당하는 함수와 do에 해당하는 함수에 똑같이 전달됩니다.
인자는 하나 밖에 전달할 수 없기 때문에 여러 개를 전달하려면 튜플이나 딕셔너리로 만들어 전달하면 됩니다.
주의할 점은, 인자를 전달하는 경우에는 when에 해당하는 함수와 do에 해당하는 함수를
반드시 인자를 받도록 정의해야 합니다.
from roboid import *
hamster1 = Hamster()
hamster2 = Hamster()
def when_hand_found(robot):
return robot.left_proximity() > 30 or robot.right_proximity() > 30
def do_move_backward(robot):
robot.wheels(-30)
wait(1000)
robot.stop()
def when_on_black_line(robot):
return robot.left_floor() < 20 or robot.right_floor() < 20
def do_sound(robot):
robot.beep()
when_do(when_hand_found, do_move_backward, hamster1)
when_do(when_on_black_line, do_sound, hamster1)
when_do(when_hand_found, do_move_backward, hamster2)
when_do(when_on_black_line, do_sound, hamster2)
# Ctrl+C 키를 누를 때까지 계속 기다립니다.
wait(-1)
목차
고급
- 행위 기반의 로봇 제어
- 경로 탐색
- 자리 바꾸기
Copyright 로봇SW교육원 All rights reserved.
어려운 일이 있으면 광운대학교 로봇학부 박광현 교수(
akaii@kw.ac.kr)에게 연락하세요.