본문 바로가기
앱인벤터/앱인벤터 코딩따라하기

앱인벤터 GPS 정확도 기록 앱

by flycoding 2022. 12. 16.
반응형

앱인벤터 GPS 정확도 기록 앱

 

앱인벤터 홈페이지에 나와 있는 튜터리얼을 참고해서 작성한 것이다. 튜터리얼의 목적은 앱인벤터의 많은 블록은 이해하고 활용할 수 있도록 도와주는 프로그램들로 구성되어 있다.

 

위치 센서 컴포넌트는 지리적 위치에 대한 일부 기본 개념을 알지 못하면 사용하기 어려운 간단한 컨트롤이다. 위치 센서는 스마트폰/태블릿의 GPS(Global Positioning Satellite Receiver)와 통신하는 데 사용된다. 위치 센서가 내장 GPS 수신기와 통신할 때 GPS가 장치의 위치를 결정한다. 이 센서는 네트워크/와이파이 위치 서비스에서도 작동할 수 있다. 네트워크를 통해 위치를 찾는 방법은 GPS와 매우 다르다. 위치는 장치의 현재 위도와 경도를 의미하거나 사용자의 주소를 의미할 수 있다. 위치 센서에 사용되는 거리 측정 단위는 미터이다. 시간은 밀리초(ms) 단위로 측정된다. 1초 = 1000ms 및 60000ms는 1분이다.

 

위치 센서가 거리 정보를 보고하거나 컴포넌트에 거리를 설정하면, 단위는 미터 단위로 표시된다. 앱이 영어 단위를 사용해야 하는 경우 수학 블록을 사용하여 단위를 표시할 때 단위를 변환한다. 모든 것을 미터 단위로 계산한 다음 결과를 디스플레이에 피트 또는 마일 단위로 보고하도록 변환한다.

 

1해리(海里)는 지구 반지름에 걸쳐 1분(약 1도)의 각도로 이루어진 거리를 말한다. 이것은 위도 한도와 다음 전체도 사이의 거리가 60해리라는 것을 의미한다. 경도는 적도에서 60해리이지만, 극을 향해 위도를 바꾸면 인접한 전체 경도 사이의 간격이 줄어든다. 위도 사이의 간격은 일정하며, 경도 사이의 간격은 가변적이다.

현재의 앱 개발자들은 미터로 생각하지만, 오래 전에, 네비게이터들은 도, 분, 초의 영어 단위에 대한 그들의 배의 위치를 설명했다. 위도와 경도는 여전히 도, 분, 초 단위로 설명된다. 이것들은 컴퓨터에서 사용하기에는 어색한 단위이므로, 개발자와 다른 사람들은 일반적으로 수학 계산을 더 쉽게 하기 위해 십진 위도와 경도 설명을 사용한다. 위도 0.00001을 보면 0.9144m로 변환된다. 따라서 위성 위치 정보는 0.9m로 정확하다. 전문 GPS 수신기로 가능한 최고의 정확도는 약 3미터이다. 해상도를 더 좋게 만드는 기술들이 있다. 이 도구를 사용하여 앱을 개발할 때 장치의 GPS는 많은 것을 할 수 있지만 많은 경우 정확도가 제한된다.

 

GPS Accuracy Logger는 장치의 GPS(Global Positioning Satellite) 수신기의 사용을 시연하는 앱이다. 이 앱은 또한 장치가 어디에 있는지 여부에 따라 장치의 GPS의 정확도가 어떻게 달라지는지도 보여준다. 위치 센서 구성 요소는 모바일 장치의 GPS 수신기에 위성 수정 프로그램을 가져오도록 지시한다(위성을 찾고, 위성 정보가 유효한지 확인하고, 정보를 확인하기 위해 두 개 이상의 위성을 찾은 다음, 장치에 정보를 다시 보고한다). 일부 GPS는 GPS 수신기가 12 또는 20채널의 데이터를 수신할 수 있다면 매우 정확한 수정을 얻기 위해 12에서 20개의 위성을 사용할 수 있다. 많은 간단한 장치들은 단지 몇 개의 위성을 사용할 것이다.

 

로거 앱은 위도/경도 위치 데이터를 캡처하고 GPS 위성 수정의 신뢰성에 대한 수치 추정치(정확도)를 제공한다. 정확도 값이 작으면 정확도가 더 우수하다는 것을 나타낸다. 이 앱은 GPS가 위도와 경도로 해결하는 것을 보고하고 GPS가 위성 수정 사항을 업데이트하거나 장치가 건물 외부에서 내부로 이동하거나 위치를 결정하는 데 사용하는 위성 수정 사항을 잃어버릴 때 장치 정확도가 어떻게 달라질 수 있는지 보여준다.

 

