상부삼조(相扶三組) - 나의 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 센서 데이터를 통해 사용자의 운동을 실시간으로 측정하여 운동 개수와 손목 각도를 알려주는 것을 목표로 한다. 운동의 경우 동적인 상황에 해당하므로 센서 데이터의 노이즈가 민감하게 작용할 것으로 예상된다. 따라서 측정값과 실제값의 차이를 줄이기 위해 필터링 과정을 통해 측정 정확성을 확보한다. 또한 센서 데이터 값만으로 사용자의 운동 상태를 확인해야하므로 운동개수 측정 알고리즘의 강건성이 요구된다.
- 측정 다양성
- 사용자가 시스템을 사용하는데 자유도를 확보하기 위해 여러 종류의 운동을 측정할 수 있어야한다. 운동개수 알고리즘을 다양한 운동에 쉽게 적용할 수 있도록 구현하기 위해 운동에 따른 센서 데이터의 threshold 값을 확인하여 다양성을 확보한다.
편의성
- 착용감
- 본 장갑은 사용자가 직접 착용하는 제품이므로 실제로 운동 시 사용하는데 불편함이 없어야한다. 장갑을 센서회로 부분과 벨크로를 통해 분리하여 사용자와 직접적으로 센서부가 접촉하는 일이 없도록 한다. 또한 작고 가벼운 센서를 활용하여 장갑의 무게를 가볍게 설게한다.
- UI
- UI는 터치스크린 디스플레이에 해당되며, 사용자는 운동을 수행할 때 UI를 통해 운동 시행 횟수와 손목 자세를 확인한다. 또한 운동 루틴을 사용자가 직접 생성, 수정, 삭제를 진행하고 운동 통계 정보를 확인한다. 이때 터치를 통한 간편한 조작으로 각 기능을 사용할 수 있도록 직관적인 UI 구성을 진행한다.
- 사용 용이성
- 본 장갑과 터치스크린 디스플레이를 함께 사용하는데 불편함이 없도록 두 모듈을 분리하는 과정이 필요하다. 따라서 유선 연결이 아닌 무선 연결을 사용하여 멀리 떨어져서 사용할 수 있도록 한다.
안전성
- 손목보호능령
- 장갑은 사용자의 운동 수행의 편의를 위헤 존재함과 동시에 사용자의 손목을 부상으로부터 방지할 수 있어야 한다. 따라서 상용 헬스용 손목 보호대 모델에 센서를 결합하여 보호 능력을 충분히 갖춘 모델을 설게한다. 또한 센서부와 신체간의 접촉으로 인한 손해가 없도록 앞서 말한 벨크로 구조를 통해 각 부분을 분리한다.
- 제품내구도
- 본 시스템은 운동과 같은 동적 상황에서 사용되므로 외부 충격과 사용 시간에 강건해야한다. 또한 센서 회로부가 동적 상황 하에서 단선 등의 문제가 발생하지 않도록 유연하게 설계해야한다.
지속성
- 배터리 수명
- 앞서 사용 용이성을 위헤 무선방식을 채택하였으몰 장갑의 회루부분에 배터리가 내장되어야 한다. 이때 배터리 수명은 운동 시간을 고려하여 최소 2시간 이상의 사용 시간을 확보할 수 있어야한다.
- 업데이트 간편도
- 본 제품은 1인 사용자를 대상으로 하므로 별도의 서버를 가질 필요가 없다. 따라서 라즈베리파이 내부 DB와 UI를 통하여 사용자가 쉽게 프로그램을 사용할 수 있도록하고 프로개름의 업데이트가 필요한 경우 업데이트 파일을 받는 형태로 진행하도록 구현한다.
동작 시나리오
구현 내용
역할분담 및 추진체계
사공**(팀장) [IMU 센서 데이터 가공 및 전체 시스템 총괄 담당]
프로젝트 진행 상황을 총괄하며 부품 구매 및 관리, 팀 구성원 간 역할분담을 수행하고 본 시스템의 핵심 센서인 IMU 데이터 가공을 담당하여 팀의 중추 역할을 수행하였다. 또한, 두 개의 IMU 센서의 Roll, Pitch, Yaw 값을 통해 상대각도를 계산하여 이를 GUI에 시각화하여 손목의 각도를 실시간으로 확인할 수 있도록 구현하였다.
김*현 [PyQt기반 GUI 개발 및 DB 통합]
운동 보조 시스템 시각화를 위하여 PyQt를 기반으로 GUI 프로그램을 개발하였다. 사용자가 직관적으로 프로그램을 사용할 수 있도록 GUI를 디자인 하고, 통신, DB 시스템과 GUI를 연동하는 역할을 수행하였다.
박*경 [하드웨어 제작 및 FSR 센서 데이터 가공]
프로젝트의 하드웨어 부분인 운동 보조 장갑을 제작하였다. 장갑에 부착되는 센서를 보호하기 위하여 벨크로 구조를 고안하여 장갑과 결합하였으며, 결과물의 소형화, 내구성, 탈부착성을 보장하기 위해 노력함. 또한 FSR 센서 데이터 가공을 담당하여 운동 시작 종료 트리거 역할과 맨몸 운동의 개수 알고리즘 개발을 수행하는데 편의성을 확보하였다.
주*훈 [DB 구조 설계 및 GUI 통합]
SQLite를 기반으로 프로젝트 관리에 필요한 데이터베이스 구조를 설계하고 제작하였다. 터치 디스플레이 상에 출력되는 형태를 고려하여 테이블 구조를 설계하였다.또한 후반부에는 GUI 디자인에 참여하여 심미성을 높였다.
최*현 [통신 시스템 구축 및 회로 설계]
아두이노 회로 설계와 라즈베리파이와 아두이노간 BLE 통신 시스템을 구축하였다. IMU, FSR 센서 데이터를 라즈베리파이로 안정적으로 전송하도록 설계하여 운동개수 알고리즘과 손목각도를 계산하는데 정확도를 향상시키고 시간을 단축시켰다.
개발일정표
시스템 구성
본 시스템의 설계 구성도는 위와 같다. 기구 장치인 운동 보조 장갑은 IMU, FSR 센서가 포함되는 입력장치와 통신장치인 Arduino Nano와 배터리를 포함하고 있다. 이는 제어 장치인 라즈베리파이와의 BLE 통신을 통해 센서 데이터를 전송하며, 전송된 데이터는 알고리즘에서 데이터로써 활용되고 내부 DB에 저장 또한 이뤄진다. GUI로 출력하고싶은 부분들은 라즈베리 디스플레이로 출력되며 스피커를 통해 사용자에게 안내 및 알림을 전달한다.
하드웨어 설계 및 구현
본 제품의 하드웨어에 해당하는 운동 보조 장갑에는 아두이노 보드(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는 IMU 데이터 가공에 주로 쓰이는 필터인 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에서 얻어지는 압력의 경향을 이용하여 운동 개수를 측정한다.
통신부 설계 및 구현
본 제품에서 아두이노는 BLE 블루투스 통신을 통하여 양손의 센싱 데이터들을 라즈베리파이로 전송한다.
기존 4 byte data 실험 결과 'connection' 연결을 확인하며 데이터를 전송할 경우 240 bps에 불과한 전송 속도가 계산되었는데 이는 자체 기기 스펙에 비해 굉장히 느린 속도였다. 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 데이터를 나타낸다. 각 데이터는 필터링을 통해 얻어진 Pose 데이터를 제외하면 나머지 데이터는 모두 raw data로 센서로부터 바로 얻어진 순수 데이터이며, float(4 byte)를 가지고 있다. 각 characteristic은 string type으로 구현되어 있으며, FSR characteristic은 아두이노의 analogRead 값인 0~1024사이 값(4 byte)이다. 나머지 charateristic의 경우 4 byte float 3개와 공백 데이터(14 byte)로 이루어져 있다. 전달하는 데이터는 한 손에서 88 byte를 전송하며 5 Kbps 속도를 가진다.
소프트웨어부 설계 및 구현
본 제품의 소프트웨어는 사용자가 운동 기록을 쉽게 확인할 수 있도록 디스플레이 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' 명령어를 통해 터미널을 통해 소리를 재생할 수 있었다.
프로젝트 결과
최종 결과물
최종 제작한 제작물은 다음과 같다.
<하드웨어>
<GUI>
<각도 시각화 테스트>
<운동 시연 테스트>
한계점
1. IMU의 Raw data로부터 Roll, Pitch, Yaw로 변환하는 과정에서 적분오차로 인해 정확한 Yaw 를 얻어내지 못하였다. 다만, Roll, Pitch는 높은 정확도로 측정된다.
2. IMU 중 손목에 부착한 Sparkfun IMU 데이터가 출력이 지연되어 밀리는 현상이 발견되었다. 이는 손목 꺾임 각도를 구하는 정확도에 한계를 주었다.
3. IMU 의 짐벌락 현상으로 특정 각도에서 Roll, Pitch, Yaw가 급격하게 튀어 변하는 현상이 발견되어 손목각도 시각화의 정확도에 제한을 주었다.
4. 하드웨어의 강건성이 부족하여 블루투스 연결이 끊어지거나 센서 데이터가 불러와지지 않는 등의 현상이 간헐적으로 발생하였다.
5. 손목 각도를 시각화하는 과정에서 CPU 성능의 부족으로 각도 시각화 그래프의 갱신 주기를 최대 0.4초 내외로 설정할 수 밖에 없어 실시간성이 다소 아쉬웠다.
6. 평가항목에 있던 '부적절한 자세에 대한 경고' 항목은 손목 각도 측정의 부정확성 때문에 구현하는 것을 포기하고, '운동 휴식이 길어짐을 방지해주는 격려(동기부여) 음성전달'로 평가항목을 대체하였다.
프로젝트 평가
평가항목
프로젝트 평가는 아래 기준을 통하여 정의하였다.
평가결과
화면 딜레이 시간
- 사진 화면 딜레이 시간
센서 데이터가 들어와 화면에 GUI를 통해 3차원으로 출력되기 까지 시간 데이터를 나타내었다. 통신 데이터는 데이터 사이의 전송 속도를 측정하였으며, 화면 속도는 원활한 display를 위해 임의로 0.4 초로 정하였으며, 다음과 같은 결과를 얻을 수 있었다. 1090개의 데이터에 대해 평균 0.4118 초의 화면 딜레이 시간을 얻을 수 있었다. 이는 개발 목표치인 500 ms 이내를 만족시키는 결과였다.
손목 각도 측정 정확도
- 손목 각도의 정확도는 실제 손목 각도와 측정된 손목 각도 데이터를 비교하여 결과를 도출하였다. 각각 roll 과 pitch에서 측정을 평가하였고, 정해진 각도 (30, 45, 60)에서 5번의 반복 실험을 통해 측정 데이터와 실제 손목각도 차이를 정확도로 구하였다. 최종결과 평균 96%의 일치 정확도를 보였다. 다만, 이는 roll, pitch가 0~90도 이내에 한해서 테스트를 한 결과이다.
- 딜레이로 인해 손목각도가 달라보이기는 하지만, 이는 딜레이가 지난 후에 안정되어 실제각도와 유사한 결과를 보인다.
부적절한 자세에 대한 경고
- 센서 데이터 정확도에서 좋은 결과를 얻었지만, 데이터가 전달되는 것과 별개로 특정 각도 이상이나 특정 자세에 데이터가 튀어버리는 현상과 수렴하는 데에 지연이 발생하였다. 이러한 이유로 위의 '운동 휴식이 길어짐을 방지해주는 격려(동기부여) 음성전달'로 변경하게 되었다.
개수 측정 알고리즘 정확성
- 운동의 범주는 크게 3가지 종류의 운동으로 나뉜다. 첫째로, 지면에 대해 수직으로 움직이는 숄더 프레스와 같은 종류의 운동이 있으며 둘째로, 특정 축에 대해 회전하는 덤벨 컬 종류의 운동이 존재한다. 셋째로는 손목이 고정될 경우 압력을 통해 개수를 파악하는 푸시 업 종류의 운동이 존재한다. 운동들은 다음과 같은 [그림] 측정 정확도로를 보였다. 다른 2가지 항목들은 측정 성공률이 어느정도 목표에 달성하였지만, FSR을 이용하여 측정하는 푸시업의 경우 센서가 손바닥에 의해 바닥에 정확히 밀착되지 않는 현상이 자주 발생하여 목표했던 정확도에 도달하지 못하였다.
장단기 피드백 제공
- 장기 피드백의 경우 사용자가 운동을 진행하는 동안 손목의 각도가 직선 및 고정 되어야 함을 가정하여 roll 및 pitch의 상대 각도를 점수로 변경하였다. 사용자는 각 운동 별 손목 각도에 대한 점수 평가를 받아 운동 피드백에 사용할 수 있다.
배터리 지속시간
- 배터리의 경우 완전히 충전한 뒤, 방전될 때까지의 시간을 측정하는 실험을 진행하였다. 4개의 배터리로 각 2번씩 테스트한 결과 평균 4시간 21분이 지속되어 개발 목표치로 잡아둔 2시간 지속을 만족하는 결과를 보였다.
느낀점
사공의훈
- 주제 선정부터 고민이 많았습니다. 수많은 주제의 후보들이 나온 가운데 시간에 쫓겨 조금은 걱정이 많은 주제를 선정하게 되었습니다. 몇 주가 지난 시점 주제를 변경하기도 하고 방향을 다잡지 못하였습니다. 그러다 팀원들과 꾸준히 이야기를 나누며 일단 작업을 진행을 해버리다보니 신기하게도 방향을 자연스럽게 찾아가게 되었고, 프로젝트를 잘 마무리할 수 있었습니다. 이 과정에서 느낀 바는 '고민이 많을 때는 일단 진행해보는 것도 방안이다' 라는 것입니다. 무계획처럼 보일 수도 있겠지만, 불안정하고 막막한 것이라도 우당탕탕 진행해버리니 작은 답안이라도 하나씩 나오기 시작했습니다. 이는 팀원들과 회의를 많이 하며 괴로워하고 시행착오를 겪어온 결과라고 생각합니다. (하지만 이 과정은 심적으로는 불안하기 때문에 다음 프로젝트 진행 시에는 철저한 계획을 세우고 진행하고자 합니다)
- 또한 팀장으로서 팀원들을 결집시키고 업무를 통괄하는 것이 쉽지 않음을 느꼈습니다. 향후 필드에서 프로젝트를 이끄는 자리가 되었을 때, 이번 경험은 좋은 거름이 될 것이라 생각합니다. 힘들었지만 많은 것을 느끼고 얻었습니다. 업무적인 부분을 벗어나서 인간적으로도 성장한 시간이지 않았나 생각합니다.
김창현
- 프로젝트를 기획하는 단계에 있어서 직접 하드웨어를 구상하고 센서를 다뤄본 적이 없어서 프로젝트의 난이도를 예측하기 어려웠습니다. 또한, 프로젝트를 진행하면서 시도 때도 없이 예상치 못한 문제들을 마주했는데 하나하나 마주했을 때는 정말 힘들고 이걸 어떻게 해결해야 하나라는 생각도 들었지만 차근차근히 해가다 보면 대부분의 문제는 해결할 수 있다는 것을 알 수 있었습니다. 그리고 5명이 팀 프로젝트를 진행하다 보니 각 팀원이 유기적으로 역할을 나누어 일하지 않으면 프로젝트가 진행되기 어렵다는 것을 느껴 팀워크와 협업의 중요성을 알 수 있었습니다. 결과적으로 내장형 프로젝트를 통해 이론만으론 배울 수 없는 것에 대한 경험을 할 수 있었고 이를 통해 많은 것을 배우고 성장할 수 있었던 것 같습니다.
박재경
- 소프트웨어뿐만 아니라 하드웨어를 포함한 개발 전체에 대해 처음으로 경험해본 과목이었다. 개발과 설계에는 초기에 알 수 없는 다양한 변수들이 많고 그것을 미리 예측할 수 있는 경험이 상당히 값진 것이라는 점을 배웠다. 소형 컴퓨터의 능력에 놀라움을 느꼈고 어디까지 높은 수준의 계산을 할 수 있는지 궁금함이 들어서 다음에는 더 높은 성능을 요구하는 설계를 해보고 싶다.
주영훈
- 라즈베리파이를 활용하여 프로젝트를 진행하는 과정에서 초기 주제 선정에 많은 어려움을 겪었습니다. 그 과정에서 주제 변경도 있어 초기 시작시간이 늦춰진게 조금 아쉽습니다. 데이터베이스를 처음 접하며 설계부터 구현까지 직접 진행하는 과정에서 어려운 부분이 많았습니다. 다른 팀원과 협력하면서 부족한 부분을 채우고 하나씩 해결해가는 과정에서 많은 것을 느낄 수 있었습니다. 다음 학기에는 이번 프로젝트에서 느낀 부족한 점을 보완하여 더 나은 결과물을 만들어보고 싶습니다.
최정현:
- 프로젝트를 진행하면서 예상했던 문제보다 더 많은 문제를 겪었고, 당연히 될거라고 생각하며 고려하지 않은 부분이 발목을 잡는 일들이 많았습니다. 온전히 내장형 프로젝트 하나만 진행하는 것이 아니었기 때문에 시간이 부족하여 진행하면서 힘들었던 것 같습니다. 결국 해결 못한 문제도 남아있지만 그래도 어떻게든 완성한 것 같습니다. 이제 팀원 몇 명과 시간만 있으면 농담으로 ‘내장형 프로젝트로 하면 만들 수 있겠네’라는 이야기도 하고는 합니다. 아쉬운 점도 있고 뿌듯하게 얻어간 부분도 있고 의미있는 시간이었습니다. 재밌었다고 말하면 분명 거짓말일거라고 생각합니다. 그래도 재밌었던 기억보다 힘들었던 기억이 더 오래 남아서 언젠가 도움되지 않을까 합니다. 내장형 팀원들 및 교수님, 조교님들께도 감사하다는 인사드립니다.