상부삼조(相扶三組) - 나의 PT 파트너(My Personal Training Partner)
프로젝트 소개
프로젝트 명
나의 PT 파트너(My Personal Training Partner)
프로젝트 기간
2022.3.31~2022.6.15
팀 소개
서울시립대학교 기계정보공학과 20174300** 사공** (팀장)
서울시립대학교 기계정보공학과 20174300** 김*현
서울시립대학교 기계정보공학과 20174300** 박*경
서울시립대학교 기계정보공학과 20174300** 주*훈
서울시립대학교 기계정보공학과 20174300** 최*현
프로젝트 개요
프로젝트 요약
본 프로젝트는 관성측정장치(이하 IMU)와 압력센서(이하 FSR)를 결합한 운동 보조 장갑을 이용하여 기본 손목 보호 기능과 동시에 운동 개수 측정, 운동 동기부여 알림, 운동 통계 제공 등을 통해 사용자의 운동 상황(특히 홈트레이닝)을 돕는 것을 목표로 한다. 터치스크린을 통해 사용자는 운동 종류와 개수 등의 내용을 담은 운동 루틴을 설정하고 운동을 시작하게 된다. 운동 중에는 IMU, FSR의 데이터를 활용한 운동 개수 측정 알고리즘을 통해 수행한 운동개수를 측정하고, 손등과 손목에 있는 2개의 IMU의 Roll, Pitch, Yaw를 통해 얻이진 손목 꺾임 각도를 벡터시각화로 사용자에게 보여준다. 운동 보조를 위해서 진행 시간동안 지속적으로 운동이 진행되지 않는 경우에는 스피커를 통해 운동 격려 알림을 전달한다. 운동을 완료한 후 손목 꺾임 각도, 운동 개수, 시간, 칼로리 등의 운동 기록 통계를 달력 형태로 쉽게 확인할 수 있도록 제공한다.
프로젝트의 배경 및 기대효과
프로젝트 배경
최근 운동에 관심을 가지는 사람이 증가하면서 스마트 워치나 운동 관련 플랫폼 시장이 활성화 되었다. 사람들은 집에서 운동을 하거나(홈트레이닝) 헬스장을 이용한다. 집에서 하는 홈트레이닝과 비교하여 헬스장의 장점은 옆에서 운동 관리를 해주고 도움주는 개인 트레이너의 존재이다. 그러나 개인별 트레이닝(PT)을 받기에는 금전적인 부담이 존재하고, 정해진 시간에만 받을 수 있다는 단점이 존재한다. 그리하여 이 프로젝트는 "개인 PT 트레이너처럼 나의 운동을 관리해주고 도움을 줄 수 있는 프로그램" 을 목표로 기획되었다.
프로젝트 기대 효과
본 프로젝트는 운동 보조 장갑을 착용 후 운동을 수행하면 운동 시행 횟수가 자동으로 기록됨과 동시에 더해 사용자가 운동 기록과 통계를 보며 개인 운동 관리를 할 수 있다는 중심 효과를 지닌다. 사용 시 사용자가 터치스크린 디스플레이를 통해 장기적인 운동 기록 및 습관을 달력 형태로 쉽게 확인할 수 있고, 운동 중에는 자동으로 손목 자세와 개수를 기록해주고 운동을 장시간 멈추는 경우 사용자에게 경고 알림을 통해 단기적인 피드백을 제공한다. 또한 기본적으로 장갑 자체의 손목 보호 효과를 통하여 운동 시 부상을 방지할 수 있다.
프로젝트 개발 목표
기능성
IMU, FSR 센서로부터 측정된 데이터를 통해 사용자의 운동을 측정한다. 이때 측정값과 실제값의 차이가 없어야한다. 하지만 센서 데이터 특성상 노이즈(오차)로 인해 높은 신뢰성을 줄 수 없기 때문에 알고리즘을 통한 후처리를 통해 안정적인 값을 얻도록 한다. 또한 사용자의 운동을 측정하는데 다양성이 확보되어야 한다. 한 가지 운동만 측정하는 것이 아니라 여러 종류의 운동을 측정할 수 있도록 한다.
편의성
사용자가 운동을 할 때 직접 착용하는 보호대이므로 착용감이 중요하다. 따라서 무선 방식을 채용하여 거추장스러운 연결선을 제거하여 디스플레이에서 멀리 떨어져서 사용할 수 있고 자유로운 운동을 할 수 있게한다. 또한 제품을 경량화하여 운동시 편의성을 고려한다. 터치 디스플레이를 활용하여 사용자의 입력을 받기 때문에 사용자는 편리하게 조작을 할 수 있어야 한다. 프로그램 UI를 누구나 한눈에 이해하기 쉬운 방식으로 제작하여 직관적으로 이해하고 사용할 수 있도록 한다.
안전성
이 시스템은 기존의 손목 보호대 역할인 손목의 부하를 줄여줌과 동시에 정상적인 데이터를 전송하는 시스템이어야 한다. 기록된 정보를 통해 손목 자세에 대한 점수를 기록하여 사용자의 손목에 대한 피드백을 전송해야한다. 또한 제품의 안전성 측면에서 제품이 외부 충격이나 사용에 쉽게 망가지지 않아야 한다. 센서를 보호함과 동시에 정상적인 기능으로 동작해야 한다.
지속성
무선방식을 채용했기 때문에 필수적으로 손목 보호대에 배터리가 들어가게 된다. 따라서 기대 수명이 긴 리튬폴리머 배터리를 사용하여 배터리 교체 없이 오랜 기간동안 보호대를 사용할 수 있다. 또한 프로그램에 여러 가지 기능을 추가할 때에는 장갑의 구조나 펌웨어를 수정하지 않고 라즈베리파이의 프로그램을 업데이트하는 것만으로 달성할 수 있기 때문에 유지보수에 용이해야 한다.
동작 시나리오
구현 내용
역할분담 및 추진체계
사공**(팀장) [IMU 센서 데이터 가공 및 전체 시스템 총괄 담당]
프로젝트 진행 상황을 총괄하며 부품 구매 및 관리, 팀 구성원 간 역할분담을 수행하고 본 시스템의 핵심 센서인 IMU 데이터 가공을 담당하여 팀의 중추 역할을 수행하였다. 또한, 두 개의 IMU 센서의 Roll, Pitch, Yaw 값을 통해 상대각도를 계산하여 이를 GUI에 시각화하여 손목의 각도를 실시간으로 확인할 수 있도록 구현하였다.
김*현 [pyqt기반 GUI 개발 및 DB 통합]
손목 건강관리 시스템 시각화를 위하여 pyqt를 기반으로 GUI 프로그램을 개발하였다. 사용자가 직관적으로 프로그램을 사용할 수 있도록 UI를 디자인 하고, 통신, DB 시스템과 GUI를 연동하는 역할을 수행하였다.
박*경 [하드웨어 제작 및 FSR 센서 데이터 가공]
본 프로젝트의 핵심 부품인 손목 보호대를 제작하였다. 보호대에 부착되는 센서를 보호하기 위하여 벨크로 구조를 고안하여 보호대와 결합하였으며, FSR 센서 데이터 가공을 담당하여 운동 시작 종료 트리거 역할과 맨몸 운동의 개수 알고리즘 개발을 수행하는데 편의성을 확보하였다.
주*훈 [DB 구조 설계 및 GUI 통합]
Sqlite를 기반으로 프로젝트 관리에 필요한 데이터베이스 구조를 설계하고 제작하였다. 터치디스플레이상에 출력되는 형태를 고려하여 테이블 구조를 설계하였다.
최*현 [통신 시스템 구축 및 회로 설계]
아두이노 회로 설계와 라즈베리파이와 아두이노간 BLE 통신 시스템을 구축하였다. IMU, FSR 센서 데이터를 라즈베리파이로 안정적으로 전송하도록 설계하여 운동개수 알고리즘과 손목각도를 계산하는데 정확도를 향상시키고 시간을 단축시켰다.
개발일정표
시스템 구성
본 시스템의 설계 구성도는 위와 같다. 기구 장치인 손목 보호대는 IMU, FSR 센서가 포함되는 입력장치와 통신장치인 Arduino Nano와 배터리로 구성된다. 이때 제어 장치인 라즈베리파이와 BLE 통신을 통해 센서 데이터를 전송하고 전송된 데이터는 내부 DB에 저장된다. 사용자는 디스플레이를 통해 운동 루틴을 설정하고 운동을 수행하여 운동 개수, 손목 각도 등의 정보를 확인할 수 있다. 또한 실시간 운동시에 스피커를 통하여 수행한 운동 개수를 알려주고, 적절하지 못한 자세나 운동 중 오랜 휴식을 취할경우 경로 음성을 출력해준다.
하드웨어 설계 및 구현
본 제품의 하드웨어에 해당하는 운동 보조 장갑에는 아두이노 보드(IMU 포함), Sparkfun IMU, FSR 센서, 리튬이온 배터리, 배터리 충전모듈이 모두 1개씩 부착되어 있다. 양손에 사용할 수 있게 왼손, 오른손 총 2개를 제작하였다.
GUI 화면 출력을 위해서 '라즈베리파이 공식 7인치 터치스크린'을 사용하였고, 소리 출력을 위해 '소형 스피커'를 부착해 사용했다.
운동 보조 장갑
<각각 재료 설명과 장갑이랑 최종 부착된 사진>
제작한 장갑은 '소형화', '내구성', '탈부착성' 기능 보장을 목표로 진행되었다.
소형화
1. 휘어지는 만능 기판
- 기구부의 초기 설계에는 '미니 브레드 보드'를 사용하여 회로를 구성하는 방안을 고려하였다. 하지만 사용한 미니 브레드 보드는 기본적으로 길고 두꺼우며, 잘라 쓸 수 없어 사용하는 포트에 비해 크다는 단점이 있다.
- 이를 해결하여 제품의 크기를 줄이기 위해 '휘어지는 만능기판'을 사용하였다. 이는 기본적으로 얇고 가벼우며, 필요 부분만 짤라 사용할 수 있어 부피가 크게 줄어든다. 또한 유연성을 가져 부착 시 유연하게 휠 수 있다.
2. 회로 단순화
- '미니 브레드 보드'에서 '휘어지는 만능기판'로 변경하면서 부피가 줄어들었다. 그리고 '소켓 점퍼 케이블'으로 핀 연결을 하는 대신 전선을 직접 엮고 남땜함으로써 회로 구성이 단순하게 구성되었다.
- 또한 사용하는 전선의 길이를 부착될 위치에 딱 맞춰 제작함으로써 단순하고 깔끔한 회로를 구성하였다. 마무리로 주변 전선끼리 테이프로 묶는 작업도 진행하였다.
왼쪽 사진은 기존의 '미니 브레드 보드'를 사용하여 회로를 구성한 결과이고, 오른쪽은 '휘어지는 만능기판'을 활용하여 회로를 구성한 결과이다.
내구성
1. 접촉불량 및 합선 방지
- 장갑을 끼고 운동을 하다보면 움직임에 의해 센서 전선 접합부가 끊어지거나 합선될 수 있다.
- 이를 방지하기 위해 전선은 기존보다 두꺼운 것으로 교체하였으며, 접촉 불량이 일어날 수 있는 부분은 절연 테이프를 붙여 위험을 방지하였다.
- 남땝을 한 후에는 글루건으로 덮어 고정함으로써 전선들의 움직임을 최소화시켰다.
2. 외부 충격 보호
- 본 장갑은 사용자가 운동 시에 착용하므로 역동적인 상황이나 충격이 가해져도 손상되지 않아야 한다.
- 손상을 방지하기 위해 부착할 센서들은 벨크로 내부로 들어가게 위치시켰으며, 최종적으로 덮개 천을 덮음으로써 외부 충격에 의한 손상을 줄이고자 하였다.
탈부착성
1. 벨크로 구조
- 장갑과 아두이노 및 센서 부분은 분리부착할 수 있게 하여 향후 하드웨어 수리 및 관리가 쉽게 제작하였다.
- 이는 벨크로 형태를 이용하여 아두이노 및 센서들을 2 겹의 벨크로 사이에 들어가도록 구현했다.
라즈베리파이 및 주변기기
사용한 라즈베리파이는 'Raspberry 4'이다. GUI 화면 출력을 위해서 '라즈베리파이 공식 7인치 터치스크린'을 사용하였고, 소리 출력을 위해 '소형 스피커'를 부착해 사용했다
센서 활용 설계및 구현
IMU(Inertial Measurement Unit)
기본 이론
사용한 IMU는 아두이노에 내장된 ‘Arduino IMU’와 IMU 그 자체인 ‘Sparkfun IMU’이며, 모두 ‘LSM9DS1’ 모델이다. 기본적으로 IMU의 x, y, z축 방향이 설정되어 있으며, 사용한 두 개의 IMU의 설정 축은 [그림.n]과 같다. IMU에서 얻을 수 있는 raw data는 가속도 3축에 해당하는 A_x, A_y, A_z, 각속도 3츅 G_x, G_y, G_z, 지자기 3축 M_x, M_y, M_z 이다. 이 raw data는 Madgwick filter를 통해 쿼터니언(Quaternion) 4원소로 변환되어 Roll, Pitch, Yaw를 얻어낼 수 있다. Raw data 자체는 가공되기 전이므로 노이즈가 많다. Madgwick filter는 이 높은 진동수의 작은 떨림을 정제하는 Low Pass Filter의 역할로 노이즈가 적은 Roll, Pitch, Yaw를 생성시킨다.
장갑의 손등과 손목에는 각각 Arduino IMU와 Sparkfun IMU이 부착된다. 이를 통해 두 IMU의 Roll, Pitch, Yaw를 비교하여 상대각도를 얻어내고, 이는 벡터 시각화를 통해 운동 중에 현재 손목 자세를 사용자에게 보여준다.
한계 및 문제점
1. Yaw 값 적분 오차 누적
- Z축 방향으로는 현재의 가속도가 회전에 의한 가속도인지 중력가속도인지 구분을 못하는 특성이 있다. 이 때문에 z축 가속도 활용이 아닌 z축 각속도를 적분하는 방법으로 Yaw를 계산해낸다. 이 적분 과정에서 적분오차가 생길 수 밖에 없으며, 움직임이 커질수록 누적이 가속되는 현상이 발생한다. 결론적으로 사용한 IMU만으로는 Yaw 값을 실제와 일치하게 얻어낼 수 없었으며, 다른 센서들과의 융합을 통해서는 정확도를 높일 수 있을 것이다.
2. 짐벌락 현상
- 짐벌락 현상은 오일러 각을 이용한 물체의 회전 상황에서 축이 겹쳐 회전축이 제한되는 상황을 의미한다. 이러한 경우에 회전하려는 방향으로 오브젝트가 회전하지 않는 현상이 나타나는 문제가 생긴다. 이 때문에 결과물에서는 특정 방향으로 손목이 90도 꺾였을 때, 값이 튀거나 뒤집히는 현상이 발견되었다. 이 문제들은 쿼터니언 표현법을 통해 해결할 수 있어 이를 통한 좌표변환을 시도했으나, 시간 관계 상 완전한 마무리를 짓지 못하였다. 다만, 꽤 작은 확률에서 이 문제가 일어난다는 점은 고무적인 부분이라 생각한다.
활용 기능
1. 운동 개수 측정
- Raw data인 x축 가속도값 A_x, y축 각속도값 G_y은 운동 개수를 측정하기 위한 알고리즘에서 데이터로 사용된다.
2. 운동 자세 시각화
- Roll, Pitch, Yaw 상대각도를 벡터 형태로 시각화하여 사용자가 손목 꺾임 정도를 실시간으로 확인할 수 있다.
FSR
기본 이론
FSR 센서는 압력에 따라 저항의 값이 변하는 특성을 이용하여 압력을 측정할 수 있다. 정확한 압력값을 얻을 수는 없지만, 압력세기에 따라 값이 비례하기 때문에 상대적인 압력 비교를 수행할 수 있다. 이를 이용해서 외부 압력 감지와 압력 비교가 가능하다. 얻을 수 있는 데이터는 0~1024의 정수값으로 상대적인 크기가 추출된다.
활용 기능
1. 운동 개수 측정 트리거
- FSR의 압력 감지를 이용하여 사용자가 덤벨을 잡거나 푸쉬업을 위해 땅에 손바닥이 닿았을 때만 운동 개수가 측정되도록 제작하였다. FSR의 데이터가 정해둔 threshold를 넘으면 개수가 측정되도록 하였다.
2. 운동 개수 측정 데이터
- 푸쉬 업 운동을 수행할 때, FSR에서 얻어지는 압력의 경향을 이용하여 운동 개수를 측정한다.
통신부 설계 및 구현
본 제품의 제어부는 배터리, 아두이노 나노, IMU, FSR 센서를 만능기판를 통해 아래와 같은 회로를 설계했다. 만능기판은 굽힘에 유연하고 크기를 원하는대로 조절할 수 있으며 가벼운 특성이 있어 본 프로젝트에서 유리하게 사용할 수 있다. BLE 블루투스 통신을 통하여 양손의 아두이노 나노에서 모인 센서 데이터를 라즈베리파이로 전송한다.
기존 4byte data 실험 결과 connection 연결을 확인하며 데이터를 전송할 경우 240bps에 불과한 전송 속도가 계산되었는데 이는 자체 스펙에 비해 굉장히 느린 속도였다. 문제는 connection연결을 확인하는 함수에서 시간 지연이 생기는 것을 확인하였고, 데이터를 나눠서 자주 보내기 보다 연결 이후 한번에 많은 데이터를 전송하는 방식을 통해 데이터 전송 속도를 올렸다.
BLE
BLE통신은 기존 classic Bluetooth에 비해 저전력으로 작동하는 장점을 가지고 있다. 아두이노에 내장되어있는 BLE Peripheral은 일정 간격으로 라즈베리파이의 Central로 자신을 advertise하여 connection을 하게된다. BLE 디바이스 간의 데이터 통신은 GATT(Generic Attribute Profile)을 사용하여 통신하며 하나의 Profile에 여러 Service와 각 Service에 여러 Charateristic을 가지는 구조를 가지고 있다.
데이터 프로토콜
통신 데이터의 프로토콜은 다음과 같다.
왼손과 오른손은 서로 같은 데이터 형식을 주고 받는다. 하나의 Service 내부의 7개의 charateristic을 갖는다. 7개의 특성은 IMU1의 가속도, 각속도, Pose와 IMU2의 가속도, 각속도, Pose, 마지막으로 fsr데이터를 나타낸다. 각 데이터는 filter를 통해 얻어진 Pose 데이터를 제외하면 나머지 데이터는 모두 raw 데이터로 센서로부터 얻어진 데이터이며, float(4byte)를 가지고 있다. 각 characteristic은 string으로 구현되어 있으며, FSR characteristic은 arduino의 analogRead 값인 0~1024사이 값(4byte)이다. 나머지 charateristic의 경우 4byte float 3개와 공백 데이터(14byte)로 이루어져 있다. 전달하는 데이터는 한 손에서 88byte를 전송하며 5Kbps속도를 갖는다.
소프트웨어부 설계 및 구현
본 제품의 소프트웨어는 사용자가 운동 기록을 쉽게 확인할 수 있도록 디스플레이 GUI를 통하여 시각화를 제공한다. 센서 데이터를 통하여 운동 개수와 손목 각도를 측정하는 알고리즘을 포함한다. 또한 센서 데이터와 사용자의 운동 기록을 관리하기 위한 내부 DB를 포함한다.
데이터베이스
SQLite는 관계형 데이터 베이스 시스템으로 서버가 아닌 응용 프로그램 내부에서 사용되고 가벼운 장점이 있어 임베디드 시스템에 사용하기 용이하다. 본 프로젝트에서는 1인 사용자의 운동 기록을 관리하고 손목 보호대의 센서 데이터를 관리하기 위해 다음과 같은 스키마 구조를 같은 데이터 베이스를 설계하였다.
Routine Table
루틴 테이블은 사용자가 터치 스크린 디스플레이를 통해 설정하는 운동 루틴을 관리하는데 사용된다. 루틴 ID 각각에 사용자가 설정한 운동 이름, 목표 세트수, 목표 반복횟수, 쉬는시간이 순서대로 기록된다.
Sensor Table
센서 테이블은 IMU, FSR 센서 데이터 중 IMU의 Roll, Pitch, Yaw 값을 사용자가 운동을 수행할 때 저장하여 손목의 꺾임 정도를 관리하는데 사용된다.
Workout Table
운동 기록 테이블은 사용자의 운동 기록 데이터를 장기적으로 달력 형태로 보여주기 위해 사용된다. 날짜와 이름에 따라 수행한 운동 시간, 소모한 칼로리, 총 수행 횟수, 손목 꺾임 정보를 저장 및 관리한다.
GUI 및 운동 보조 시스템 기능
본 프로젝트의 흐름은 크게 아래 두 가지 시퀀스 다이어그램으로 구성된다.
0. 운동 시작화면
운동 시작화면은 다음과 같다. '운동 시작하기'과 '운동 기록 보기' 중 선택을 할 수 있고, 끝내고 싶을 시 종료 버튼을 누를 수 있다.
1. 운동 루틴 설정
운동 루틴 설정 페이지에서는 (루틴, 운동, 세트 수, 세트별 운동횟수, 쉬는시간)을 설정할 수 있다. 루틴의 경우에는 최대 6가지 루틴을 설정할 수 있으며, 각 루틴에는 최대 5 종류의 운동을 저장할 수 있다. 운동의 종류는 각 부위별 대표적인 운동 9가지를 선정하여 목록에 두었다. 운동의 세트수는 평균적으로 5세트를 기본으로 두고 사용자의 기호별 선택을 위해 최대 10회까지 선택 가능하다. 운동별 수행횟수는 평균적으로 10회를 기본으로 두고 사용자의 기호에 맞게 최대 20회까지 선택 가능하다. 이렇게 설정된 운동 루틴은 자동적으로 DataBase에 저장되어 이후 사용자가 사용할 때도 자동으로 불러와 사용할 수 있다.
2. 운동 개수 측정(알고리즘)
운동 루틴을 설정하고 운동을 시작하게 되면 아래와 같은 화면이 출력된다. 운동을 하나씩 할때마다 시행 개수 알림 음성과 함께 개수가 차감된다. 한 세트가 끝나면 쉬는 시간이 시작되고, 이 시간이 끝나면 다음 세트로 넘어가게 된다.
센서의 가속도값과 각속도를 이용하여 사용자의 운동 횟수를 측정한다. 사용자가 운동을 시작하게 되고 FSR 센서에 기준값 이상의 입력값이 들어오게 된다면 바벨이나 덤벨을 잡고 있다고 판단하여 개수 측정 알고리즘을 실행시킨다. 개수 판단 알고리즘에서는 현재 수행하고 있는 운동을 확인하여 가속도와 각속도 중 운동측정에 적합한 값을 입력값으로 받아 개수를 측정한다. 알고리즘은 이 입력값을 정해진 길이의 배열에 저장한다. 이 때 사용자의 미세한 움직임이나 센서 자체의 noise가 발생하는데, 이를 없애기 위해 배열에 max()를 씌워 새로운 배열(이하 배열 2)에 저장한다. 이렇게 되면 배열 2에서는 일정 시간동안 동일한 값을 유지하게 된다. 이후 사용자가 운동을 수행하면 배열 2는 잠시동안 일정 값을 유지하다 변화를 하게 되는데, 알고리즘에서는 이 값이 일정 시간동안 일정하다가 값이 변하는 순간 변화값이 기준값 이상으로 측정되는 경우 운동을 수행했다고 판단한다.
3. 손목 시각화
운동 보조 장갑의 손등과 손목 부분에 있는 두 개의 IMU 센서에서 계산된 Roll, Pitch, Yaw(이하 각각 R,P,Y) 값을 이용하여 그 차이인 상대각도를 계산한다. 이 후 회전행렬을 통해 상대 손목각도인 RPY 값을 XYZ 평면 상의 좌표값으로 변환하고, 3D 벡터그래프를 통해 화면 상에 출력하여 사용자에게 보여줄 수 있도록 구현하였다.
변환행렬은 각각 x,y,z축 기준 회전인 R,P,Y에 의한 회전행렬이다. 이 R,P,Y 값에는 계산된 손목 꺾임 각도가 대입되어 행렬이 계산된다. 현 상황에서 Yaw값은 불안정한 값을 가지므로 0으로 고정시켜 한쪽 방향의 회전은 제한되게 하였다. 그 다음 시각화하고 싶은 x,y,z 좌표를 변환행렬과 행렬곱하여 변환된 x', y', z' 를 구할 수 있다. 이 x', y', z'는 손목 기준으로 꺾이는 손등 벡터를 나타낸다. 최종적인 시각화는 팔목과 다섯 손가락을 표현하여 나타냈다.
4. 실시간 운동 동기부여
사용자가 운동을 시작한 뒤 운동 개수가 측정되는 시간이 일정시간(10초 설정) 이상 지나게 된다면 사용자가 운동을 쉬고있다고 판단하고, 스피커 출력으로 운동 동기부여를 줄 수 있는 음성을 출력하여 사용자가 열심히 운동을 할 수 있도록 도와준다
5. 운동 기록 확인
사용자가 운동을 수행할 때 1초 간격으로 DB에 날짜, 운동이름, 손목각도를 저장한다. 또한 운동의 한 세트가 끝날 때마다 또는 종료 버튼을 눌러 중도에 운동을 종료했을 때, DB에 날짜, 운동이름, 수행횟수, 칼로리, 운동시간을 저장한다. 프로그램은 이 정보를 활용하여 (1)날짜별 수행한 운동 종류와 그 운동에 대한 수행횟수와 시간 (2)날짜,운동별 손목 각도에 대한 피드백, (3)운동별 전체 기록에 대한 운동시간, 운동횟수, 소모한 칼로리에 대한 최대, 최소, 평균, 총합에 대한 정보를 제공한다.
추가 문제 해결 사항
1. 소프트웨어 버전 통일
시스템의 통일을 위해 Python 2.7로 환경을 구성하였고, 이에 호환되는 Pyqt 4를 사용하였다. 그렇지만 Linux에서 Pyqt 4의 지원이 2019년 이후로 지원이 끊겨 최신 Raspbian OS에서의 환경구성에 문제가 있어 Version downgrade를 통해 raspbian buster 버전을 통해 환경을 다시 구현하였다.
2. CPU 부하 처리
matplotlib 를 활용하여 실시간으로 그래프를 계산하고 지속적으로 갱신하기 때문에 갱신 주기를 빠르게 하면오히려 화면 출력이 느려지는 현상이 발생하였다. 따라서 갱신 주기를 조절해 가며 최적의 갱신주기를 찾아 설정하였다. 또한 각 쓰레드에서 무한루프를 통해 알고리즘을 계산하고 운동 개수를 측정하기 때문에 CPU에 과부하가 걸리는 현상이 발생하였다. 따라서 sleep함수를 통하여 계산량을 조절하여 CPU부하를 낮추었다.
3. 예외처리
try , except 함수를 사용해 'BLE connecction error'가 발생한 경우를 detection 하여 자동으로 재연결을 시도가 되도록 하였다.
4. 스피커 문제
운동하고 있는 사용자에게 피드백을 전달하는 가장 적합한 방법은 스피커라고 생각하여 스피커를 라즈베리파이에 연결해 소리를 출력하고자 하였다. 하지만 오디오의 소리가 매우 작게 출력되는 현상이 있어 OS 초기화를 통해 환경을 다시 구축하여 문제를 해결했다. 이후 Python에서 오디오 출력을 위해 Python 모듈인 'playsound', 'qsound', 'Qtmultimedia', 'pygame' 등을 사용해 보았지만 정상 작동하지 않았다. 그래서 linux audio package인 mpg123를 통해 터미널을 이용하여 wav 소리 파일을 재생시키는 방법을 발견했고, Python의 'os.system' 명령어를 통해 터미널을 통해 소리를 재생할 수 있었다.