아래 이미지에서 단시간(8분) 동안 캡처한 정확도 판독값의 변화를 기록한 것이다. 이 장치는 판독값을 캡처할 때 건물 내부 책상 위에 정지해 있었고 정확한 위치 정보를 제공하는 장치의 능력에 상당한 차이가 있다. 인공위성은 계속해서 지구 주위를 돈다. 장치의 GPS는 수신할 수 있는 위성의 수가 줄어들면 정확도가 떨어짅다. GPS가 더 많은 위성을 수신함에 따라 정확도는 일반적으로 증가한다. MIT 앱인벤터는 장치의 GPS 수신기가 정확성을 보고할 수 있는 기능(후술하는 위치 센서의 많은 속성 중 하나)을 가지고 있다면 모든 수정의 정확성을 보고할 수 있다. GPS는 가능한 한 많은 위성의 정보를 사용하여 언제든지 가능한 한 정확한 정보를 제공하도록 설계되었습니다. 아래는 정확도가 왜 중요한지, 무엇이 이를 요동치게 하는지, 그리고 개발자가 '의심스러운' 위치 데이터의 보고를 피함으로써 앱 사용자에게 미치는 영향을 최소화하기 위해 무엇을 할 수 있는지에 대한 논의이다.

 

앱인벤터 GPS Accuracy Logger 예제 화면

 

위성들은 GPS에도 사용되는 해양 전자 장치와의 통신을 위한 표준인 NMEA 0183 포맷을 사용하여 정보를 전송한다. NMEA 데이터 스트림은 인공위성에서 텍스트 형식으로 전송되는 많은 데이터를 컴파일하는 것이다. MIT 앱인벤터는 위성에서 브로드캐스트되는 데이터 스트림에서 사용할 수 있는 모든 정보를 해석할 수 없다. 위치 센서 구성 요소의 제한에도 불구하고 AI2는 장치에서 위치 정보를 가져오는 데 필요한 기본 기능을 제공한다.

 

 

자, 이제 시작해보자...

 

GPS 정확도 기록 앱 디자인

GPS 정확도 기록 앱의 디자인은 조금 복잡하지만, 하나씩 컴포넌트를 쌓아가며 디자인을 해보자.

스마트폰의 현재 GPS 위도값을 표시하기 위해 수평배치에 레이블 컴포넌트 2개를 사용한다.

스마트폰의 현재 GPS 경도값을 표시하기 위해 수평배치에 레이블 컴포넌트 2개를 사용한다.

GPS의 정확도를 미터 단위로 표시하기 위해 수평배치와 레이블 컴포넌트 3개를 사용한다.

Warning문구를 표시하기 위해 레이블 컴포넌트를 사용한다.

데이터 헤더를 표시하기 위해 레이블 컴포넌트를 사용한다.

데이터 값을 표시하기 위해 레이블 컴포넌트를 사용한다.

앱인벤터 GPS 정확도 기록 앱 디자인 화면

 

GPS 정확도 기록 앱 기본 설계

스마트폰의 위치에 따라 위도와 경도가 변경이 되고, 스마트폰의 현재 GPS로부터 수신되는 데이터의 정확도를 측정하는 앱이다. 경우에 따라서 수신되는 GPS의 개수가 변경될 수 있고, 이에 따라 GPS 수신 정확도가 달라질 수 있다. 또한 건물 내로 들어가게 되면 정확도가 달라질 수 있다.

 

GPS 정확도 기록 앱을 제작하는 데 사용한 컴포넌트는 레이블 컴포넌트 10개, 수평배치 컴포넌트 3개, 위치센서 컴포넌트, 시계 컴포넌트이다.

각가의 컴포넌트의 설정값과 해당 기능에 대해서 살펴보자

 

GPS 정확도 기록 앱 컴포넌트

앱인벤터 구성 요소는 디자이너 창의 왼쪽 팔레트 제목에 있다. 컴포넌트는 안드로이드 폰이나 아이폰에서 앱을 만들 때 사용하는 기본 요소이다. 화면에 버튼과 레이블 컴포넌트를 활용하여 화면을 구성하고 앱을 만들려고 한다.

 

컴포넌트 리스트

. 레이블 컴포넌트 2개와 수평배치 : 위도값 표시

  - 레이블 컴포넌트 : 텍스트 ("위도 : ")

  - 레이블 컴포넌트 : 텍스트 ("none")

  - 수평배치 컴포넌트 : 레이블2개를 수평배치한다.

