강의자료 · 로봇기초실습

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

실행 조건

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

이번에 배울 내용

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

전체 흐름

검출 중심 → 영상 오차 → 유효성·제한 → 명령·정지

영상 오차와 물리 명령은 다릅니다

물체 중심과 화면 중심의 차이는 pixel 단위입니다. 이를 실제 속도로 바꾸려면 카메라 방향·기체 좌표·Scale이 필요합니다. 먼저 영상 공간의 제한된 수정 명령으로 부호와 오류 처리를 검증합니다.

없어진 관측과 늦은 관측

검출 결과의 None은 물체를 찾지 못했다는 뜻이고, 좌표 (0,0)은 영상의 왼쪽 위 픽셀입니다. 두 경우를 구분해 검출 실패 시에는 속도 명령을 0으로 둡니다.

Filter를 적용한 중심 좌표가 덜 흔들리더라도, 물체가 이동하기 시작한 시점부터 좌표가 따라가기까지의 지연도 함께 살펴봅니다.

보유 기체로 연결할 때의 경계

영상 검출과 명령 계산을 먼저 저장 영상에서 확인합니다. MATLAB에서는 camera와 snapshot, Python에서는 streamon과 get_frame_read로 프레임을 얻는 부분만 바꿉니다.

보유 Tello를 연결하는 경우에도 검출 실패·오래된 Frame의 정지 규칙은 동일하게 유지합니다.

풀이 예제

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

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')
[0.5 0. ] [0. 0.]
실행 결과

공식 문서·데이터

참고 예제

추가 예제 보기

참고 자료