"펜타코어 - 허리업! 자세교정꽃"의 두 판 사이의 차이
2012430017 (토론 | 기여) (→동작 시나리오) |
2012430017 (토론 | 기여) (→프로젝트 결과) |
||
(같은 사용자의 중간 판 206개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
==프로젝트 소개== | ==프로젝트 소개== | ||
===프로젝트 명=== | ===프로젝트 명=== | ||
− | 허리업! 자세교정꽃 | + | 허리업! 자세교정꽃 |
압력센서와 가속도계를 이용한 자발적 자세교정 시스템 | 압력센서와 가속도계를 이용한 자발적 자세교정 시스템 | ||
===프로젝트 기간=== | ===프로젝트 기간=== | ||
− | 2020.3.16~2020.6.22 | + | 2020.3.16~2020.6.22 |
===팀 소개=== | ===팀 소개=== | ||
− | 서울시립대학교 기계정보공학과 20154300** 표* | + | 서울시립대학교 기계정보공학과 20154300** 표*근 (팀장)<br/> |
− | 서울시립대학교 기계정보공학과 20154300** 고* | + | 서울시립대학교 기계정보공학과 20154300** 고*균 <br/> |
− | 서울시립대학교 기계정보공학과 20154300** 백* | + | 서울시립대학교 기계정보공학과 20154300** 백*우 <br/> |
− | 서울시립대학교 기계정보공학과 20154300** 이* | + | 서울시립대학교 기계정보공학과 20154300** 이*현 <br/> |
− | 서울시립대학교 기계정보공학과 20174300** 강* | + | 서울시립대학교 기계정보공학과 20174300** 강*혁 <br/> |
==프로젝트 개요== | ==프로젝트 개요== | ||
===프로젝트 요약=== | ===프로젝트 요약=== | ||
− | 압력센서와 가속도 센서를 통한 | + | 압력센서와 가속도 센서를 통한 자세 판단을 바탕으로 화분의 로봇 꽃을 제어해 사용자에게 피드백을 제공하는 자발적 자세 교정 시스템을 제작한다. 등받이에 부착된 가속도 센서를 통해 전체적인 자세를 판단하고, 사용자가 잘못된 자세를 취할 시 화분의 꽃 로봇이 잘못된 자세를 모방하는 움직임을 표현하여 사용자가 인지하도록 한다. |
− | 등받이에 부착된 가속도 센서를 통해 전체적인 자세를 판단하고, 사용자가 잘못된 자세를 취할 시 화분의 꽃 로봇이 잘못된 자세를 모방하는 움직임을 표현하여 사용자가 인지하도록 한다. | ||
===프로젝트의 배경=== | ===프로젝트의 배경=== | ||
− | 현대인들은 학업, 업무 등으로 인해 책상에 앉아 있는 시간이 점점 길어지고 있고, 이와 관련된 질환들로 내원하는 빈도가 빠르게 증가하고 있다. 이러한 통계를 뒷받침하듯 다양한 | + | 현대인들은 학업, 업무 등으로 인해 책상에 앉아 있는 시간이 점점 길어지고 있고, 이와 관련된 질환들로 내원하는 빈도가 빠르게 증가하고 있다. <br/> |
− | [[파일:바르지 못한 자세 습관.png|500픽셀|섬네일|가운데|바르지 못한 자세습관 | + | [[파일:펜타코어 척추 질환자 수.jpg|500픽셀|섬네일|가운데|그림 1. 20대 척추 질환자 수 추이]] |
+ | |||
+ | 이러한 통계를 뒷받침하듯 다양한 자세 교정 제품들이 시중에 출시되었으며, 이들의 공통적인 특징은 물리적으로 사용자의 행동을 제약하여 올바른 자세를 유도한다는 것이다. 그러나 많은 소비자 설문에 의하면 자발적인 자세 유지가 이 | ||
+ | 루어지지 않을 시 사용자의 불편함을 초래할 수 있으며, 자세 교정을 위한 물리적인 피드백(진동, 움직임 제약 등)에 대한 부정적인 반응이 두드러지게 나타나는 경향을 보인다. 또한, 좋은 | ||
+ | 자세는 어떤 기구에 의해 유지되어야 하는 것이 아니므로, 사용자의 자발적인 자세 교정을 유도하는 새로운 방식의 자세 교정 시스템이 좋은 자세 습관 형성에 기여할 것으로 예상한다. | ||
+ | [[파일:바르지 못한 자세 습관.png|500픽셀|섬네일|가운데|그림 2. 바르지 못한 자세습관]] | ||
===프로젝트의 배경 및 기대효과=== | ===프로젝트의 배경 및 기대효과=== | ||
+ | |||
본 시스템의 목적은 사용자의 자발적인 자세 교정과 좋은 자세 습관의 확립이며, 큰 불편함 없이 자세 교정기구를 사용할 수 있다는 장점이 있다. 또한, 애플리케이션의 인터페이스를 통해 자신의 자세 점수, 경향을 직관적으로 파악할 수 있어 간편한 자세 모니터링이 가능하다. 추후 누적된 데이터를 통해 사용자의 자세 습관을 파악하여 적절한 피드백을 제공하는 기능을 추가한다면 자세 습관 개선에 큰 도움이 될 것이다. | 본 시스템의 목적은 사용자의 자발적인 자세 교정과 좋은 자세 습관의 확립이며, 큰 불편함 없이 자세 교정기구를 사용할 수 있다는 장점이 있다. 또한, 애플리케이션의 인터페이스를 통해 자신의 자세 점수, 경향을 직관적으로 파악할 수 있어 간편한 자세 모니터링이 가능하다. 추후 누적된 데이터를 통해 사용자의 자세 습관을 파악하여 적절한 피드백을 제공하는 기능을 추가한다면 자세 습관 개선에 큰 도움이 될 것이다. | ||
+ | ===목적계통도=== | ||
+ | [[파일:펜타코어_목적_계통도.PNG|800픽셀|섬네일|가운데|그림 3. 목적 계통도]]<br/> | ||
+ | ''' ㉠ 편의성''' | ||
+ | 본 시스템은 강압적이지 않은 교정 방식으로 사용자의 올바른 자세 습관을 유도하므로, 보조 의자를 장시간 이용할 때 불편함이 있으면 안 된다. 또한, 실제 사용 시 별도의 조작 없이 간편하게 작동해야 하며 사용자에게 자세 정보를 적절한 때에 제공할 수 있어야 한다. 이상적인 설계에서 자세 정보를 수집하는 의자는 외부 전원공급 없이 작동할 수 있어야 하며, 다양한 환경에서 큰 제약 없이 사용이 가능하도록 한다. 그리고 안드로이드 OS 기반의 애플리케이션을 통해 수집된 데이터의 경향과 날짜, 시간별 자세 추이를 어디서나 손쉽게 확인할 수 있도록 시스템을 구성한다. | ||
+ | |||
+ | ''' ㉡ 정확성''' | ||
+ | 올바른 자세라는 다소 추상적인 특성에서 구체적인 기준을 설정하고 사용자의 자세를 판단해야 하므로, 사용 전 기준 확립과 자세판단에서 높은 정확도가 요구된다. 이러한 점을 보완하기 위해 자이로 센서의 기울기 정보를 바탕으로 물리적 수평을 감지하며, 효율적인 로드셀 배치로 편향된 무게 분포를 파악할 수 있도록 한다. 그리고 전체 시스템의 유일한 구동부인 화분 모듈에서는 사용자가 잘못된 자세를 취할 때 이를 즉각적으로 명확하게 표현할 수 있어야 하므로 신속한 반응성이 서보 모터를 통해 구현되어야 한다. | ||
+ | |||
+ | ''' ㉢ 지속성''' | ||
+ | 전체적인 완성품의 지속성은 크게 두 가지의 특성에 적용될 수 있다. 첫째는 H/W의 물리적 내구성을 의미하며, 의자에 가해지는 외부 충격이나 잠재적인 파손에 시스템을 보호할 수 있도록 안정성을 갖추는 설계를 지향한다. 두 번째 지속성은 사용자의 자세 데이터 수집과 관리의 측면에서 누적된 데이터를 체계적으로 정리, 분석하여 올바른 자세를 위해 사용자에게 적절한 피드백을 제공할 수 있어야 한다. | ||
==동작 시나리오== | ==동작 시나리오== | ||
− | [[파일:펜타코어_시나리오.png|800픽셀|섬네일| | + | [[파일:펜타코어_시나리오.png|800픽셀|섬네일|가운데|그림 4. 시스템 작동 시나리오]]<br/> |
+ | 전체 시스템의 동작은 의자에서 변화하는 사용자 자세 데이터를 입력받아 저장하면 화분 모듈이 의자 모듈의 서버에서 데이터를 불러오고, 데이터에 기록된 자세 모드에 따라 애플리케이션 내의 Background Process로 꽃을 실시간으로 작동시킨다. 구체적인 시나리오로는 사용자가 의자와 화분 모듈에 전원을 인가하고, 화분의 디스플레이에 표시된 ‘측정하기’, ‘이어하기’ 두 버튼을 통해 자세 판단 및 피드백 기능을 실행할 수 있다. 사용자는 실시간으로 변화하는 자세에 대한 꽃의 피드백을 2초 단위로 받을 수 있으며, 앉아 있는 시간 동안 데이터는 계속해서 누적되어 의자 사용 시간, 자세 점수 등을 확인할 수 있다. 사용 종료를 위해서는 ‘오늘은 여기까지’ 버튼을 통해 시스템을 종료하여 자세 점수 측정을 중단할 수 있다. | ||
==구현 내용== | ==구현 내용== | ||
− | ===역할분담 및 | + | ===역할분담=== |
+ | '''표*근 [팀장]''' <br/> | ||
+ | 프로젝트 진행 상황을 총괄하며 자재 관리 및 팀 구성원 간 역할분담과 조율 및 실험을 수행하였고, 회로도 구성 및 프로젝트 진행 과정에서 필요한 서식 문서들의 작성과 검토, 최종 승인까지 담당하여 팀의 중추를 담당하였다. <br/> | ||
+ | <br/> | ||
+ | '''고*균 [화분 제작 및 서보모터 제어 담당]''' <br/> | ||
+ | 허리 업! 시스템의 유일한 구동부인 서보모터를 통한 꽃 제어를 담당하였고, 다양한 메커니즘으로 꽃의 움직임을 실험, 관찰하여 시스템에 적합한 구조를 설계하였다. 또한, 블록을 이용해 화분을 제작하여 터치 디스플레이와 라즈베리파이, 서보모터가 모두 내장되며 심미성과 내구성을 갖춘 화분을 제작하였다. <br/> | ||
+ | <br/> | ||
+ | '''백*우 [서버 구축 및 통신 시스템 담당]''' <br/> | ||
+ | 의자 모듈의 라즈베리파이로 서버를 구축하여 화분 모듈이 실시간으로 데이터를 읽어와 꽃을 구동시킬 수 있도록 하였고, 추가적으로 압력 센서 배치를 위한 민감도 최적화를 수행하여 자세 판단 정확도를 크게 향상시켰다. <br/> | ||
+ | <br/> | ||
+ | '''이*현 [안드로이드 애플리케이션 개발]''' <br/> | ||
+ | 안드로이드 Things를 기반으로 작동할 수 있는 애플리케이션을 중점적으로 개발하였다. 애플리케이션의 UI 디자인과 통계 기능들을 효과적으로 수행할 수 있도록 프로그램을 설계하였으며, 사용자 편의성과 사용의 지속성을 위한 심미성을 확보하였다. <br/> | ||
+ | <br/> | ||
+ | '''강*혁 [실험 계획 및 하드웨어 제작 담당]''' <br/> | ||
+ | 초기 설계 단계에서 의자의 압력 분포를 확인하기 위한 실험 계획 및 수행, 데이터 해석과 의자 모듈 제작을 담당하였다. 자세 판단 코드를 작성하였으며 사용자의 정확한 자세를 판단하기위한 기준 체계를 확립하였다. | ||
+ | |||
+ | ===개발 일정=== | ||
+ | [[파일:펜타코어_개발_일정.PNG|987픽셀|섬네일|가운데|그림 5. 개발 일정]] | ||
===시스템 구성=== | ===시스템 구성=== | ||
+ | [[파일:펜타코어_전체_시스템_구성도.png|778픽셀|섬네일|가운데|그림 6. 전체 시스템 구성도]]<br/> | ||
+ | 전체 시스템은 크게 의자 모듈과 화분 모듈로 구분할 수 있고, 구체적인 구성은 다음 그림과 같다. 각 모듈에 라즈베리파이가 내장되어 데이터 처리 및 통신, 제어 기능을 수행한다. 보조 의자에서는 사용자 환경에 맞게 설정된 기준에 따라 센서에서 입력된 데이터를 바탕으로 자세를 판단하며, 사용자의 자세가 바르지 않은 경우 화분 모듈의 꽃을 제어해 잘못된 자세를 모방함으로써 올바른 자세로 고칠 수 있도록 유도한다. | ||
− | === | + | ===보조 의자 모듈 설계 및 회로 구현=== |
+ | [[파일:펜타코어 의자 모듈 및 회로 구성.png|600픽셀|섬네일|가운데|그림 7. 의자 모듈 및 회로 구성]]<br/> | ||
+ | 의자 모듈은 라즈베리파이4, 직경 12mm FSR 압력센서, 자이로 센서, 4채널 어레이 저항 브릿지, ADC칩과 20000mAh 용량의 보조배터리로 구성된다. 본 시스템에 사용되는 의자는 에이블루社의 Curble Chair로 여러 모델 중 프로젝트의 목적에 가장 잘 부합하는 제품인 커블 체어 와이더(Curble Chair Wider)를 사용하였다. 본 의자는 인체공학적으로 설계되어 사용자의 척추와 골반의 각도를 제한하여 척추 중립자세를 유지하도록 도와준다. 라즈베리파이를 통해 압력센서와 자이로센서로부터 얻은 데이터를 수집 및 처리하여 사용자의 자세를 판단한다. 또한, 서버를 열어 화분 모듈과의 통신을 가능하게 하며 사용자의 자세 모드를 전송하는 역할을 한다.<br/> | ||
+ | <br/> | ||
+ | [[파일:펜타코어_압력_센서_배치.png|500픽셀|섬네일|가운데|그림 8. FSR 압력 센서 부착 위치]]<br/> | ||
+ | 4개의 압력센서는 사용자의 둔부와 허벅지 압력을 통해 의자 사용 여부 및 다리 꼼을 감지하는 역할을 한다. 나머지 한 개는 의자의 등 부분에 위치하며 사용자의 등이 굽은 자세를 감지한다. 이는 인체 해부학적으로 등을 굽었을 시 압력센서의 값이 증가하는 것에 착안하여 위치를 결정하였다. 5개의 센서는 4채널 저항 브릿지와 ADC 칩인 MCP-3208에 연결되어 있다.<br/> | ||
+ | <br/> | ||
+ | [[파일:펜타코어_자이로_수평.png|450픽셀|섬네일|가운데|그림 9. 의자 등받이에 부착된 자이로센서]] | ||
+ | 또한, 사용자의 전체적인 움직임은 등받이 뒤편에 위치한 자이로 센서로 파악한다. 등받이 뒤편에는 보조배터리가 부착되어 있으며 이는 라즈베리파이의 전원 공급을 담당한다. 콘센트로부터 외부전원이 입력된다면 사용자가 본 시스템을 이용하는 데 있어 제한사항이 발생하므로 이를 해결하기 위해 보조배터리를 부착하여 해결하였다. 보조배터리는 20,000mA의 대용량으로 라즈베리파이4의 정격 전원인 [5V,3A]를 충족함과 동시에 사용자에게 12시간 이상의 사용시간을 제공한다. 사용 후 충전을 통해 다음날 사용이 가능하다. <br/> | ||
+ | [[파일:펜타코어_의자_모듈_케이싱.png|500픽셀|섬네일|가운데|그림 10. 만능기판으로 구성된 의자 모듈]]<br/> | ||
+ | 의자 모듈 시스템의 회로는 만능기판을 통해 구성되어 있으며, 외부의 충격으로부터 회로를 보호하기 위해 블록으로 케이싱 되어있다. | ||
− | === | + | ===화분 모듈 설계 및 회로 구현=== |
+ | [[파일:펜타코어 화분 모듈 구성도.png|1200픽셀|섬네일|가운데|그림 11. 화분 모듈 구성도]]<br/> | ||
+ | [[파일:화분내부.JPG|600픽셀|섬네일|가운데|그림 12. 화분 모듈 내부 모습]] | ||
+ | 화분 모듈은 라즈베리파이3, 서보모터, 7인치 터치 디스플레이, 꽃 모형으로 구성되어 있다. 화분 모듈의 기능은 의자 모듈로부터 사용자의 자세 정보를 받아 사용자에게 피드백을 제공하는 것이다. 자세 문제에 대한 피드백은 터치 디스플레이와 꽃 모형을 통해 이루어진다. 라즈베리파이에는 Android Things를 활용한 어플리케이션이 구동되며 서보모터와 애플리케이션을 동작시킨다. 꽃 모형은 탄성체인 스프링과 와이어로 구성되어 있다. 서보모터의 제어를 통해 꽃 모형이 사용자의 자세 모드에 해당하는 움직임을 취하도록 구현하였으며 사용자는 이를 통해 자신의 잘못된 자세를 인지하게 된다. 화분의 디스플레이를 통해 실시간 자세 피드백을 받아 볼 수 있으며 애플리케이션의 다양한 기능을 활용할 수 있다. 전체적인 외형은 블록을 통해 구현되어 내부의 구성품들을 보호하며 심미성을 더해준다. | ||
===소프트웨어 설계 및 구현=== | ===소프트웨어 설계 및 구현=== | ||
+ | 소프트웨어부는 자세 판단 알고리즘, 서버 구축 및 통신, 편리한 시스템 사용을 위한 애플리케이션으로 구분된다. <br/> | ||
+ | ====자세 판단 알고리즘==== | ||
+ | 초기 설계 단계에서 자세 판단 방법을 확립하기 위해 다음과 같은 논의를 거쳤으며, 요약된 과정은 내용은 표와 같다.<br/> | ||
+ | [[파일:펜타코어 자세 판단 방법 표.PNG|800픽셀|섬네일|가운데|표 1. 자세 판단 방법의 변화 ]]<br/> | ||
+ | <br/> | ||
+ | [[파일:펜타코어 롤 피치.png|500픽셀|섬네일|가운데|그림 13. 의자에 앉은 사용자의 Rolling과 Pitching]]<br/> | ||
+ | 이후 확립된 자세 판단 코드는 의자 모듈의 라즈베리파이에서 동작하며 압력센서와 자이로 센서의 값을 통해 사용자의 자세를 판단한다. 압력센서는 사용자가 특정한 자세를 취할 때 변화하는 압력을 감지하며, 자이로 센서는 전체적인 사용자 몸의 기울기를 감지한다. 자세 판단에는 기본 자세 모드와 특정 자세 모드 두 가지로 나뉜다. 기본자세 모드는 등받이 뒤에 부착되어 있는 자이로 센서를 활용하여 사용자의 앉은 자세 기울기를 판별한다. 자이로 센서로부터 A_x, A_y, A_z 값을 읽을 수 있으며 이를 다음과 같이 계산하여 오일러 각(Euler angle)을 계산할 수 있다. 계산된 Pitch와 Roll 각도를 통해 사용자가 어떤 자세를 취하였는지 확인할 수 있다.<br/> | ||
+ | [[파일:펜타코어 각 모드.png|1100픽셀|섬네일|가운데|그림 14. Rolling과 Pitching에 의한 자세 모드 구분(좌), 7가지의 기본 자세 모드]]<br/> | ||
+ | 특정 자세 모드는 의자에 부착된 압력센서를 통해 판별되며 센서의 위치는 그림 6과 같다. 자세 점수는 ‘기본 자세 모드’와 ‘특정 자세 모드’의 조합을 통해 결정되며 초기 100점에서 각 자세별 감점이 적용되어 합산된 점수가 Sensing interval마다 DB에 저장된다. <br/> | ||
+ | ====서버 구축 및 통신 시스템==== | ||
+ | [[파일:펜타코어 서버 표.PNG|900픽셀|섬네일|가운데|표 2. 서버 및 통신 시스템 구성도]]<br/> | ||
+ | 위의 표는 의자 모듈의 프로그램 구성이다. 총 세 개의 프로그램으로 작동하며 각 프로그램은 데이터 수집, 서버 그리고 데이터베이스 역할을 한다. main.out은 데이터 수집 프로그램으로 GPIO를 통해 얻어온 데이터를 data.json 파일로 저장하는 역할을 한다. conv는 데이터베이스 프로그램으로 main.out의 결과물로 얻어진 data.json을 cron을 통해 일정 주기로 데이터베이스에 갱신하는 역할을 한다. 여기서 말하는 데이터베이스는 서버 컴퓨터(의자 모듈 내장 라즈베리파이)에 json file로 물리적으로 저장되어 있다. server는 npm express 모듈로 구성했으며 http 서버 구성을 따른다. REST API로 통신하며 클라이언트로부터 GET 요청만 받도록 설정되어있다. Route: /init은 conv를 실행하기 위한 키값을 가진 ok.json에 접근하여 GET 요청 시 conv를 활성화시킨다. Route: /db는 GET 요청 시 데이터베이스에 접근하여 해당 데이터를 전달한다. 그중 route:/db/end는 GET 요청 시 conv에서 갱신한 데이터들을 day.json과 weekdb.json에 정리하여 저장하며 ok.json에 접근하여 conv를 비활성화한다. 각 프로그램은 profile.d 서비스의 start*.sh에 의해 실행된다. AP mode를 수행하기 위해 hostapd와 dnsmasq를 사용했으며 dhcpcd와 rc.local를 수정하여 AP mode를 활성화한다. | ||
+ | ====애플리케이션==== | ||
+ | 라즈베리파이3에 Android Things를 설치하여 애플리케이션이 동작하도록 한다. IoT 개발에서 가장 중요한 부분은 연결성, 보안, 개발 환경이다. 우리는 안드로이드 씽스(Android Things)의 장점인 안드로이드 운영체제와 같은 맥락의 운영체제이며 기존 스마트 폰 앱처럼 IoT 앱을 개발할 수 있다는 점, 운영체제와 네트워크에 대한 별도의 개발이 필요없어 개발 난이도가 상대적으로 낮다는 점, 자바(JAVA)언어를 통해 프로그래밍이 가능하여 이식성이 좋다는 점에 착안하여 이를 선택하였다. 안드로이드 프레임워크를 적용한 임베디드 시스템을 만들 수 있기에 이를 적극적으로 활용하기로 하였다. 다음은 어플리케이션의 기본적인 기능 흐름도이다. | ||
+ | [[파일:펜타코어 애플리케이션 플로우차트.png|900픽셀|섬네일|가운데|그림 15. 애플리케이션 Flow Chart]]<br/> | ||
+ | |||
+ | =====클래스 내용===== | ||
+ | 크게 시작, 메인, 달력, 통계1(주차 그래프), 통계2(실시간 그래프) 로 총 5개의 엑티비티로 이루어져있다. 또한, 클래스는 크게 4가지 기능으로 구분된다.<br/> | ||
+ | <br/> | ||
+ | '''□ 통신 관련 클래스'''<br/> | ||
+ | ◎ MainActivity : 화분 모듈이 서버와 잘 통신되고 있는지 확인하고, 승인이 완료되면 메인화면으로 넘어갈 수 있다. 또한, 가장 초기화면으로써, 바른자세에 대한 안내, 이어서 의자 사용하기 등의 역할을 수행한다.<br/> | ||
+ | ◎ Requestqueue : FIFO 구조로 json오로 요청하고 받는 것을 순차적으로 진행할 수 있게 처리한다.<br/> | ||
+ | ◎ JsonObjectRequest,JsonArrayRequest : json파일을 array 또는 object 형식에 따라 요청한다.<br/> | ||
+ | <br/> | ||
+ | '''□ 모터제어 관련 클래스'''<br/> | ||
+ | ◎ mainscreen : 실시간으로 서버에서 받아오는 json파일을 파싱하여 알맞은 값들을 적재적소에 뿌려, 점수, 자세 등을 표출하며, 꽃을 모터제어를 통하여 제어한다. 제어할 때에는 json파일에 맞게 스레드를 생성하여 처리한다. <br/> | ||
+ | ◎ servo : 안드로이드 씽스에서 사용 가능하며, 서보 모터를 인식할 수 있도록 처리한다.<br/> | ||
+ | <br/> | ||
+ | '''□ 달력 관련 클래스'''<br/> | ||
+ | ◎ calendars : 달력을 생성하여, 날짜를 클릭 시에 그 날짜를 읽어서 화면에 표출한다. 그 값을 통하여 json 파일의 key에 접근하여 해당하는 value, 즉, 그 당시 날짜의 앉은 시간의 비율, 바른자세, 점수 등을 불러온다.<br/> | ||
+ | ◎ MaterialCalendarView : 달력을 생성할 수 있도록 하는 클래스이다. <br/> | ||
+ | <br/> | ||
+ | '''□ 통계 관련 클래스'''<br/> | ||
+ | ◎ stack : 그래프를 생성하여, week 데이터에 저장된 데이터를 받아와 상황에 맞게 표출한다. 위 그래프는 이전날짜 7일의 추세 그래프를 보여준다.<br/> | ||
+ | ◎ realtime : 그래프를 생성하여, min 데이터에 저장된 데이터를 받아와 상황에 맞게 표출한다. 위 그래프는 1분마다 실시간으로 업데이트되어 그래프를 보여준다.<br/> | ||
+ | ◎ LineChart : 그래프를 생성할 수 있도록 하는 클래스이다. <br/> | ||
+ | ◎ glide : gif 이미지를 인식하여, 움직일 수 있는 이미지(움짤)를 사용할 수 있게 처리한다.<br/> | ||
+ | |||
+ | =====클래스 세부 내용===== | ||
+ | ◎ MainActivity : 화분 모듈이 서버와 잘 통신되고 있는지 확인하고, 승인이 완료되면 메인화면으로 넘어갈 수 있다.<br/> | ||
+ | [[파일:펜타코어 앱표1.PNG|500픽셀|섬네일|가운데|애플리케이션 표1]]<br/> | ||
+ | -Requestqueue 클래스를 참조하여 mqueue1, 2를 생성한 뒤, 1은 측정시작 버튼을 클릭 시에 서버와 json 통신을 하기 위해 사용되며, 2는 이어하기 버튼을 클릭 시에 통신을 위해 사용된다.<br/><br/> | ||
+ | ◎ mainscreen : 실시간으로 서버에서 받아오는 json파일을 파싱하여 알맞은 값들을 적재적소에 뿌려, 점수, 자세 등을 표출하며, 꽃을 모터제어를 통하여 제어한다. 제어할 때에는 json파일에 맞게 스레드를 생성하여 처리한다. 통신에 사용하는 클래스는 앞의 mainactivity와 동일하다. | ||
+ | <br/> | ||
+ | [[파일:펜타코어 앱표2.PNG|500픽셀|섬네일|가운데|애플리케이션 표2]]<br/> | ||
+ | ◎ calendars : 달력을 생성하여, 날짜를 클릭 시에 그 날짜를 읽어서 화면에 표출한다. <br/> | ||
+ | [[파일:펜타코어 앱표3.PNG|500픽셀|섬네일|가운데|애플리케이션 표3]]<br/> | ||
+ | -MaterialCalendarView 클래스를 통해 달력을 생성한다. 달력을 클릭 시에 setonDateChangedlistener를 통하여 클릭한 날짜를 받아온다. 날짜의 형식은 yyy.mm.dd 이며 date1에 string 형식으로 저장된다. date1 의 값으로 json의 key에 접근하여 값을 받아온다.<br/> | ||
+ | <br/> | ||
+ | -calendardatescore의 jsonobject 형식의 변수 안의 value를 각각 score, percent, ptilt, prb, pcr 에 저장한다. score + percent + ptilt + prb + pcr = 100 % 이다.<br/> | ||
+ | <br/> | ||
+ | ◎ stack : 그래프를 생성하여, week 데이터에 저장된 데이터를 받아와 상황에 맞게 표출한다. 위 그래프는 이전날짜 7일의 추세 그래프를 보여준다.<br/> | ||
+ | [[파일:펜타코어 앱표4.PNG|500픽셀|섬네일|가운데|애플리케이션 표4]]<br/> | ||
+ | -realtime 클래스는 실시간으로 그래프를 매 분마다 정보를 받아와서 그래프를 그려준다.<br/> | ||
+ | |||
+ | =====서버 통신===== | ||
+ | 의자 모듈의 라즈베리파이3에 서버를 두고 서버에서 ap모드를 킬 시에, 모듈에서 와이파이를 잡아서 서로 통신이 되는 구조이다. 기본적으로 앞에서 얘기한 것처럼 REST API로 통신하며 클라이언트로부터 GET 요청만 받도록 설정되어있다. Route: /init은 conv를 실행하기위한 키 값을 가진 ok.json에 접근하여 GET 요청 시 conv룰 활성화 시킨다. 즉, 기본적인 통신 순서는 다음과 같다. <br/> | ||
+ | :1. 클라이언트에서 ok.json에 접근하여 conv(기록측정) 활성화<br/> | ||
+ | :2. jsonobjectrequest 클래스를 생성하여 요청에 맞는 key를 탐색하여 받아옴<br/> | ||
+ | :3. mQueue 클래스를 통하여 처음 요청한 값부터 선출<br/> | ||
+ | |||
+ | =====서보모터 구동===== | ||
+ | 서보모터 구동은 mainscreen.java에서 일어난다. 서보모터는 jsonobjectrequest 문에서 score와 mode의 값을 서버에서 받아오는 것을 기다리고, 모드에 따라 해당하는 스레드를 생성한다. 구동 스레드는 총 6가지로, 정상자세, 왼쪽, 왼대각, 앞, 오른대각, 오른쪽이 존재한다. 이 서보모터의 구동은 다른 액티비티로 넘어가더라도 작동이 되어, 화분모듈이 작동하는 것을 확인할 수 있다. | ||
==프로젝트 결과== | ==프로젝트 결과== | ||
===최종 결과물=== | ===최종 결과물=== | ||
+ | '''1. 의자모듈''' | ||
+ | |||
+ | 의자모듈의 최종 외관은 다음과 같다. | ||
+ | |||
+ | |||
+ | [[파일:의자전면.jpg|500픽셀|섬네일|가운데|그림16. 의자모듈의 앞면]] | ||
+ | [[파일:의자옆면.png|500픽셀|섬네일|가운데|그림17. 의자모듈의 옆면]] | ||
+ | [[파일:의자후면.jpg|500픽셀|섬네일|가운데|그림18. 의자모듈의 뒷변]] | ||
+ | |||
+ | 보조의자는 그림과 같이 사용자의 기존 의자위에 놓고 사용할 수 있다. 압력센서는 쿠션 밑부분에 위치하여 있어 외부로 보이지 않게 하였다. | ||
+ | |||
+ | 의자의 뒷면에는 회로와 구성품들을 보호하기위한 케이싱 작업이 되어있다. 최종적으로 아크릴판과 벨크로를 사용하여 케이스를 제작하였으며 탈부착이 용이하도록 하였다. | ||
+ | |||
+ | |||
+ | '''2. 화분모듈''' | ||
+ | |||
+ | 화분모듈은 터치스크린과 꽃 모형으로 구성된다. | ||
+ | |||
+ | 화분모듈에서 사용하는 자세관리 애플리케이션은 다음과 같은 기능을 포함한다. | ||
+ | |||
+ | [[파일:측정시작.jpg|500픽셀|섬네일|가운데|그림19. 애플리케이션 시작 화면]] | ||
+ | |||
+ | |||
+ | :1) 실시간 피드벡 | ||
+ | |||
+ | :실시간 사용자의 자세 점수와 자세에 따른 꽃 모형의 모션을 통해 사용자에게 즉각적인 자세피드벡을 줄 수 있도록 하였다. | ||
+ | [[파일:꽃모형 작동.jpg|500픽셀|섬네일|가운데|그림20. 꽃 모형 작동 모습 ]] | ||
+ | |||
+ | |||
+ | :2) 통계 시스템 구축 | ||
+ | |||
+ | :사용자의 자세 점수에 대한 추이를 그래프로 표현하였으며 사용자는 이를 보고 분별, 날짜별 점수 추이를 확인할 수 있다. | ||
+ | |||
+ | [[파일:분별점수.jpg|500픽셀|섬네일|가운데|그림21. 분별 자세 점수 추이 ]] | ||
+ | [[파일:일별통계.jpg|500픽셀|섬네일|가운데|그림22. 일별 자세 점수 추이 ]] | ||
− | + | :3) 달력과 연계한 피드벡 | |
− | + | :사용자는 달력의 날짜를 터치함으로써 해당 일의 의자 사용시간, 일별 점수, 그날의 자세 문제에 대한 비율을 확인할 수 있다. | |
+ | :자세 비율을 통해 하루 동안 어떤 자세문제가 얼마나 발생하였는지를 확인할 수 있다. | ||
+ | [[파일:달력.jpg|500픽셀|섬네일|가운데|그림23. 달력에 표시된 자세정보 ]] | ||
+ | ===발전 가능성=== | ||
+ | '''㉠''' 애플리케이션 통계 기능의 그래픽 인터페이스에서 더 발전할 여지가 있으나, 시간적 제약에 의해 구현되지 못함<br/> | ||
+ | '''㉡''' 서보모터 구동 시 발생하는 소음에 의해 사용자가 불편함을 느낄 수 있어 소음에 대한 개선안이 필요<br/> | ||
+ | '''㉢''' 초기 설계 후 구매한 디스플레이의 크기에 의해 화분 전체의 크기가 다소 커진 경향이 있어 약간의 소형화가 요구됨<br/> | ||
+ | '''㉣''' 의자 모듈에 장착된 다른 기기들은 무게에 큰 영향을 미치지 않지만 함께 부착된 보조배터리로 인해 전체 중량이 증가하여 경량화가 요구될 수 있음<br/> | ||
==프로젝트 평가== | ==프로젝트 평가== | ||
===평가항목=== | ===평가항목=== | ||
+ | [[파일:펜타코어 평가항목.PNG|900픽셀|섬네일|가운데|표 3. 프로젝트 평가 항목]]<br/> | ||
===평가결과=== | ===평가결과=== | ||
+ | '''1. 자세 판단 정확도''' | ||
+ | :-> 총 100회의 자세 변화에서 97회의 자세 판단 성공<br/> | ||
+ | '''2. 반응성''' | ||
+ | :-> 총 100회의 자세 변화에서 약 1.89s의 평균 꽃 응답 시간 (표준편차 = 0.17s)<br/> | ||
+ | '''3. 설계 목표 달성도 [6/7]''' | ||
+ | :-> 데이터 누적을 통해 자세 습관을 분석하여 사용자에게 알맞은 피드백을 제공하는 기능은 구현하지 못함<br/> | ||
+ | '''4. 배터리 절약''' | ||
+ | :-> 구체적인 소비 전력을 파악하여 배터리 사용 효율을 증대시키려 하였으나 넉넉한 배터리 용량 확보로 문제를 해결<br/> | ||
==느낀점== | ==느낀점== | ||
+ | '''표*근''' : 무언가를 만드는 과정은 그것이 쉽든 어렵든 간에 생각보다 더 많은 노력이 필요하다는 것을 깨달았다. 팀원들과 아이디어를 실제 제품까지 만드는 과정이 쉽지는 않았지만 재밌었다. | ||
+ | 예상치 못한 문제들을 같이 해결해내는 과정에서 협업의 중요성을 배울 수 있었다. <br/> | ||
+ | <br/> | ||
+ | '''고*균''' : 이번 프로젝트를 통해 자세에 대해서 많이 연구하고 고민하면서 그동안 생각해보지 않았던 인체공학적 지식들을 많이 접할 수 있었다. 또한, 화분 모듈 하드웨어를 담당하면서 동작제어가 생각처럼 되지 않을 때가 많았고 케이싱 과정 중에도 디자인하고 제작하는 과정이 참 많이 까다로운 작업이라는 것을 느꼈다. <br/> | ||
+ | <br/> | ||
+ | '''백*우''' : 소프트웨어를 통합하기 위해서는 소프트웨어에 사용되는 각 언어와 통신 등 전방위적인 특징과 개념을 알고 있어야 함을 알게 되었다. 프로젝트 개별적인 모듈을 만드는 것은 단순히 시작일 뿐이었다. <br/> | ||
+ | <br/> | ||
+ | '''이*현''' : 애플리케이션에 대해 개발하면서 통신 부분, 모터 제어 부분, 애플리케이션 부분을 통합하여 한 단에서 진행한다는 것이 얼마나 어려운지 알게 되었다. 또한 매우 흥미로워서 힘들지만 재밌었고 많은 것들을 얻어 갈 수 있었다. 이번 기회를 통하여 배운 지식을 통하여 더 많은 결과물을 만들어내고 싶다는 생각이 들었다. <br/> | ||
+ | <br/> | ||
+ | '''강*혁''' : 프로젝트를 진행하며 예기치 못한 상황에 발생하는 문제들로 인해 많이 좌절했지만, 단계적으로 문제들을 해결하며 극복하였다. 또한, 프로그램 작성 시 버전 관리의 중요성을 깨달았으며, 실제 프로그램 작동 시 발생할 수 있는 예외 상황들을 처리하는 것에서 많은 어려움이 있었다. 그리고 하드웨어 제작 과정에서는 많은 시행착오를 겪으며 항상 문제가 발생할 수 있다는 사실을 염두에 두고 작업에 임해야 한다는 것을 깨달았으며, 공학 문제 프로젝트를 협업을 통해 해결해나가는 귀중한 경험이었다. <br/> | ||
+ | <br/> |
2020년 6월 21일 (일) 18:13 기준 최신판
프로젝트 소개
프로젝트 명
허리업! 자세교정꽃
압력센서와 가속도계를 이용한 자발적 자세교정 시스템
프로젝트 기간
2020.3.16~2020.6.22
팀 소개
서울시립대학교 기계정보공학과 20154300** 표*근 (팀장)
서울시립대학교 기계정보공학과 20154300** 고*균
서울시립대학교 기계정보공학과 20154300** 백*우
서울시립대학교 기계정보공학과 20154300** 이*현
서울시립대학교 기계정보공학과 20174300** 강*혁
프로젝트 개요
프로젝트 요약
압력센서와 가속도 센서를 통한 자세 판단을 바탕으로 화분의 로봇 꽃을 제어해 사용자에게 피드백을 제공하는 자발적 자세 교정 시스템을 제작한다. 등받이에 부착된 가속도 센서를 통해 전체적인 자세를 판단하고, 사용자가 잘못된 자세를 취할 시 화분의 꽃 로봇이 잘못된 자세를 모방하는 움직임을 표현하여 사용자가 인지하도록 한다.
프로젝트의 배경
현대인들은 학업, 업무 등으로 인해 책상에 앉아 있는 시간이 점점 길어지고 있고, 이와 관련된 질환들로 내원하는 빈도가 빠르게 증가하고 있다.
이러한 통계를 뒷받침하듯 다양한 자세 교정 제품들이 시중에 출시되었으며, 이들의 공통적인 특징은 물리적으로 사용자의 행동을 제약하여 올바른 자세를 유도한다는 것이다. 그러나 많은 소비자 설문에 의하면 자발적인 자세 유지가 이 루어지지 않을 시 사용자의 불편함을 초래할 수 있으며, 자세 교정을 위한 물리적인 피드백(진동, 움직임 제약 등)에 대한 부정적인 반응이 두드러지게 나타나는 경향을 보인다. 또한, 좋은 자세는 어떤 기구에 의해 유지되어야 하는 것이 아니므로, 사용자의 자발적인 자세 교정을 유도하는 새로운 방식의 자세 교정 시스템이 좋은 자세 습관 형성에 기여할 것으로 예상한다.
프로젝트의 배경 및 기대효과
본 시스템의 목적은 사용자의 자발적인 자세 교정과 좋은 자세 습관의 확립이며, 큰 불편함 없이 자세 교정기구를 사용할 수 있다는 장점이 있다. 또한, 애플리케이션의 인터페이스를 통해 자신의 자세 점수, 경향을 직관적으로 파악할 수 있어 간편한 자세 모니터링이 가능하다. 추후 누적된 데이터를 통해 사용자의 자세 습관을 파악하여 적절한 피드백을 제공하는 기능을 추가한다면 자세 습관 개선에 큰 도움이 될 것이다.
목적계통도
㉠ 편의성
본 시스템은 강압적이지 않은 교정 방식으로 사용자의 올바른 자세 습관을 유도하므로, 보조 의자를 장시간 이용할 때 불편함이 있으면 안 된다. 또한, 실제 사용 시 별도의 조작 없이 간편하게 작동해야 하며 사용자에게 자세 정보를 적절한 때에 제공할 수 있어야 한다. 이상적인 설계에서 자세 정보를 수집하는 의자는 외부 전원공급 없이 작동할 수 있어야 하며, 다양한 환경에서 큰 제약 없이 사용이 가능하도록 한다. 그리고 안드로이드 OS 기반의 애플리케이션을 통해 수집된 데이터의 경향과 날짜, 시간별 자세 추이를 어디서나 손쉽게 확인할 수 있도록 시스템을 구성한다.
㉡ 정확성
올바른 자세라는 다소 추상적인 특성에서 구체적인 기준을 설정하고 사용자의 자세를 판단해야 하므로, 사용 전 기준 확립과 자세판단에서 높은 정확도가 요구된다. 이러한 점을 보완하기 위해 자이로 센서의 기울기 정보를 바탕으로 물리적 수평을 감지하며, 효율적인 로드셀 배치로 편향된 무게 분포를 파악할 수 있도록 한다. 그리고 전체 시스템의 유일한 구동부인 화분 모듈에서는 사용자가 잘못된 자세를 취할 때 이를 즉각적으로 명확하게 표현할 수 있어야 하므로 신속한 반응성이 서보 모터를 통해 구현되어야 한다.
㉢ 지속성
전체적인 완성품의 지속성은 크게 두 가지의 특성에 적용될 수 있다. 첫째는 H/W의 물리적 내구성을 의미하며, 의자에 가해지는 외부 충격이나 잠재적인 파손에 시스템을 보호할 수 있도록 안정성을 갖추는 설계를 지향한다. 두 번째 지속성은 사용자의 자세 데이터 수집과 관리의 측면에서 누적된 데이터를 체계적으로 정리, 분석하여 올바른 자세를 위해 사용자에게 적절한 피드백을 제공할 수 있어야 한다.
동작 시나리오
전체 시스템의 동작은 의자에서 변화하는 사용자 자세 데이터를 입력받아 저장하면 화분 모듈이 의자 모듈의 서버에서 데이터를 불러오고, 데이터에 기록된 자세 모드에 따라 애플리케이션 내의 Background Process로 꽃을 실시간으로 작동시킨다. 구체적인 시나리오로는 사용자가 의자와 화분 모듈에 전원을 인가하고, 화분의 디스플레이에 표시된 ‘측정하기’, ‘이어하기’ 두 버튼을 통해 자세 판단 및 피드백 기능을 실행할 수 있다. 사용자는 실시간으로 변화하는 자세에 대한 꽃의 피드백을 2초 단위로 받을 수 있으며, 앉아 있는 시간 동안 데이터는 계속해서 누적되어 의자 사용 시간, 자세 점수 등을 확인할 수 있다. 사용 종료를 위해서는 ‘오늘은 여기까지’ 버튼을 통해 시스템을 종료하여 자세 점수 측정을 중단할 수 있다.
구현 내용
역할분담
표*근 [팀장]
프로젝트 진행 상황을 총괄하며 자재 관리 및 팀 구성원 간 역할분담과 조율 및 실험을 수행하였고, 회로도 구성 및 프로젝트 진행 과정에서 필요한 서식 문서들의 작성과 검토, 최종 승인까지 담당하여 팀의 중추를 담당하였다.
고*균 [화분 제작 및 서보모터 제어 담당]
허리 업! 시스템의 유일한 구동부인 서보모터를 통한 꽃 제어를 담당하였고, 다양한 메커니즘으로 꽃의 움직임을 실험, 관찰하여 시스템에 적합한 구조를 설계하였다. 또한, 블록을 이용해 화분을 제작하여 터치 디스플레이와 라즈베리파이, 서보모터가 모두 내장되며 심미성과 내구성을 갖춘 화분을 제작하였다.
백*우 [서버 구축 및 통신 시스템 담당]
의자 모듈의 라즈베리파이로 서버를 구축하여 화분 모듈이 실시간으로 데이터를 읽어와 꽃을 구동시킬 수 있도록 하였고, 추가적으로 압력 센서 배치를 위한 민감도 최적화를 수행하여 자세 판단 정확도를 크게 향상시켰다.
이*현 [안드로이드 애플리케이션 개발]
안드로이드 Things를 기반으로 작동할 수 있는 애플리케이션을 중점적으로 개발하였다. 애플리케이션의 UI 디자인과 통계 기능들을 효과적으로 수행할 수 있도록 프로그램을 설계하였으며, 사용자 편의성과 사용의 지속성을 위한 심미성을 확보하였다.
강*혁 [실험 계획 및 하드웨어 제작 담당]
초기 설계 단계에서 의자의 압력 분포를 확인하기 위한 실험 계획 및 수행, 데이터 해석과 의자 모듈 제작을 담당하였다. 자세 판단 코드를 작성하였으며 사용자의 정확한 자세를 판단하기위한 기준 체계를 확립하였다.
개발 일정
시스템 구성
전체 시스템은 크게 의자 모듈과 화분 모듈로 구분할 수 있고, 구체적인 구성은 다음 그림과 같다. 각 모듈에 라즈베리파이가 내장되어 데이터 처리 및 통신, 제어 기능을 수행한다. 보조 의자에서는 사용자 환경에 맞게 설정된 기준에 따라 센서에서 입력된 데이터를 바탕으로 자세를 판단하며, 사용자의 자세가 바르지 않은 경우 화분 모듈의 꽃을 제어해 잘못된 자세를 모방함으로써 올바른 자세로 고칠 수 있도록 유도한다.
보조 의자 모듈 설계 및 회로 구현
의자 모듈은 라즈베리파이4, 직경 12mm FSR 압력센서, 자이로 센서, 4채널 어레이 저항 브릿지, ADC칩과 20000mAh 용량의 보조배터리로 구성된다. 본 시스템에 사용되는 의자는 에이블루社의 Curble Chair로 여러 모델 중 프로젝트의 목적에 가장 잘 부합하는 제품인 커블 체어 와이더(Curble Chair Wider)를 사용하였다. 본 의자는 인체공학적으로 설계되어 사용자의 척추와 골반의 각도를 제한하여 척추 중립자세를 유지하도록 도와준다. 라즈베리파이를 통해 압력센서와 자이로센서로부터 얻은 데이터를 수집 및 처리하여 사용자의 자세를 판단한다. 또한, 서버를 열어 화분 모듈과의 통신을 가능하게 하며 사용자의 자세 모드를 전송하는 역할을 한다.
4개의 압력센서는 사용자의 둔부와 허벅지 압력을 통해 의자 사용 여부 및 다리 꼼을 감지하는 역할을 한다. 나머지 한 개는 의자의 등 부분에 위치하며 사용자의 등이 굽은 자세를 감지한다. 이는 인체 해부학적으로 등을 굽었을 시 압력센서의 값이 증가하는 것에 착안하여 위치를 결정하였다. 5개의 센서는 4채널 저항 브릿지와 ADC 칩인 MCP-3208에 연결되어 있다.
또한, 사용자의 전체적인 움직임은 등받이 뒤편에 위치한 자이로 센서로 파악한다. 등받이 뒤편에는 보조배터리가 부착되어 있으며 이는 라즈베리파이의 전원 공급을 담당한다. 콘센트로부터 외부전원이 입력된다면 사용자가 본 시스템을 이용하는 데 있어 제한사항이 발생하므로 이를 해결하기 위해 보조배터리를 부착하여 해결하였다. 보조배터리는 20,000mA의 대용량으로 라즈베리파이4의 정격 전원인 [5V,3A]를 충족함과 동시에 사용자에게 12시간 이상의 사용시간을 제공한다. 사용 후 충전을 통해 다음날 사용이 가능하다.
의자 모듈 시스템의 회로는 만능기판을 통해 구성되어 있으며, 외부의 충격으로부터 회로를 보호하기 위해 블록으로 케이싱 되어있다.
화분 모듈 설계 및 회로 구현
화분 모듈은 라즈베리파이3, 서보모터, 7인치 터치 디스플레이, 꽃 모형으로 구성되어 있다. 화분 모듈의 기능은 의자 모듈로부터 사용자의 자세 정보를 받아 사용자에게 피드백을 제공하는 것이다. 자세 문제에 대한 피드백은 터치 디스플레이와 꽃 모형을 통해 이루어진다. 라즈베리파이에는 Android Things를 활용한 어플리케이션이 구동되며 서보모터와 애플리케이션을 동작시킨다. 꽃 모형은 탄성체인 스프링과 와이어로 구성되어 있다. 서보모터의 제어를 통해 꽃 모형이 사용자의 자세 모드에 해당하는 움직임을 취하도록 구현하였으며 사용자는 이를 통해 자신의 잘못된 자세를 인지하게 된다. 화분의 디스플레이를 통해 실시간 자세 피드백을 받아 볼 수 있으며 애플리케이션의 다양한 기능을 활용할 수 있다. 전체적인 외형은 블록을 통해 구현되어 내부의 구성품들을 보호하며 심미성을 더해준다.
소프트웨어 설계 및 구현
소프트웨어부는 자세 판단 알고리즘, 서버 구축 및 통신, 편리한 시스템 사용을 위한 애플리케이션으로 구분된다.
자세 판단 알고리즘
초기 설계 단계에서 자세 판단 방법을 확립하기 위해 다음과 같은 논의를 거쳤으며, 요약된 과정은 내용은 표와 같다.
이후 확립된 자세 판단 코드는 의자 모듈의 라즈베리파이에서 동작하며 압력센서와 자이로 센서의 값을 통해 사용자의 자세를 판단한다. 압력센서는 사용자가 특정한 자세를 취할 때 변화하는 압력을 감지하며, 자이로 센서는 전체적인 사용자 몸의 기울기를 감지한다. 자세 판단에는 기본 자세 모드와 특정 자세 모드 두 가지로 나뉜다. 기본자세 모드는 등받이 뒤에 부착되어 있는 자이로 센서를 활용하여 사용자의 앉은 자세 기울기를 판별한다. 자이로 센서로부터 A_x, A_y, A_z 값을 읽을 수 있으며 이를 다음과 같이 계산하여 오일러 각(Euler angle)을 계산할 수 있다. 계산된 Pitch와 Roll 각도를 통해 사용자가 어떤 자세를 취하였는지 확인할 수 있다.
특정 자세 모드는 의자에 부착된 압력센서를 통해 판별되며 센서의 위치는 그림 6과 같다. 자세 점수는 ‘기본 자세 모드’와 ‘특정 자세 모드’의 조합을 통해 결정되며 초기 100점에서 각 자세별 감점이 적용되어 합산된 점수가 Sensing interval마다 DB에 저장된다.
서버 구축 및 통신 시스템
위의 표는 의자 모듈의 프로그램 구성이다. 총 세 개의 프로그램으로 작동하며 각 프로그램은 데이터 수집, 서버 그리고 데이터베이스 역할을 한다. main.out은 데이터 수집 프로그램으로 GPIO를 통해 얻어온 데이터를 data.json 파일로 저장하는 역할을 한다. conv는 데이터베이스 프로그램으로 main.out의 결과물로 얻어진 data.json을 cron을 통해 일정 주기로 데이터베이스에 갱신하는 역할을 한다. 여기서 말하는 데이터베이스는 서버 컴퓨터(의자 모듈 내장 라즈베리파이)에 json file로 물리적으로 저장되어 있다. server는 npm express 모듈로 구성했으며 http 서버 구성을 따른다. REST API로 통신하며 클라이언트로부터 GET 요청만 받도록 설정되어있다. Route: /init은 conv를 실행하기 위한 키값을 가진 ok.json에 접근하여 GET 요청 시 conv를 활성화시킨다. Route: /db는 GET 요청 시 데이터베이스에 접근하여 해당 데이터를 전달한다. 그중 route:/db/end는 GET 요청 시 conv에서 갱신한 데이터들을 day.json과 weekdb.json에 정리하여 저장하며 ok.json에 접근하여 conv를 비활성화한다. 각 프로그램은 profile.d 서비스의 start*.sh에 의해 실행된다. AP mode를 수행하기 위해 hostapd와 dnsmasq를 사용했으며 dhcpcd와 rc.local를 수정하여 AP mode를 활성화한다.
애플리케이션
라즈베리파이3에 Android Things를 설치하여 애플리케이션이 동작하도록 한다. IoT 개발에서 가장 중요한 부분은 연결성, 보안, 개발 환경이다. 우리는 안드로이드 씽스(Android Things)의 장점인 안드로이드 운영체제와 같은 맥락의 운영체제이며 기존 스마트 폰 앱처럼 IoT 앱을 개발할 수 있다는 점, 운영체제와 네트워크에 대한 별도의 개발이 필요없어 개발 난이도가 상대적으로 낮다는 점, 자바(JAVA)언어를 통해 프로그래밍이 가능하여 이식성이 좋다는 점에 착안하여 이를 선택하였다. 안드로이드 프레임워크를 적용한 임베디드 시스템을 만들 수 있기에 이를 적극적으로 활용하기로 하였다. 다음은 어플리케이션의 기본적인 기능 흐름도이다.
클래스 내용
크게 시작, 메인, 달력, 통계1(주차 그래프), 통계2(실시간 그래프) 로 총 5개의 엑티비티로 이루어져있다. 또한, 클래스는 크게 4가지 기능으로 구분된다.
□ 통신 관련 클래스
◎ MainActivity : 화분 모듈이 서버와 잘 통신되고 있는지 확인하고, 승인이 완료되면 메인화면으로 넘어갈 수 있다. 또한, 가장 초기화면으로써, 바른자세에 대한 안내, 이어서 의자 사용하기 등의 역할을 수행한다.
◎ Requestqueue : FIFO 구조로 json오로 요청하고 받는 것을 순차적으로 진행할 수 있게 처리한다.
◎ JsonObjectRequest,JsonArrayRequest : json파일을 array 또는 object 형식에 따라 요청한다.
□ 모터제어 관련 클래스
◎ mainscreen : 실시간으로 서버에서 받아오는 json파일을 파싱하여 알맞은 값들을 적재적소에 뿌려, 점수, 자세 등을 표출하며, 꽃을 모터제어를 통하여 제어한다. 제어할 때에는 json파일에 맞게 스레드를 생성하여 처리한다.
◎ servo : 안드로이드 씽스에서 사용 가능하며, 서보 모터를 인식할 수 있도록 처리한다.
□ 달력 관련 클래스
◎ calendars : 달력을 생성하여, 날짜를 클릭 시에 그 날짜를 읽어서 화면에 표출한다. 그 값을 통하여 json 파일의 key에 접근하여 해당하는 value, 즉, 그 당시 날짜의 앉은 시간의 비율, 바른자세, 점수 등을 불러온다.
◎ MaterialCalendarView : 달력을 생성할 수 있도록 하는 클래스이다.
□ 통계 관련 클래스
◎ stack : 그래프를 생성하여, week 데이터에 저장된 데이터를 받아와 상황에 맞게 표출한다. 위 그래프는 이전날짜 7일의 추세 그래프를 보여준다.
◎ realtime : 그래프를 생성하여, min 데이터에 저장된 데이터를 받아와 상황에 맞게 표출한다. 위 그래프는 1분마다 실시간으로 업데이트되어 그래프를 보여준다.
◎ LineChart : 그래프를 생성할 수 있도록 하는 클래스이다.
◎ glide : gif 이미지를 인식하여, 움직일 수 있는 이미지(움짤)를 사용할 수 있게 처리한다.
클래스 세부 내용
◎ MainActivity : 화분 모듈이 서버와 잘 통신되고 있는지 확인하고, 승인이 완료되면 메인화면으로 넘어갈 수 있다.
-Requestqueue 클래스를 참조하여 mqueue1, 2를 생성한 뒤, 1은 측정시작 버튼을 클릭 시에 서버와 json 통신을 하기 위해 사용되며, 2는 이어하기 버튼을 클릭 시에 통신을 위해 사용된다.
◎ mainscreen : 실시간으로 서버에서 받아오는 json파일을 파싱하여 알맞은 값들을 적재적소에 뿌려, 점수, 자세 등을 표출하며, 꽃을 모터제어를 통하여 제어한다. 제어할 때에는 json파일에 맞게 스레드를 생성하여 처리한다. 통신에 사용하는 클래스는 앞의 mainactivity와 동일하다.
◎ calendars : 달력을 생성하여, 날짜를 클릭 시에 그 날짜를 읽어서 화면에 표출한다.
-MaterialCalendarView 클래스를 통해 달력을 생성한다. 달력을 클릭 시에 setonDateChangedlistener를 통하여 클릭한 날짜를 받아온다. 날짜의 형식은 yyy.mm.dd 이며 date1에 string 형식으로 저장된다. date1 의 값으로 json의 key에 접근하여 값을 받아온다.
-calendardatescore의 jsonobject 형식의 변수 안의 value를 각각 score, percent, ptilt, prb, pcr 에 저장한다. score + percent + ptilt + prb + pcr = 100 % 이다.
◎ stack : 그래프를 생성하여, week 데이터에 저장된 데이터를 받아와 상황에 맞게 표출한다. 위 그래프는 이전날짜 7일의 추세 그래프를 보여준다.
-realtime 클래스는 실시간으로 그래프를 매 분마다 정보를 받아와서 그래프를 그려준다.
서버 통신
의자 모듈의 라즈베리파이3에 서버를 두고 서버에서 ap모드를 킬 시에, 모듈에서 와이파이를 잡아서 서로 통신이 되는 구조이다. 기본적으로 앞에서 얘기한 것처럼 REST API로 통신하며 클라이언트로부터 GET 요청만 받도록 설정되어있다. Route: /init은 conv를 실행하기위한 키 값을 가진 ok.json에 접근하여 GET 요청 시 conv룰 활성화 시킨다. 즉, 기본적인 통신 순서는 다음과 같다.
- 1. 클라이언트에서 ok.json에 접근하여 conv(기록측정) 활성화
- 2. jsonobjectrequest 클래스를 생성하여 요청에 맞는 key를 탐색하여 받아옴
- 3. mQueue 클래스를 통하여 처음 요청한 값부터 선출
서보모터 구동
서보모터 구동은 mainscreen.java에서 일어난다. 서보모터는 jsonobjectrequest 문에서 score와 mode의 값을 서버에서 받아오는 것을 기다리고, 모드에 따라 해당하는 스레드를 생성한다. 구동 스레드는 총 6가지로, 정상자세, 왼쪽, 왼대각, 앞, 오른대각, 오른쪽이 존재한다. 이 서보모터의 구동은 다른 액티비티로 넘어가더라도 작동이 되어, 화분모듈이 작동하는 것을 확인할 수 있다.
프로젝트 결과
최종 결과물
1. 의자모듈
의자모듈의 최종 외관은 다음과 같다.
보조의자는 그림과 같이 사용자의 기존 의자위에 놓고 사용할 수 있다. 압력센서는 쿠션 밑부분에 위치하여 있어 외부로 보이지 않게 하였다.
의자의 뒷면에는 회로와 구성품들을 보호하기위한 케이싱 작업이 되어있다. 최종적으로 아크릴판과 벨크로를 사용하여 케이스를 제작하였으며 탈부착이 용이하도록 하였다.
2. 화분모듈
화분모듈은 터치스크린과 꽃 모형으로 구성된다.
화분모듈에서 사용하는 자세관리 애플리케이션은 다음과 같은 기능을 포함한다.
- 1) 실시간 피드벡
- 실시간 사용자의 자세 점수와 자세에 따른 꽃 모형의 모션을 통해 사용자에게 즉각적인 자세피드벡을 줄 수 있도록 하였다.
- 2) 통계 시스템 구축
- 사용자의 자세 점수에 대한 추이를 그래프로 표현하였으며 사용자는 이를 보고 분별, 날짜별 점수 추이를 확인할 수 있다.
- 3) 달력과 연계한 피드벡
- 사용자는 달력의 날짜를 터치함으로써 해당 일의 의자 사용시간, 일별 점수, 그날의 자세 문제에 대한 비율을 확인할 수 있다.
- 자세 비율을 통해 하루 동안 어떤 자세문제가 얼마나 발생하였는지를 확인할 수 있다.
발전 가능성
㉠ 애플리케이션 통계 기능의 그래픽 인터페이스에서 더 발전할 여지가 있으나, 시간적 제약에 의해 구현되지 못함
㉡ 서보모터 구동 시 발생하는 소음에 의해 사용자가 불편함을 느낄 수 있어 소음에 대한 개선안이 필요
㉢ 초기 설계 후 구매한 디스플레이의 크기에 의해 화분 전체의 크기가 다소 커진 경향이 있어 약간의 소형화가 요구됨
㉣ 의자 모듈에 장착된 다른 기기들은 무게에 큰 영향을 미치지 않지만 함께 부착된 보조배터리로 인해 전체 중량이 증가하여 경량화가 요구될 수 있음
프로젝트 평가
평가항목
평가결과
1. 자세 판단 정확도
- -> 총 100회의 자세 변화에서 97회의 자세 판단 성공
2. 반응성
- -> 총 100회의 자세 변화에서 약 1.89s의 평균 꽃 응답 시간 (표준편차 = 0.17s)
3. 설계 목표 달성도 [6/7]
- -> 데이터 누적을 통해 자세 습관을 분석하여 사용자에게 알맞은 피드백을 제공하는 기능은 구현하지 못함
4. 배터리 절약
- -> 구체적인 소비 전력을 파악하여 배터리 사용 효율을 증대시키려 하였으나 넉넉한 배터리 용량 확보로 문제를 해결
느낀점
표*근 : 무언가를 만드는 과정은 그것이 쉽든 어렵든 간에 생각보다 더 많은 노력이 필요하다는 것을 깨달았다. 팀원들과 아이디어를 실제 제품까지 만드는 과정이 쉽지는 않았지만 재밌었다.
예상치 못한 문제들을 같이 해결해내는 과정에서 협업의 중요성을 배울 수 있었다.
고*균 : 이번 프로젝트를 통해 자세에 대해서 많이 연구하고 고민하면서 그동안 생각해보지 않았던 인체공학적 지식들을 많이 접할 수 있었다. 또한, 화분 모듈 하드웨어를 담당하면서 동작제어가 생각처럼 되지 않을 때가 많았고 케이싱 과정 중에도 디자인하고 제작하는 과정이 참 많이 까다로운 작업이라는 것을 느꼈다.
백*우 : 소프트웨어를 통합하기 위해서는 소프트웨어에 사용되는 각 언어와 통신 등 전방위적인 특징과 개념을 알고 있어야 함을 알게 되었다. 프로젝트 개별적인 모듈을 만드는 것은 단순히 시작일 뿐이었다.
이*현 : 애플리케이션에 대해 개발하면서 통신 부분, 모터 제어 부분, 애플리케이션 부분을 통합하여 한 단에서 진행한다는 것이 얼마나 어려운지 알게 되었다. 또한 매우 흥미로워서 힘들지만 재밌었고 많은 것들을 얻어 갈 수 있었다. 이번 기회를 통하여 배운 지식을 통하여 더 많은 결과물을 만들어내고 싶다는 생각이 들었다.
강*혁 : 프로젝트를 진행하며 예기치 못한 상황에 발생하는 문제들로 인해 많이 좌절했지만, 단계적으로 문제들을 해결하며 극복하였다. 또한, 프로그램 작성 시 버전 관리의 중요성을 깨달았으며, 실제 프로그램 작동 시 발생할 수 있는 예외 상황들을 처리하는 것에서 많은 어려움이 있었다. 그리고 하드웨어 제작 과정에서는 많은 시행착오를 겪으며 항상 문제가 발생할 수 있다는 사실을 염두에 두고 작업에 임해야 한다는 것을 깨달았으며, 공학 문제 프로젝트를 협업을 통해 해결해나가는 귀중한 경험이었다.