[한이음 ICT] 해커톤 공모전 도전기

대학교 4학년 시절, 당시 임베디드 개발자가 되고 싶었고, 지금까지 쌓아온 역량을 모두 쏟아내 보자는 생각으로 도전했었던 Face Tracking HomeCCTV 개발 과정을 정리해보려 합니다.


2017년도에 진행한 해커톤,, 사실 지금 와서 돌이켜 보면,  패기만 많이 앞섰던 것으로 기억합니다.

나름 대학 생활을 열심히 했었고, 임베디드 분야에도 자신은 있었지만, 다른 개발 분야에 대해서 문제가 발생 했었을 때 , 어떻게 이 부분을 해결해 나가지 하는 역량은 많이 부족했던 것 같습니다. 발생한 이슈에 대해서 해결을 못하고 시간만 흘려 보냄으로서 유발 된 스트레스는, 당시 팀원들까지 지치게 만들고 힘들게 했던 것으로 기억합니다. 


그래도 같이 모여서 밤새서 개발하고, 찜질방에서 같이 자고 하나의 서비스, 제품을 만들어내는 과정들은,,  개인적으로 살면서 느꼈던 가장 강렬한 열정 이었고, 하루하루가 살아 숨 쉬는 것 같은? 느낌으로 기억합니다. 

반복되는 회사 생활로 잊고 있었던 이 열정은 우연히 작년에 Startup 드라마를 보면서 개인적으로 자극제 가되었고, 이러한 경험 들이 개인적으로 스타트업에 관심을 가지게 된 계기가 되었습니다.



1. 작품개요

1. 작품 소개 

  • - HomeCCTV

- HomeCCTV 란 가정용 IP 카메라로 앱을 통해서 실시간 감시가 가능한 CCTV 를 의미합니다.

- 집 외출 시 편리하게 집안을 감시할 수 있는 기능을 가지고 있습니다.




  • - 기획의도

- 기존의 IP 카메라는 하나의 서버에 여러 IP 카메라를 공유하여 서버가 해킹되면 그 서버에 연결된 모든 카메라가 해킹되어 오히려 감시의 대상이 됩니다.

- 기존의 IP 카메라에서 좀 더 신뢰성 있고 저렴한 가격의 HomeCCTV 를 만드는게 목접입니다.

- 휴대용 CCTV 의 부품도와 3D 도면, OpenSource 를 공개해 다른 사람들도 쉽게 제작하여 독자적으로 사용할 수 있게 하는 것이 목표입니다.


(* 사실 지금에 와서야 당시에 생각했었던 보안방법은 충분히 다 뚫릴 수 있다는 것을 알고 있지만 당시에는 대학생 수준의 한정된 기술력으로 구현을 했어야 했기에 기획 의도가 

어쩔 수 없이 짜 맞추기로 넣었던 게 참 아쉬웠던 것으로 생각합니다)




  • - 작품 내용

- RaspberryPi , Server, Application 을 이용해서 휴대가 가능한 HomeCCTV 를 만들었으며, 침입 모드 와 수동 모드로 나누어 침입 모드에서는 얼굴을 카메라가 추적하며 수동 모드 에서는 앱으로 카메라 제어가 가능합니다. 또한 앱과  디바이스 모두 침임 모드와 수동 모드 제어가 가능합니다.




2. 작품의 개발 배경 및 필요성

  • - 국내  1인가구가 증가하고 있는 추세의 한국 트렌드
  • - 혼자 사는 여성의 불안함과, 일과 시간에 혼자 남겨있는 애완동물의 관심, 개인 프라이버시 등의 욕구 해결
  • - IP 카메라의 해킹 문제로 인한 기존 제품의 신뢰성 저하로 독자적인 서버와 암호 설정으로 보안 증대


(*  당시에 IP 카메라의 해킹에 대한 뉴스 보도가 많았습니다. 하지만 그렇다고 개인 서버망을 이용한다고 해서 해킹이 불가능 한거는 아니었습니다만...  )




3. 작품의 특징 및 장점

- 디바이스 자체적으로 터치 센서를 통해 앱 뿐만 아니라 침입 모드와 수동 모드 조작이 가능하다.

- 30여 글자에 달하는 서버 암호 길이와 여러 사람들이 공유하는 상업용 서버 방식이 아닌 독자적인 서버를 이용하여 사용하는 OpenSource 방식 목적으로 개발하여 주기적인 암호 변경과 해킹 여부를 곧바로 알 수 있다. 