. 레이블 컴포넌트 2개와 수평배치 : 경도값 표시

  - 레이블 컴포넌트 : 텍스트 ("경도 : ")

  - 레이블 컴포넌트 : 텍스트 ("none")

  - 수평배치 컴포넌트 : 레이블2개를 수평배치한다.

. 레이블 컴포넌트 3개와 수평배치 : 정확도값 표시

  - 레이블 컴포넌트 : 텍스트 ("정확도 : ")

  - 레이블 컴포넌트 : 텍스트 ("정확도")

  - 레이블 컴포넌트 : 텍스트 ("+/- meters")

  - 수평배치 컴포넌트 : 레이블3개를 수평배치한다.

. 레이블 컴포넌트 : 경고문구 표시

  - 텍스트(*** <경고> 스마트폰의 GPS를 설정하세요.  모든 스마트폰이 GPS 정확도를 표시하지 않을 수도 있습니다. ***)

. 레이블 컴포넌트 : 데이터헤더 표시

  - 텍스트(      시간        +/-M      위도     경도   )

. 레이블 컴포넌트 : 데이터헤더 표시

  - 텍스트(Data)

. 위치센서 컴포넌트

  - 위도, 경도 등의 위치값을 수신한다.

. 위치센서 컴포넌트

  - 위도, 경도 등의 위치값을 수신한다.

. 시계 컴포넌트

  - 주기적으로 위치센서를 통해 위도와 경도 및 정확독값을 읽기 위해 타이머를 작동한다.

 

아래 그림은 앱이벤터로 작성한 GPS 정확도 기록 앱의 디자인과 사용된 컴포넌트이다

앱인벤터 GPS 정확도 기록 앱 컴포넌트

 

 

레이블 컴포넌트 설정값 설정하기

레이블에 초기값은 '위도'를 설정한다.

위도값을 표시하기 위해 사용자에게 위도값임을 알려주기 위해 표시한다.

 

초기값

텍스트  : 위도

 

레이블 컴포넌트 설정값 설정하기

레이블에 초기값은 'none'를 설정한다.

위도값을 표시하기 위해 사용자에게 위도값임을 알려주기 위해 표시한다.

 

초기값

텍스트  : none

 

수평배치 컴포넌트 설정값 설정하기

레이블 2개를 수평 배치하기 위해 사용한다.

수평정렬 : 가운데

수직정렬 : 가운데

너비 : 부모 요소에 맞추기

 

수평배치에 대해 더 자세히 알고 싶으면 아래 글을 참고바란다.

레이아웃-수평배치/수직배치 컴포넌트

 

레이아웃-수평배치/수직배치 컴포넌트

레이아웃-수평배치/수직배치 컴포넌트 앱인벤터의 컴포넌트들을 이해와 실제 예제를 통해 실습을 통해 모바일 앱 개발에 활용도를 높이고자 한다. 이번 시간에는 레이아웃에서 수평배치/수직

flycoding.tistory.com

 

레이블 컴포넌트 설정값 설정하기

레이블에 초기값은 '경도'를 설정한다.

경도값을 표시하기 위해 사용자에게 경도값임을 알려주기 위해 표시한다.

 

초기값

텍스트  : 경도

 

레이블 컴포넌트 설정값 설정하기

레이블에 초기값은 'none'를 설정한다.

경도값을 표시하기 위해 사용자에게 경도값임을 알려주기 위해 표시한다.

 

초기값

텍스트  : none

 

수평배치 컴포넌트 설정값 설정하기

레이블 2개를 수평 배치하기 위해 사용한다.

수평정렬 : 가운데

수직정렬 : 가운데

너비 : 부모 요소에 맞추기

 

레이블 컴포넌트 설정값 설정하기

레이블에 초기값은 '정확도'를 설정한다.

정확도값을 표시하기 위해 사용자에게 정확도값임을 알려주기 위해 표시한다.

 

초기값

텍스트  : 정확도

 

레이블 컴포넌트 설정값 설정하기

레이블에 초기값은 '정확도'를 설정한다.

정확도값을 표시한다.

 

초기값

텍스트  : 정확도

  - 앱이 실행이 되어 정확도값이 변경이 되면 수치값으로(위치센서의 정확도값) 변경될 것이다.

 

수평배치 컴포넌트 설정값 설정하기

레이블 3개를 수평 배치하기 위해 사용한다.

수평정렬 : 가운데

수직정렬 : 가운데

너비 : 부모 요소에 맞추기

 

레이블 컴포넌트 설정값 설정하기

레이블에 경고문구를 표시한다.

 

초기값

