영상 검출에서 안전한 제어 명령으로
학습 목표
영상의 좌우·상하 오차를 이동 명령으로 바꿀 때 부호 오류와 흔들림이 어떻게 생기는지 모의 입력에서 확인합니다.
실행 조건
기본 활동은 NumPy·Matplotlib을 사용합니다. 앞 단원과 연결할 때 OpenCV를 사용합니다.
검출 위치를 오차로 바꾸기
시작 조건
160×120 영상의 중심은 (80,60), 관측 중심은 (110,50)입니다. x는 오른쪽, y는 아래쪽입니다.
진행 방법
- 예제의
command(center)와 같은 부호로 , 을 계산하세요. 중심과 관측점을 찍고 중심에서 관측점으로 향하는 화살표에 두 오차를 표시하세요. - 각 축에서 pixel이면 명령 0, 나머지는 로 계산한 뒤 범위를 로 제한하세요. 의 두 축 명령을 계산하고 함수 출력과 나란히 기록하세요.
남길 결과
- 중심·오차 화살표 그림과 명령 예.
import numpy as np
import matplotlib.pyplot as plt
def command(center):
if center is None:return np.zeros(2)
error=np.asarray(center)-[80,60]
return np.clip(np.where(np.abs(error)<=10,0,.02*error),-.5,.5)
print(command((110,50)),command(None))
plt.scatter([80,110],[60,50]);plt.arrow(80,60,30,-10,head_width=3);plt.xlim(0,160);plt.ylim(120,0);plt.gca().set_aspect('equal')
결과 기록·자가 점검
관측 중심:
오차 x·y:
유효 여부:
명령:
확인할 점
- 영상 y축 방향을 세계 좌표의 위쪽과 혼동하지 않았는가?
- Pixel Error·Normalized Command를 실제 기체의 Velocity [m/s]와 구분했는가?
흔들림과 미검출 처리
시작 조건
x 관측은 [80,82,79,110,None,108], 입니다. None은 물체를 찾지 못한 Frame입니다.
진행 방법
- 각 유효 관측에
command((x,60))를 적용한 명령과, 최근 유효 관측 최대 3개의 x 평균에 적용한 명령을 각각 구하세요. 시작 시 표본이 3개보다 적으면 모인 표본만 평균냅니다. None에서 명령을 0으로 만들고 평균용 기록도 비우세요. 뒤의 108은 새 기록의 첫 표본으로 처리하세요.- Frame 순서·원 관측·평균 x·두 명령을 표로 남기고 같은 Frame 축에 표시하세요. 110으로 바뀐 Frame의 두 명령과 미검출 직후 명령을 짚어 차이를 설명하세요.
남길 결과
- 관측–명령 시계열과 미검출 규칙.
from collections import deque
history=deque(maxlen=3)
for x in [80,82,79,110,None,108]:
if x is None:history.clear();filtered=None
else:history.append(x);filtered=(np.mean(history),60)
print(x,filtered,command(filtered))
# TODO: raw·filtered 명령을 같은 축에 그리세요.
결과 기록·자가 점검
Frame:
관측 x:
필터 x:
명령:
미검출 처리:
확인할 점
- 이동평균이 반응 지연을 만든다는 점도 확인했는가?
- None을 숫자 0으로 평균에 넣지 않았는가?
검출부터 명령까지 연결하기
시작 조건
앞 단원의 Mask 중심 계산을 command에 연결합니다. 기본 활동은 저장·생성 영상만 사용합니다.
진행 방법
- 중심·면적·검출 시각을 반환하는 함수와 명령 함수를 나누세요.
- 빈 Mask·유효한 영역·검출 후 0.2초보다 오래 지난 Frame을 차례로 시험하세요. 현재 시각과 Frame 검출 시각의 차이로 오래된 Frame을 판정하고, 이때 명령을 0으로 처리하세요.
- 실제 장치에서 추가로 필요한 좌표 변환·속도 제한·정지 조건을 적으세요.
남길 결과
- 입력→검출→검증→명령 흐름도와 오류 사례 표.
# TODO: detect_center(frame)와 command(center)를 연결하고,
# Frame 시각이 .2초보다 오래되면 명령을 0으로 처리하세요.
결과 기록·자가 점검
입력 Frame:
검출 유효성:
명령:
정지 이유:
확인할 점
- 검출이 실패해도 이전 속도 명령이 남지 않는가?
- 실제 비행 없이 오류 경로를 시험할 수 있는가?