(*  아으.....  교수님에게 한번이라도 물어볼 걸..  )




2. 작품 내용

1. 작품 구성도

- 전체 하드웨어 구조

RaspberryPi 내부에 Linux 기반 OS 를 사용하게 됩니다. OpenCV 를 통해서 각종 하드웨어 모듈을 연동해 제어하고, wifi 모듈을 통해서 서버에 통신 및 영상 스트리밍 기능을 사용하게 됩니다.





하드웨어 동작 원리

하드웨어는 5개의 쓰레드를 가지고 독자적인 프로세스를 수행하게 됩니다.


  • 1. OpenCV 를 활용해 얼굴을 인식하는 쓰레드
  • 2. 모니터를 연결 시 GUI 화면상에서 영상을 보여주는 쓰레드
  • 3. 얼굴을 인식하면 얼굴을 추적(Tracking) 하는 기능을 가진 쓰레드
  • 4. 터치센서로 침입(Tracking) 모드와 수동 모드를 변경하는 쓰레드
  • 5. 서버와 통신 및 앱상의 조이스틱 제어를 위한 쓰레드 


그리고 main 문을 통해서 초기 카메라 각도, 부저를 설정 및 영상 저장을 하게 됩니다.





전체 통신 구조

FFMPEG 를 이용해 영상정보를 RaspberryPi 서 서버로 스트리밍 영상을 송출 후, 받은 영상을 mpe4 코덱으로 FFServer 로 보내고 어플로 전송해주게 됩니다.

또한 FFServer 를 이용해 서버에서 10분 단위로 영상을 저장하게 됩니다.





통신 규약

  • 1  RaspberryPi 에서 서버로 2번 값을 주기적으로 보내게 되어서 지속적으로 현재 서버의 모드 상태를 확인하게 됩니다. 만약 현재 모드와 다르면 서버의 모드 명령을 따릅니다.
  • 2. 2번 통신의 결과로 잘 받으면 1을 오류 발생 시 0을 받게 됩니다.
  • 3. 터치센서를 통해서 침입 모드로 바꾸면 3을 송신해 서버에 알립니다.
  • 4. 터치센서를 통해서 수동 모드로 바꾸면 4을 송신해 서버에 알립니다.

* (수동 모드로 바뀌면 5을 송신해 앱내의 조이스틱값을 요청하면 61~69 까지의 값을 받고 그 값에 따라서 카메라를 조종합니다.)






통신 흐름도

라즈베리파이와 서버 앱 간의 통신 흐름도, 통신 응답 명세서에 따른 통신 방향과 구조를 설명해줍니다.





앱(Coconut Cam) 구성도

어플리케이션을 처음 구동 시 splash Image 화면이 뜨면서 2초간 대기하게 됩니다.

그 후 Main Activity 로 들어가게 되면 크게 3가지 기능 'Getting Stream Video', 'OnClick', 'Event Socket' 로 나뉘어 지고 빨간 색 박스 속의 검은색 박스는 모드 쓰레드 형식으로 독자적인 동작을 가게 됩니다. 







3D 프린팅(케이스)






2. 작품 기능

2-1 전체 기능 목록


구분기능설명현재 진척도(%)
S/WFace DetectingOpenCV 를 통한 얼굴 검출100%

디바이스 영상저장라즈베리파이 자체적으로 영상 저장100%

(앱) 조이스틱조이스틱 기능을 통한 수동 모드 제어100%

(앱) Splash Image어플의 초기 화면 이미지100%

(앱) 침입, 수동 모드 제어버튼 Event 형식의 모드 전환90%(9/10)

(서버) 영상 저장서버에서 10분 간격으로 영상 저장80%(10/30)

(서버) 통신라즈베리파이 앱 통신80%(10/30)

영상 스트리밍FFMPEG 통한 스트리밍 영상 전송100%
H/WFace TrackingDetecting 결과 값을 통한 서보모터 제어100%

터치센서 모드 변경수동 모드, 침입모드 조작100%

부저 알림각 상태에 대한 알림 표시100%


2-2 S/W 주요 기능


기능설명작품 실물 사진

Face Detecting

Face Tracking

OpenCV를 통해 얼굴인식을 구현하고

인식된 얼굴좌표값에 따른 모터 제어


(어플) 자동,

수동모드 제어

조이스틱

플에서 스트리밍 화면, 조이스틱,

버튼 동작을 제어하게됨 (UI 개선 예정)


디바이스 영상저장

