상띵WALK 개발 뚝딱거리기.. 무수한 고난과 시련...
상띵WALK는 JAVA를 이용하여 만든 Android용 걷기운동 장려 어플리케이션이다. 걷기운동이라고 했지만 뛰는 운동도 가능하다.
'상띵WALK'는 안드로이드 스튜디오에서 JAVA로 개발하였다. 앱의 가장 기본이 되는 지도는 Kakao MAP API를 활용하였고, Kakao Login API를 사용하여 카카오 계정으로 로그인할 수 있도록 구현하였다. 데이터 베이스는 Google의 Firebase 중 실시간 데이터베이스(Real-time Database)를 이용하여 사용자의 계정 정보와 코스 기록을 저장하였다. 이는 데이터가 JSON Tree 형태로 저장되며 연결된 모든 클라이언트에 실시간으로 동기화되는 NoSQL 데이터베이스(비관계형 데이터베이스)이다.
카카오 API는 KaKao Developers에서 확인할 수 있다. KaKao Developers에서는 개발하는 앱 키를 관리할 수도 있고 개발자들에게 유용한 정보를 제공해주는데 앱 개발에 매우 유용하다!!
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
사용자가 자신의 코스 기록을 하고자 할 때 하단 메뉴의 [Map Search] 버튼을 누르고 하단 중앙의 [코스 기록 시작] 버튼을 누르면 시작 지점 좌표에 현재 지점을 저장한다. 코스 기록을 종료할 때는 [코스 기록 종료]버튼을 눌러 반복 실행을 종료한다. 걸은 결과는 하단의 나의 기록 버튼을 누르면 확인할 수 있다. 총 걸은 거리, 최근 걸은 거리, 달성 거리에 따른 배지를 확인할 수 있다.
걷는 동안 흥미유발을 위해 사용자의 현 위치를 발바닥 모양의 아이콘으로 출력하고 배경 음악과 효과음을 사용하였다. 또 하단의 리스트 메뉴를 클릭하면 기본으로 앱에 저장되어 있는 건강걷기 코스를 추천하기도 한다.
GPS 좌표는 삼각함수를 기본으로 계산하였으며, 시작 지점의 좌표와 (사용자가 걷고 있을) 현재 시점의 좌표 정보를 이용하여 두 지점 사이의 거리를 구하였다. [코스 기록 시작] 버튼을 누르면 시작 지점 좌표에 현재 지점의 좌표가 저장된다. TimerTask를 이용하여 1초마다 반복적으로 동작하고, CalDistance.java의 getDistance() 메서드를 이용하여 거리를 계산한다. 주요 변수로는 4가지(시작 지점 위도(bef_lat), 시작 지점 경도(bef_long), 현재 지점 위도(mCurrentLat), 현재 지점 경도(mCurrentLng))가 있다. 계산된 거리 값이 저장되는 변수는 sum_dist이며, sum_dist가 저장되는 곳은 fragmentSearch.java이다. 최종적으로 총 걸은 거리는 미터(m) 단위로 출력된다.
FragmentSearch.java에서 실행되는 동작은 다음과 같다.
1. 지구의 반지름은 6,371km이므로 다음과 같이 설정한다. (CalDistance.java의 getDistance() 에서 진행되는 내용이다.)
EARTH_R = 6371000.0; |
2. 지구 반지름의 라디안(Radian) 값을 구한다.
Rad = Math.PI/180; |
Math.PI는 원주율, 즉 파이(∏) 값이다.
3. 시작 지점의 위도 값과 현재 지점의 위도 값의 라디안 값을 구한다. 두 라디안 값은 Rad 변수를 이용하여 계산한다.
radLat1 = Rad * bef_lat; (시작 지점 ) radLat2 = Rad * cur_lat; ( 현재 지점 ) |
4. 거리 값을 저장할 변수 이름은 dist이다. 위 2번, 3번의 값들을 cos(코사인) 함수를 사용하여 계산한 값에 dist를 더한다.
dist = dist + Math.cos(radLat1)* Math.cos(radLat2) * Math.cos(radDist); |
5. 그리고 세타(θ) 값을 구한다. (세타는 주로 미지의 각을 나타낼 때 사용)
세타 값은 EARTH_R 값과 acos 함수를 사용하여 계산한 dist 변수 값을 서로 곱한 값이다.
theta = EARTH_R * Math.acos(dist); |
6. 앞서 계산했던 theta 값의 소수점 첫 번째 자리를 반올림한 뒤, 1000으로 다시 나눈다. 1000으로 다시 나누는 이유는, ‘소수점 첫 번째 자리’까지 나타내기 위함이다.
double res = Math.round(Math.round(theta) / 1000); |
→ CalDistance.java에서 최종적으로 도출되는 값은 변수 res이고 최종 return 값은 변수 result이다.
double result = res; return result; |
7. CalDistance.java에서 return 된 계산 결과 값은 FragmentSearch.java의 변수 dist에 저장된다.
double dist = calDistance.getDistance(); |
8. TimerTask 반복에 따라 계산될 때마다 dist 값이 sum_dist에 저장된다.
sum_dist += dist; |
→ sum_dist는 총 걸은 거리이다.
→ 산출된 sum_dist는 최근 걸은 거리와 총 걸은 거리 기록에 사용된다.
이미 상용화된 앱들(나이키런, 런스타틱, 만보기 앱 등)과 동시에 거리 측정을 하며 정확도 측정을 하였고 앱 별로 약간의 오차가 있지만 약 5m~10m의 오차로 유의미한 결과는 아니라고 판단하여 위와 같이 구현하였다.
중간 평가에서 가장 많이 지적받고 보완했으면 했던 부분이었기 때문에 가장 많이 공들였던 부분이다.
이 과정은 구글이 도와주었다... 수많은 검색을 통해 찾아낸 거리 계산 방법이다ㅠㅠ 사실 아직까지도 이 방법이 정확한 답인지 확신할 수 없지만 당시 우리에겐 최선의 답이었다고 생각한다.

