About me
home
Portfolio
home

임베디드시스템 프로젝트 [바른자세]

날짜
2023/03/03 → 2023/06/23
1 more property
Embedded-System-Project
youngjr0527

1. 프로젝트 소개

프로젝트 A1포스터

1.1. 프로젝트 명

바른자세

1.2. 프로젝트 기간

2023.03.31 ~ 2023.06.15

1.3. 팀 소개

팀명 : 바른생각

학교
학과
이름
역할
서울시립대
기계정보공학과
정철
서버
서울시립대
기계정보공학과
김영준
서버
서울시립대
기계정보공학과
김수현
클라이언트
서울시립대
기계정보공학과
권경표
클라이언트
김영준 역할 - [하드웨어 개발 총괄, 비집중 감지 모듈 개발, 영상 스트리밍 모듈 구현]
높이 조절 기능을 하는 구동부를 전체적으로 설계했다. 구동부의 부품을 설계하고 3D프린터를 통해 구현하는 과정을 총괄했다. 카메라를 통해 사용자의 얼굴을 인식하고, 이를 통해 비집중 시간을 감지하는 모듈을 개발했다. 카메라의 영상을 특정 웹주소를 통해 Mjpeg over HTTP 방식으로 스트리밍 하는 모듈을 구현했다.

2. 프로젝트 개요

본 프로젝트의 핵심 목표는 장시간 편안한 자세로 집중할 수 있는 환경을 사용자에게 제공하는 것이다. 이를 위해, 높이 조절이 가능한 스마트 거치대를 개발하였으며, 다음과 같은 기능을 통해 사용자의 편의성을 극대화하였다.

2.1 프로젝트 설명

1. 높이 조절 기능

모터를 통한 거치대 높이 조절로, 사용자의 목과 팔꿈치 부담을 줄입니다.

2. 얼굴 인식 기반 알람

카메라를 이용한 얼굴 인식으로 사용자의 집중 여부를 판단하고, 비집중 시간 감지 시 알람을 제공합니다.

시스템 구성

서버: 라즈베리파이 기반 하드웨어 제어
기능 수행: 클라이언트로부터 받은 요청에 따라 하드웨어 제어기능 수행.
알람 설정: 사용자의 집중 상태를 모니터링하여 설정 시간 이상 집중하지 않을 경우 알람 제공.
클라이언트: 안드로이드 앱
사용자 요청: 높이 조절, 알람 시간 및 모드 설정, 현재 촬영되는 영상 확인.
프로필 관리: 사용자가 자주 사용하는 설정을 프로필로 저장 및 불러오기 기능.

특징 및 사용 방법

WiFi를 통한 1:1 TCP/IP통신으로 서버와 클라이언트 간 효율적인 데이터 교환을 지원합니다.
사용자는 안드로이드 앱을 통해 실시간으로 거치대의 높이를 조절하거나, 알람 모드를 설정할 수 있습니다.
LED 인디케이터를 통해 사용자에게 비집중 시간을 알려주어, 자세를 바로잡거나 카메라 각도를 조절할 수 있도록 합니다.
추가적인 요청 시, 현재 촬영 영상을 웹주소를 통해 스트리밍하여 사용자가 실시간으로 확인할 수 있습니다.
이 프로젝트는 사용자의 편안함과 건강을 동시에 증진시킬 수 있는 혁신적인 접근 방식을 제시한다. 편리한 사용자 경험을 제공하면서도, 장시간 동안의 작업이 건강에 미치는 부정적인 영향을 최소화하는 것을 목표로 한다.

2.2 배경 및 기대효과

현대에 이르러서는 근무 시간, 여가시간 등 다양한 이유로 장시간 책상을 이용하는 인원들이 증가하고 있다. 현재의 책상 이용 자세의 경우 머리와 목의 각도, 상완 외전 및 들어올림, 손목의 구부러짐과 신전 등 신체의 기능 구현에 있어 인체에 부담을 주고 있다. 그로 인해 VDT(Video Display Terminal)라 불리는 근골격계 질환을 겪는 현대인이 증가하고 있다. 책상에 앉아 장시간 업무를 진행 할 때 신체에 부담을 주는 자세를 개선하고 높은 집중 시간을 유지하는 데 도움이 되는 기구를 개발한다. 앱으로 사용자가 원하는 각도를 세밀하게 조정할 수 있고, 졸음 인식 기능과 알람 기능을 삽입하여 신체의 부담을 줄이고 효율성을 높인다.

2.3 사용자 시나리오

3. 시스템 구성

 본 시스템의 설계 구성도는 위와 같다. 클라이언트와 서버는 WiFi환경을 기반으로 TCP/IP 통신을 진행한다. 클라이언트의 요청을 서버는 연결된 기기를 제어하여 처리한다. 카메라를 통해 사용자 얼굴을 인식하여 비집중 감지, 영상 스트리밍 등의 기능을 수행한다. 사용자의 요청을 처리함에 따라 필요한 하드웨어 출력 장치를 선택하여 제어한다.

제어부 및 회로 구현

4. 서버(RaspberryPi) 설계 및 구현

 서버 시스템은 WiFi연결과 Listening Socket 생성을 하는 ‘서버 Listen' 단계와 클라이언트의 요청을 처리하는 ’요청 처리‘ 두 부분으로 나뉜다.

4.1 서버 Listen

Ubuntu NetworkManger 패키지를 이용하여 사전에 정의된 WiFi에 연결한다. 이후 TCP 서버 소켓을 만들고 클라이언트의 접속을 기다린다.

4.2 요청 처리

클라이언트의 요청이 담긴 패킷을 받고, 이를 파싱하여 그에 따른 동작을 하는 과정이다. 서버는 클라이언트에게 이하 4가지 (모터 제어/비집중 시간 감지 및 알람/영상 스트리밍/전원 제어)기능을 제공한다.

