강의자료 · 로봇기초실습

영상 검출에서 안전한 제어 명령으로

학습 목표

영상의 좌우·상하 오차를 이동 명령으로 바꿀 때 부호 오류와 흔들림이 어떻게 생기는지 모의 입력에서 확인합니다.

실행 조건

기본 활동은 NumPy·Matplotlib을 사용합니다. 앞 단원과 연결할 때 OpenCV를 사용합니다.

검출 위치를 오차로 바꾸기

시작 조건

160×120 영상의 중심은 (80,60), 관측 중심은 (110,50)입니다. x는 오른쪽, y는 아래쪽입니다.

진행 방법

  1. 예제의 command(center)와 같은 부호로 ex=x−80e_x=x-80, ey=y−60e_y=y-60을 계산하세요. 중심과 관측점을 찍고 중심에서 관측점으로 향하는 화살표에 두 오차를 표시하세요.
  2. 각 축에서 |e|≤10|e|\le10 pixel이면 명령 0, 나머지는 0.02e0.02e로 계산한 뒤 범위를 [−0.5,0.5][-0.5,0.5]로 제한하세요. (110,50)(110,50)의 두 축 명령을 계산하고 함수 출력과 나란히 기록하세요.

남길 결과

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:

유효 여부:

명령:

확인할 점

흔들림과 미검출 처리

시작 조건

x 관측은 [80,82,79,110,None,108], y=60y=60입니다. None은 물체를 찾지 못한 Frame입니다.

진행 방법

  1. 각 유효 관측에 command((x,60))를 적용한 명령과, 최근 유효 관측 최대 3개의 x 평균에 적용한 명령을 각각 구하세요. 시작 시 표본이 3개보다 적으면 모인 표본만 평균냅니다.
  2. None에서 명령을 0으로 만들고 평균용 기록도 비우세요. 뒤의 108은 새 기록의 첫 표본으로 처리하세요.
  3. 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:

명령:

미검출 처리:

확인할 점

검출부터 명령까지 연결하기

시작 조건

앞 단원의 Mask 중심 계산을 command에 연결합니다. 기본 활동은 저장·생성 영상만 사용합니다.

진행 방법

  1. 중심·면적·검출 시각을 반환하는 함수와 명령 함수를 나누세요.
  2. 빈 Mask·유효한 영역·검출 후 0.2초보다 오래 지난 Frame을 차례로 시험하세요. 현재 시각과 Frame 검출 시각의 차이로 오래된 Frame을 판정하고, 이때 명령을 0으로 처리하세요.
  3. 실제 장치에서 추가로 필요한 좌표 변환·속도 제한·정지 조건을 적으세요.

남길 결과

# TODO: detect_center(frame)와 command(center)를 연결하고,
# Frame 시각이 .2초보다 오래되면 명령을 0으로 처리하세요.

결과 기록·자가 점검

입력 Frame:

검출 유효성:

명령:

정지 이유:

확인할 점

공식 예제·데이터