← 전체 프로젝트
얼굴 인식 → 모터 제어 흐름
임베디드 제어 | 4인 팀 졸업작품 | 팀장 | 2025.03 - 2025.11
Face-Tracking Robot Arm Camera System
얼굴을 따라가는 촬영용 로봇팔 (OpenCV, Arduino)
4인 팀 팀장으로 Python–Arduino 통신과 로봇팔 제어 통합, 모터 떨림 안정화를 맡았습니다.
재인식 시간
1.8초 이내
팀 발표 측정값 (FHD, 약 70cm)
이동 안정성
83% 이상
이동 중 15px 이내 프레임 비율
정지 안정성
82% 이상
정지 시 반지름 33px 안 좌표 비율
과제 배경
어려웠던 점
얼굴을 찾는 것보다, 흔들리는 좌표를 걸러 로봇팔이 부드럽게 따라가고 멈추게 하는 것이 어려웠습니다.
직접 한 일
- 4인 팀 팀장으로 일정 조율, 역할 분담, 최종 발표를 이끌었습니다.
- Python–Arduino 시리얼 통신과 로봇팔 제어 통합, 모터 안정화를 맡았습니다.
- 좌표 흔들림과 모터 반응이 맞물리는 구간에서 필터와 제어 값을 반복 조정했습니다.
결과
- 정보기술대학장 장려상 (팀 수상)
- 재인식 1.8초 이내, 이동 안정성 83%, 정지 안정성 82% (팀 발표 측정값)
- 하드웨어 교체와 소프트웨어 필터링을 함께 적용해 떨림 개선
제어 흐름
얼굴 좌표에서 모터까지
얼굴 좌표가 모터 명령으로 바뀌는 과정입니다.
- OpenCV가 찾은 얼굴 좌표를 Python에서 걸러낸 뒤 Arduino로 모터 명령을 보냅니다.
- Arduino와 PCA9685 서보 드라이버가 명령을 받아 카메라 팔을 움직이도록 소프트웨어와 하드웨어 제어를 연결했습니다.
- OneEuro 필터, 비례 제어, 데드존, 지수 평균 등을 단계적으로 적용해 모터 떨림과 추적 반응을 개선했습니다.
- 팀은 재인식 시간(FRT), 이동 중 안정성(IFR), 정지 안정성(ICR)을 측정해 최종 발표에 사용했습니다.
PythonOpenCVArduino시리얼 통신서보 제어
핵심 코드
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회)에서 팀이 측정한 최종 발표값입니다.