4.3 모터 제어 프로세스

 모터 제어 프로세스는 사용자의 목표 단계가 담긴 queue를 받아, 이를 비울 때까지 모터를 제어하여 처리하는 동작을 한다. 서버는 사용자의 요청을 즉시 실행할 수 없을 때는 queue에 담고, 실행 가능할 때 queue를 복사하여 위의 모터 제어 동작을 하는 프로세스를 생성한다. 그러나 서버의 패킷 파싱 이후 모터 제어 프로세스 생성 유무를 결정하기 때문에, 기존의 모터 제어 프로세스가 종료 후, 새로운 요청이 도착해야만 queue에 담긴 요청이 실행되는 문제가 있다.

4.4 비집중 감지 프로세스

 서버는 사용자가 알람 관련 기능을 설정하면, 비집중 감지 프로세스를 생성한다. 감지 프로세스는 사용자가 얼굴이 인식되지 않는 상황을 비집중 시간이라고 판단한다. 비집중이 인식되면 LED를 통해 경고한다. 측정 결과에 따라 ’집중‘, ’비집중‘ 두가지 상태로 구분한다. 바로 전 프레임의 상태를 저장하고, 이를 현 프레임과 비교한다. 만약 상태가 달라지면 달라지는 시점을 저장한다. 이후 가장 최근에 기록한 시점으로부터 경과한 시간이 알람 시간보다 크고, 현재 상태가 '비집중 상태' 라면 알람 모드에 따라 알람을 울린다.
 비집중 감지 프로세서는 LED, 스피커, 부저의 제어가 필요하다. 해당 하드웨어는 라즈베리파이의 GPIO 제어를 이용해 울리게 된다. 각 제어는 ON/OFF를 설정하는 방식이다.

4.5 영상 스트리밍

 사용자의 얼굴 인식 결과 영상을 특정 웹주소를 통해 MJPEG over HTTP 방식으로 계속해서 스트리밍 한다. Flask 프레임 워크를 이용하여 구현했다. 해당 기능을 Python을 통해 실행하는데, 이때 RasberryPi 프로세스에게 큰 부하가 발생한다. 따라서 10분 이상 동작하면 프로세스의 throttling을 유발하고, 서버의 처리 속도가 매우 늦어지거나 혹은 라즈베리 파이가 종료될 수 있는 문제점이 있다.

4.6 전원 제어

 자원 회수 이후 OS의 종료기능을 이용하여 라즈베리 파이를 종료시킨다. 처음으로 소켓을 모두 닫는다. 이후 모터 제어를 통해 기기 상태를 초기화 한다. 이후 초기화가 끝나면 프로세스를 차례로 종료 시킨 후, Process 객체를 반환한다. 이후 공유 메모리 공간을 반환한다. 자원회수가 끝난 후에는 OS 명령어를 이용해 라즈베리파이를 종료시킨다. 따라서 라즈베리파이가 아닌 독립적으로 전력을 공급받는 모터와 모터 드라이버는 종료하지 못한다는 문제점이 있다.

최종 결과물

느낀점

김영준 - 이번 프로젝트는 다양한 경험과 배움으로 가득했고, 학기 동안 성장할 수 있는 기회가 되어 정말 뜻깊었다. 초기에는 과연 학기말까지 실제 구현을 할 수 있을까 걱정이 앞섰지만, 문제 원인을 분석해가며 하나씩 해결해가는 과정을 겪게 되면서 점차 목표에 가까워지는 희열을 느꼈다. 기존의 팀 프로젝트와는 달리, 파이썬과 코틀린이라는 파이썬과 코틀린이라는 서로 다른 프로그래밍 언어를 활용하고, 하드웨어와 소프트웨어를 연동하여 하나의 결과물을 제작하는 것이 이번 프로젝트의 새로운 도전이었다. 따라서 서버팀과 클라이언트팀으로 역할을 나누어 진행되었고, 개인별로도 담당 파트를 맡아 체계적인 분업을 이루었다. 이처럼 다른 영역의 역할을 나누며 팀워크를 형성해본 경험을 통해 의사소통의 중요성을 느낄 수 있었다. 나의 담당 역할 중 비중이 높았던 '졸음인식 딥러닝 모델 사용'과 처음 고안했던 '시저링크를 통한 높이조절 메카니즘' 부분이 여러 문제사항들로 인해 최종 모델에 쓰이지 못하였고, 이에 대해 개인적인 아쉬움과 팀원들에게 미안한 감정이 들었다. 그럼에도 불구하고 이번 기회를 통해 임베디드 시스템에 대한 이해도를 상승시키는 중요한 계기가 되었다. 라즈베리파이의 제한된 사양에서도 최적의 성능을 발휘할 수 있는 시스템을 구축하는것에 중점을 두었는데, 이를 통해 제약 조건 속에서도 최선의 해결책을 찾아내는 능력을 향상시킬 수 있었다. 또한 하드웨어의 한계에 부딪혔을 때 해결책을 찾아내는 과정은 쉽지 않았다. 그러나 고심 끝에 전혀 다른 방식으로 접근해보았고, 이를 통해 돌파구를 마련할 수 있었다. 이러한 경험을 통해 유연한 사고력과 문제 해결 능력의 중요성을 체득하게 되었다. 이번 프로젝트 기간 동안 전체적인 설계의 총괄을 맡아 리더십 있게 팀을 이끌어준 팀장과, 코틀린을 처음 배웠지만 완성도 높은 안드로이드 애플리케이션을 제작한 클라이언트 팀원들에게 감사의 말을 전하고 싶다.