키보드 제어
학습 목표
키를 누른 순간뿐 아니라 놓거나 통신이 끊긴 뒤의 동작도 정해야 움직이는 장치를 멈출 수 있습니다.
실행 조건
입력 이벤트 목록으로 동작을 재현합니다. 실제 키보드·장치 연결은 같은 처리 함수를 이벤트 수신부와 연결하는 별도 단계입니다.
키 입력을 속도 명령으로
시작 조건
s, key=[w,w,release,d,quit,w]. w=(1,0), d=(0,-1) m/s로 둡니다.
진행 방법
- 각 입력을 vx·vy·종료 상태로 바꾸는 순수 함수를 만드세요.
- release에서는 속도를 0으로, quit 이후에는 모든 입력을 무시하도록 처리하세요.
- 입력 행별로 명령 벡터와 상태를 기록하세요.
남길 결과
- 6행 입력 처리 표와 처리 함수.
events=list(zip([0,.1,.2,.3,.4,.5],['w','w','release','d','quit','w']))
key_velocity={'w':(1.,0.),'s':(-1.,0.),'a':(0.,1.),'d':(0.,-1.)}
# TODO: 종료 상태를 포함하는 decode(key, stopped) 함수를 작성하세요.
결과 기록·자가 점검
t [s]:
key:
vx [m/s]:
vy [m/s]:
종료 상태:
확인할 점
- quit 뒤의 w에서 속도가 다시 켜지지 않는가?
- 정의하지 않은 키는 정지 또는 명시한 무시 규칙으로 처리되는가?
시간 간격과 누적 이동
시작 조건
활동 1의 속도를 다음 입력 시점까지 유지한다고 가정합니다. 초기 위치는 (0,0) m입니다.
진행 방법
- 각 구간에서 Δ위치=v*Δt를 계산하세요.
- 시간별 위치 표와 xy 궤적을 그리세요.
- 입력 간격을 모두 .2 s로 바꾼 결과와 비교하세요.
남길 결과
- 두 간격 조건의 궤적과 최종 위치 비교.
import numpy as np
import matplotlib.pyplot as plt
position=np.zeros(2)
# TODO: 첫 활동의 명령을 시간 간격에 따라 적분하세요.
결과 기록·자가 점검
구간:
Δt [s]:
속도 [m/s]:
누적 위치 [m]:
확인할 점
- 속도와 이동 거리를 구분했는가?
- 종료 이후 위치가 고정되는가?
중복 입력과 긴 공백
시작 조건
w 키가 s에 반복되고, 이후 .5 s 동안 입력이 없는 기록을 추가합니다. Timeout은 .2 s로 둡니다.
진행 방법
- 중복 입력은 속도 설정으로 해석하고 누적 가속 명령으로 해석하지 않도록 비교하세요.
- 마지막 입력 이후 .2 s가 지나면 정지하는 규칙을 넣으세요.
- Timeout 전후 명령과 위치가 어떻게 달라지는지 기록하세요.
남길 결과
- Timeout 적용 전후 그림과 동작 규칙 3문장.
events=[(0.,'w'),(.01,'w'),(.02,'w')]
timeout=.2
# TODO: .01 s 간격의 가상 시계로 .5 s까지 명령을 계산하세요.
결과 기록·자가 점검
시점:
마지막 입력과 간격 [s]:
Timeout 여부:
속도:
위치:
확인할 점
- 실제 OS 키보드 입력을 보내지 않고 기록된 events로 재현 가능한가?
- 입력 처리·시간 갱신·장치 전송이 서로 구분되어 있는가?