텍스트  : *** <경고> 스마트폰의 GPS를 설정하세요.  모든 스마트폰이 GPS 정확도를 표시하지 않을 수도 있습니다. ***

 

레이블 컴포넌트 설정값 설정하기

레이블에 데이터헤더 필드명을 표시한다.

시간, meter, 위도, 경도 값임을 표시한다.

 

초기값

텍스트  :       시간        +/-M      위도     경도   

텍스트색상 : 파랑색

 

레이블 컴포넌트 설정값 설정하기

레이블에 데이터값을 표시한다.

시간, meter, 위도, 경도 값을 표시한다.

 

초기값

텍스트  :       시간        +/-M      위도     경도   

 

위치센서 컴포넌트 설정값 설정하기

스마트폰의 현재 위도, 경도, 정확도값을 측정한다.

거리간격 : 0

활성화 : 참값

시간간격 : 60,000

 

시계 컴포넌트 설정값 설정하기

타이머를 동작시켜 주기적으로 위치센서로부터 위도, 경도, 정확도값을 측정하기 위해 사용한다.

초기값

타이머항상작동 : 참값

타이머활성화여부 : 참값

타이머간격 : 1000

 

설계 아이디어

GPS 정확도 기록 앱은 위치에 따라 시간에 따라 GPS 수신 정확도가 달라질 수 있다. 정확도를 기록하여 위치에 따라 GPS수신된 위도, 경도 정확도값을 기록하는 앱이다. 위치, 경도, 정확도값을 측정하기 위해 위치센서를 사용하였고, 주기적으로 측정하기 위해 시계 컴포넌트를 사용하였다.

위치센서 컴포넌트 특성상, 위치가 변경되었을 때와 시간 타이머가 작동하여 현재의 정확도값을 분석해서 기록해 볼 것이다.

코딩블럭

블록 코딩은 내가 하고자 하는 내용을 문장으로 만들어 보라. 그것을 그대로 코딩하면 된다.

 

우리가 무엇을 할 것인지 생각해보라.

 

 

전역변수 : 

LS_Accuracy : 정확도값을 저장한다.(위치센서로부터 측정한 값을 저장한다.)

 

* 위치가변경되었을경우

위치센서 컴포넌트는 스마트폰 기기의 위치가 변경되었을때를 감지하여 해당 블록에 이벤트를 발생한다.

인자값으로 위도, 경도, 고도, 속도 값을 전달한다.

GPS 정확도 기록 앱에서는 위도와 경도값을 기록할 것이다.

LatitudeValue 레이블의 텍스트에 위도값을 저장한다.

LangitudeValue 레이블의 텍스트에 경도값을 저장한다.

앱인벤터 GPS 정확도 기록 앱 위치가변경되었을때 블럭

 

* 타이머가작동할때

시계 컴포넌트는 주기적으로 호출되는 타이머 서비스를 제공한다. 현재는 1초마다 타이머가 작동한다.

1초마다 위도, 경도값을 측정하여 GPS 정확도 기록 앱 화면에 표시할 것이다

만약 위치센서의 정확도 <= 10
    AccuracyLabel의 텍스트 색상 : 검정색
아니면
    AccuracyLabel의 텍스트 색상 : 빨강색
AccuracyLabel의 텍스트 <- 위치센서의 정확도를 저장한다.
만약 위치센서 정확도와 전역변수 LS_Accuracy변수에 저장된 값이 다르다면
    DataLabel텍스트에 시간, 정확도, 위도, 경도, 텍스트를 합쳐서 저장한다.

LS_Accuracy 변수에 위치센서 정확도값을 저장한다.

앱인벤터 GPS 정확도 기록 앱 타이머가작동할때 블록

 

 

지금까지 'GPS 정확도측정' 앱을 작성하였다. 컴포넌트는 최소한의 것으로 사용하여 작성하였다. 기본으로 사용하는 레이블과 버튼을 기본으로 하여 위치센서 컴포넌트를 통해 사용자의 GPS 위치정보를 스마트폰 화면에 표시하는 앱을 작성하여 보았다. 또한 시간 컴포넌트를 활용하여 주기적으로 위치센서 정보값을 측정하고 화면에 출력하는 기본 패턴 앱을 활용하였다. 자주 사용하는 프로그램 패턴이므로 잘 익혀서 자기만의 것으로 만들 것을 추천한다.

 

눈으로 보는 것과 직접 실행하며 하는 것은 완전히 달라요.

간단하지만 직접 해보면 이해하고 자신감이 생길거에요...

 

Just Do It!!!

Just Drag&Drop It!!!

 

 

감사합니다.

 

반응형

댓글