OpenCV를 통해 영상을

화면을 저장하게 된다. 


(서버)영상저장, 통신

서버에서 10분 간격으로 영상을 저장

하며 라즈베리파이와 어플간의

통신 을 담당한다



2-3 H/W 주요 기능


기능/부픔설명작품 실물 사진
터치센서 모드 변경

터치센서를 통해서 수동모드 침입 모드를

변경하며 그에따른 상태 변화 값 을

서버에 전송하게 된다. 


부저 알림
각 상태에 대한 알림표시





3. 주요 적용 기술

  • OpenCV

- 라즈베리파이의 OS 내에서 OpenCV 를 통한 카메라 영상 호출, 얼굴 검출, 검출 값에 따른 서보모터 팬틸트 제어를 하게 됩니다.



  • Socket 통신

- C++ (라즈베리파이) 와 Java(서버), Android(어플) 간의 통신을 위한 Socket 을 통신하게 됩니다.



  • Texture View

- 어플에서 영상 스트리밍 구현을 위해서 Video View 가 아닌 TextureView 방식을 사용해서 영상 스트리밍 기능을 구현하게 됩니다.





4. 작품 개발 환경

구분
상세 내용

S/W

개발 환경

OS라즈베리비안 (Rinux) kernel_Version(4.9)

개발환경(IDE)Eclips, Android Studio

개발도구
Android Studio

개발언어
C++, Java, Android

기타사항
OpenCV, Scons, 활용

H/W

구성 장비

디바이스
라즈베리파이3

센서
부저, 터치센서, 서보모터 팬틸트

통신
TCP 통

개발언어
C++

기타사항
OpenCV 활용

프로젝트

관리 환경

형상관리
github

이슈관리github

의사소통관리

카카오톡 및 github

기타사항



3. 프로젝트 수행 내용

1. 멘티(참여학생) 업무 분장

번호이름대학학과학년역할담당업무
1부엉이가천대학교전자공학과4팀장임베디드 및 서버간 통신
2xxx광운대학교컴퓨터공학과3팀원서버 및 영상 스트리밍, 통신
3xxx한밭대학교컴퓨터공학과
3팀원
앱 및 영상스트리밍, 서버간 통신
4xxx가천대학교건축학과5팀원
3D 케이스 도면 설계 및 제작


2. 프로젝트 수행 기간



3. 프로젝트 추진 과정 에서의 문제점 및 해결 방안

3-1. 프로젝트 관리 측면

ㅇ본격적인 개발 시점인 7~8월 시기에 서로 다른 학교 구성원으로 이루어진 면이 있어서 그런데 서로간의 스케줄을 조율하는 것이 힘든점이 있었습니다.

또한 지역도 멀리 있어서 팀원간의 미팅을 갖는 날에 효율을 높이기 위해서 밤샘 작업을 했었고 찜질방이나 사무실 대여등 여러 방법으로 숙식을 해결했었습니다.

또한 서로의 소스 코드를 GIthub를 통한 관리를 함으로써 개인 개발 시에도 효율적으로 관리할 수 있었습니다.


3-2. 작품 개발 측면

ㅇ서로가 대부분 처음 도전해보는 것이라 그런지 여러 어려움이 매우 많았습니다.

라즈베리파이는 PWM 핀이 1개 뿐이어서 ServoBlaster 라는 PCM 제어방식을 사용했으며 영상 스트리밍도 Motion, MJPEG, FFMPEG, 등 여러분야의 방식을 일일이 시도해보면서 FFMPEG를 사용하게 되었다. C++를 사용하는 라즈베리파이와 JAVA 기반의 서버에서 문자열 통신 과정또한 어려움이 많았습니다

널문자를 포함하는 C++와 생략하는 JAVA간의 통신을 구축하는데 어려움이 있었고 어플에서도 스트리밍 영상을 가져오는데 VideoVIew를 사용해서 불러오려고 했었으나 VideoView 사용시 캡처기능이 검은 화면으로만 잡히게 되어 원인을 찾고 TextureView를 사용함으로써 해결할수 있었다.


4. 프로젝트를 통해 배우거나 느낀 점

ㅇ 서로가 잘 모르는 분야였지만 모르는 부분이 있을 때마다 서로 머리를 맞대며 직접 개발했습니다.

그러면서 이론적으로만 배워왔던 학교 수업에서 더욱 배워가는게 많았으며 서로간의 협업을 통해 팀워크의 중요성을 깨닫게 되었습니다