본문으로 이동
Kim Jongwon
← 전체 프로젝트

임베디드 제어 | 4인 팀 졸업작품 | 팀장 | 2025.03 - 2025.11

Face-Tracking Robot Arm Camera System

얼굴을 따라가는 촬영용 로봇팔 (OpenCV, Arduino)

4인 팀 팀장으로 Python–Arduino 통신과 로봇팔 제어 통합, 모터 떨림 안정화를 맡았습니다.

재인식 시간

1.8초 이내

팀 발표 측정값 (FHD, 약 70cm)

이동 안정성

83% 이상

이동 중 15px 이내 프레임 비율

정지 안정성

82% 이상

정지 시 반지름 33px 안 좌표 비율

Python, Arduino, 서보 제어로 구성된 얼굴 추적 로봇팔 제어 다이어그램
얼굴 인식 → 모터 제어 흐름

과제 배경

어려웠던 점

얼굴을 찾는 것보다, 흔들리는 좌표를 걸러 로봇팔이 부드럽게 따라가고 멈추게 하는 것이 어려웠습니다.

직접 한 일

  • 4인 팀 팀장으로 일정 조율, 역할 분담, 최종 발표를 이끌었습니다.
  • Python–Arduino 시리얼 통신과 로봇팔 제어 통합, 모터 안정화를 맡았습니다.
  • 좌표 흔들림과 모터 반응이 맞물리는 구간에서 필터와 제어 값을 반복 조정했습니다.

결과

  • 정보기술대학장 장려상 (팀 수상)
  • 재인식 1.8초 이내, 이동 안정성 83%, 정지 안정성 82% (팀 발표 측정값)
  • 하드웨어 교체와 소프트웨어 필터링을 함께 적용해 떨림 개선

제어 흐름

얼굴 좌표에서 모터까지

얼굴 좌표가 모터 명령으로 바뀌는 과정입니다.

  • OpenCV가 찾은 얼굴 좌표를 Python에서 걸러낸 뒤 Arduino로 모터 명령을 보냅니다.
  • Arduino와 PCA9685 서보 드라이버가 명령을 받아 카메라 팔을 움직이도록 소프트웨어와 하드웨어 제어를 연결했습니다.
  • OneEuro 필터, 비례 제어, 데드존, 지수 평균 등을 단계적으로 적용해 모터 떨림과 추적 반응을 개선했습니다.
  • 팀은 재인식 시간(FRT), 이동 중 안정성(IFR), 정지 안정성(ICR)을 측정해 최종 발표에 사용했습니다.
PythonOpenCVArduino시리얼 통신서보 제어

결과물

하드웨어와 시연

최종 로봇팔, 시연 영상, 영상 처리 구조, 수상 기록입니다.

얼굴 추적 기반 촬영 보조 로봇팔 최종 하드웨어
최종 로봇팔 하드웨어 원본 보기
최종 시연 영상
OpenCV 영상처리와 추적 소프트웨어 구조
영상 처리 소프트웨어 구조 원본 보기
정보기술대학장 장려상 상장
정보기술대학장 장려상 원본 보기

핵심 코드

Python → Arduino 모터 명령 전송

모터 7개의 명령을 한 줄로 묶어 보내고, 전송 성공과 실패를 기록합니다.

Python → Arduino 모터 명령 전송

src/python/main.py

try:
    # motor_1 ~ motor_7 값 전송
    vals = [motor_cmds.get(f"motor_{i}", 0) for i in range(1, 8)]
    message = ','.join(map(str, vals)) + '\n'

    ser.write(message.encode('utf-8'))
    serial_health["total_sent"] += 1
    serial_health["last_success_time"] = time.time()
    serial_health["consecutive_errors"] = 0
    debug_counters["serial_sent"] += 1

    debug_log(f"시리얼 전송 #{debug_counters['serial_sent']}: {message.strip()}", "DETAIL")

직접 확인하기

코드와 자료

아래 링크에서 코드, 설계 문서, 실행 기록을 직접 확인할 수 있습니다.

맡은 범위

  • 직접 맡은 범위: 팀장, Python–Arduino 시리얼 통신, 제어 통합, 모터 안정화.
  • 팀 결과: 영상 처리, 하드웨어, 측정 지표를 포함한 전체 시스템과 수상.

범위와 한계: 수치는 저장소에 적힌 조건(FHD, 약 70cm, 각 3회)에서 팀이 측정한 최종 발표값입니다.