Download presentation
Presentation is loading. Please wait.
1
햄스터 미로찾기 광운대학교 로봇학부 박광현
2
블록 커버 레고블록 나노블록
3
블록 커버 나노블록 레고블록
4
컵 따라 돌기
5
근접 센서 컵
6
반사판 양쪽 반사판을 끼워 주세요 !!
7
미로찾기용 부품 조립 방법 위에서 누르면 끼울 수 있어요 뒤에서 앞으로 밀면 뺄 수 있어요
8
컵 따라 돌기 컵 컵 컵
9
컵 따라 돌기 from roboid import * hamster = Hamster() while True:
if hamster.left_proximity() > 10: hamster.wheels(30, 0) else: hamster.wheels(0, 30) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { hamster_create(); while(1) { if(hamster_left_proximity() > 10) hamster_wheels(30, 0); else hamster_wheels(0, 30); wait(10); } return 0;
10
개선된 컵 따라 돌기 컵 컵 컵
11
개선된 컵 따라 돌기 from roboid import * hamster = Hamster() while True:
if hamster.left_proximity() > 10: hamster.wheels(30, 30) else: hamster.wheels(0, 30) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { hamster_create(); while(1) { if(hamster_left_proximity() > 10) hamster_wheels(30, 30); else hamster_wheels(0, 30); wait(10); } return 0;
12
좀 더 개선된 컵 따라 돌기 근접 센서 값이 커지면 바퀴의 속도도 커진다 ?
13
좀 더 개선된 컵 따라 돌기 from roboid import * hamster = Hamster() while True:
hamster.wheels(hamster.left_proximity(), 30) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { hamster_create(); while(1) { hamster_wheels(hamster_left_proximity(), 30); wait(10); } return 0;
14
원 운동 컵
15
원하는 거리만큼 떨어져서 돌기 센서 위치를 컵의 중심에 맞춘다 !! 원하는 거리만큼 컵 30
16
원하는 거리만큼 떨어져서 돌기 센서 위치를 컵의 중심에 맞춘다 !! 컵 센서 값: 16 30 센서 값: 16
17
원하는 거리만큼 떨어져서 돌기 센서 위치를 컵의 중심에 맞춘다 !! 컵 센서 값: 16 30 센서 값: 16
30 16 = 1.875
18
원하는 거리만큼 떨어져서 돌기 from roboid import * hamster = Hamster() while True:
hamster.wheels(hamster.left_proximity() * 1.875, 30) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { hamster_create(); while(1) { hamster_wheels(hamster_left_proximity() * 1.875, 30); wait(10); } return 0;
19
여러 가지 활동들 중급 일정 횟수만큼 돌고 정지하기 고급 컵 라인 트레이싱 + 컵 따라 돌기 컵
20
여러 가지 활동들 중급 고급 햄스터 플래닛 중급 컵
21
슬라럼 경주 컵 컵 컵
22
슬라럼 경주 컵 컵 컵 중간으로 지나가게 하는 방법은?
23
슬라럼 경주 컵 컵 4 오른쪽 컵이 사라질 때까지 왼쪽 컵 따라 돌기 2 왼쪽 컵이 사라질 때까지 오른쪽 컵 따라 돌기 1
오른쪽 컵을 발견할 때까지 왼쪽 컵 따라 돌기 3 왼쪽 컵을 발견할 때까지 오른쪽 컵 따라 돌기
24
판단 기준 안전한 범위 다른 컵 사라짐 다른 컵 발견 기 준 값 5 15 컵 10 20 실제 센서 값 센서 값: 20
25
다이어그램 왼쪽 컵 따라 돌기 오른쪽 컵 따라 돌기 상태 상태 1 오른쪽 센서 > 15 오른쪽 센서 < 5
상태 1 오른쪽 센서 > 15 오른쪽 센서 < 5 왼쪽 센서 < 5 상태 3 상태 2 왼쪽 센서 > 15 왼쪽 컵 따라 돌기 오른쪽 컵 따라 돌기
26
잘 안 되는 코드... 왜?
27
잘 안 되는 코드... 왜?
28
잘 안 되는 코드... 왜? from roboid import * hamster = Hamster() state = 0
#include "roboid.h" int main(int argc, char *argv[]) { int state = 0, left, right; hamster_create(); while(1) { left = hamster_left_proximity(); right = hamster_right_proximity(); switch(state) { case 0: hamster_wheels(left * 2.5, 50); if(right > 15) state = 1; break; case 1: hamster_wheels(50, right * 2.5); if(left < 5) state = 2; case 2: if(left > 15) state = 3; case 3: if(right < 5) state = 0; } wait(10); return 0; from roboid import * hamster = Hamster() state = 0 while True: left = hamster.left_proximity() right = hamster.right_proximity() if state == 0: hamster.wheels(left * 2.5, 50) if right > 15: state = 1 elif state == 1: hamster.wheels(50, right * 2.5) if left < 5: state = 2 elif state == 2: if left > 15: state = 3 else: if right < 5: state = 0 wait(10)
29
순간적으로 튀는 센서 값 제거하기 10번 연속으로 조건 만족하면...
30
순간적으로 튀는 센서 값 제거하기 10번 연속으로 조건 만족하면...
31
다르게 작성해 보기
32
다르게 작성해 보기
33
2% 부족한... 그러나 좀 더 간단한 10번 연속으로 조건 만족하면...
34
2% 부족한... 그러나 좀 더 간단한 10번 연속으로 조건 만족하면...
35
순간적으로 튀는 센서 값 제거하기 from roboid import * hamster = Hamster() state = 0
count = 0 while True: left = hamster.left_proximity() right = hamster.right_proximity() if state == 0: hamster.wheels(left * 2.5, 50) if right > 15: count += 1 else: count = 0 if count > 10: state = 1 elif state == 1: hamster.wheels(50, right * 2.5) if left < 5: count += 1 state = 2 elif state == 2: hamster.wheels(50, right * 2.5) if left > 15: count += 1 else: count = 0 if count > 10: count = 0 state = 3 else: hamster.wheels(left * 2.5, 50) if right < 5: count += 1 state = 0 wait(10)
36
다르게 작성해 보기 from roboid import * hamster = Hamster()
def slalom(left_speed, right_speed, check): count = 0 while count < 10: left = hamster.left_proximity() right = hamster.right_proximity() hamster.wheels(left_speed(left, right), right_speed(left, right)) if check(left, right): count += 1 else: count = 0 wait(10) while True: slalom(lambda l, r: l * 2.5, lambda l, r: 50, lambda l, r: r > 15) slalom(lambda l, r: 50, lambda l, r: r * 2.5, lambda l, r: l < 5) slalom(lambda l, r: 50, lambda l, r: r * 2.5, lambda l, r: l > 15) slalom(lambda l, r: l * 2.5, lambda l, r: 50, lambda l, r: r < 5)
37
이렇게 작성할 수도 있지만 좀 그러한...
38
순간적으로 튀는 센서 값 제거하기 #include "roboid.h"
int main(int argc, char *argv[]) { int state = 0, count = 0, left, right; hamster_create(); while(1) { left = hamster_left_proximity(); right = hamster_right_proximity(); switch(state) { case 0: hamster_wheels(left * 2.5, 50); if(right > 15) count ++; else count = 0; if(count > 10) { count = 0; state = 1; } break; case 1: hamster_wheels(50, right * 2.5); if(left < 5) count ++; state = 2; case 2: hamster_wheels(50, right * 2.5); if(left > 15) count ++; else count = 0; if(count > 10) { count = 0; state = 3; } break; case 3: hamster_wheels(left * 2.5, 50); if(right < 5) count ++; state = 0; wait(10); return 0;
39
미로 찾기
40
한 쪽 센서 사용하여 벽 따라 가기 미로판 왼쪽 벽을 따라 주행
41
한 쪽 센서 사용하여 벽 따라 가기 원하는 거리만큼 센서 값: 30 센서 값 > 30 센서 값 < 30
42
한 쪽 센서 사용하여 벽 따라 가기 from roboid import * hamster = Hamster()
while True: if hamster.left_proximity() > 30: hamster.wheels(50, 0) else: hamster.wheels(0, 50) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { hamster_create(); while(1) { if(hamster_left_proximity() > 30) hamster_wheels(50, 0); else hamster_wheels(0, 50); wait(10); } return 0;
43
양쪽 센서 사용하여 복도 주행 미로판 복도 중앙으로 주행
44
양쪽 센서 사용하여 복도 주행
45
양쪽 센서 사용하여 복도 주행 왼쪽 센서 값 > 오른쪽 센서 값 왼쪽 센서 값 < 오른쪽 센서 값
46
양쪽 센서 사용하여 복도 주행
47
양쪽 센서 사용하여 복도 주행 오른쪽으로 많이 움직여야... 오른쪽으로 조금 움직이면...
48
양쪽 센서 사용하여 복도 주행
49
양쪽 센서 사용하여 복도 주행 from roboid import * hamster = Hamster() while True:
diff = hamster.left_proximity() - hamster.right_proximity() hamster.wheels(50 + diff * 1.3, 50 - diff * 1.3) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { int diff; hamster_create(); while(1) { diff = hamster_left_proximity() - hamster_right_proximity() hamster_wheels(50 + diff * 1.3, 50 - diff * 1.3); wait(10); } return 0;
50
미로 찾기 왼쪽 반사판으로 교체해 주세요 !!
51
미로 찾기 원하는 거리만큼 센서 값: 35 왼쪽 벽을 따라 주행
52
미로 찾기 오른쪽으로 많이 움직여야... 오른쪽으로 조금 움직이면...
53
미로 찾기 왼쪽 벽을 따라 주행
54
from roboid import * hamster = Hamster() while True: diff = hamster.left_proximity() - 35 hamster.wheels(50 + diff * 0.8, 50 – diff * 0.8) wait(10) #include "roboid.h" int main(int argc, char *argv[]) { int diff; hamster_create(); while(1) { diff = hamster_left_proximity() - 35; hamster_wheels(50 + diff * 0.8, 50 – diff * 0.8); wait(10); } return 0;
55
모퉁이를 잘 도는가? 미로판
56
모퉁이를 잘 도는가?
57
막힌 길에서 제자리 돌기 언제까지 돌아야 하나?
58
미로 찾기 미로판
59
미로 찾기 좌수법 (좌선법): 왼쪽 앞쪽 오른쪽 왼쪽 벽을 따라 주행
앞쪽에 벽이 있으면 벽이 없을 때까지 오른쪽으로 회전
60
미로 찾기
61
미로 찾기 from roboid import * hamster = Hamster() while True:
left = hamster.left_proximity() right = hamster.right_proximity() if right > 47: while right > 5: hamster.wheels(50, -50) wait(10) else: diff = left – 35 hamster.wheels(50 + diff * 0.8, 50 – diff * 0.8) #include "roboid.h" int main(int argc, char *argv[]) { int left, right, diff; hamster_create(); while(1) { left = hamster_left_proximity(); right = hamster_right_proximity(); if(right > 47) { while(right > 5) { hamster_wheels(50, -50); wait(10); } } else { diff = left – 35; hamster_wheels(50 + diff * 0.8, 50 – diff * 0.8); return 0;
62
생각해 봅시다
63
햄스터 플래닛 중급 고급 컵 컵 컵과의 거리가 점점 멀어지다가 점점 가까워지다가... 타원 궤도를 따라 이동하기
64
최단 경로 찾기 출발 도착
65
알고리즘 미로 탐색 알고리즘 미로 제작 알고리즘 좌수법(좌선법), 우수법(우선법) 깊이 우선 탐색, 너비 우선 탐색
다익스트라 알고리즘 A* 알고리즘 미로 제작 알고리즘
66
수고하셨습니다.
Similar presentations