운동이 끝나고 나면 카메라로 사용자의 코스 인증을 위한 카메라 사용을 팝업으로 유도한다. 카메라는 사용자가 목적지까지의 걷기가 끝났을 때 인증을 위한 수단으로 만약 사용자가 걷기를 마치고 코스가 종료된다면 카메라로 인증을 하겠냐는 메시지 박스가 보이게 된다. Yes 버튼을 클릭하거나 혹은 상단 메뉴의 카메라 버튼을 클릭하면 카메라 기능을 사용할 수 있게 하였다. 카메라는 우리가 직접 구현한 카메라를 불러올 수 있게 하였다. 촬영한 사진과 ‘상띵WALK‘만의 프레임을 합성시켜 갤러리의 상띵WALK 폴더에 저장된다. 또한 SNS(인스타그램)와 연동되어 사진을 찍은 후 바로 자신의 SNS 업로드할 수 있다.
거의 2년전에 했던 작업이고 작업했던 PC가 바뀌기도 했고 백업해놓은 자료가 많지 않아 기록에 구멍이 너무 많다..ㅠㅠ 이렇게 기록할 줄 알았으면 더 꼼꼼하게 저장해 놓을걸 싶다. 나중에 또 자료를 찾게 되면 글을 조금씩 보완해야겠다..ㅋㅋㅋ 앞으로 잘 기록해야지!!
최종 결과에 대한 소감을 말하자면, 코로나로 인해 비대면으로 프로젝트를 진행했던 부분이 많아 아쉬웠다. 각자 맡은 부분에 대한 피드백이 실시간으로 되지 않을 때가 많아 답답하기도 했다. 또 자바와 안드로이드 모두 자신있는 분야는 아니었기 때문에 시작 전부터 두렵긴 했다. 역시나 프로젝트 중간 중간 고비가 많았다. 그래도 팀원들끼리 소통하고 계속 질문하며 최선을 다했다고 생각한다. 결과를 보았을 때 아쉽고 부족한 부분이 많지만 할 수 있는 만큼 노력했기 때문에 뿌듯했다!!
'대학일기' 카테고리의 다른 글
대학교 졸업 과제_캡스톤디자인(상띵WALK)(1) (0) | 2021.05.17 |
---|