본문 바로가기

Electronics

GPS 데이타로 거리및 방위 계산하는 방법


요즘 만드는 로봇이 바다에서 떠 다니는 녀석이기에 GPS데이타를 받아서 로봇의 위치도 파악하고 이동방향도 정하려고 한다.

그래서 정밀한 위치 파악을 해보려고 DGPS라는 걸 써보려고 하기도 했으나 일반 GPS기기로 힘들다는걸 알고 포기한바 있다.

그래도 요즘 나온MTK칩셋을 쓴 GPS수신기는 자기들말로는 정확도가 3m정도 된다고 하니 내가 원하는 수준은 만족한다 싶어 그대로 가기로 했다

GPS데이타는 5V짜리 시리얼 TTL신호로 출력되고 NMEA 0138인지 뭐 그런 형식의 미리 정해진 규칙대로 시간 위도 경도 속도 고도 등을 보통 1초 주기로 출력한다. 초당5번 출력이 가능한 수신기도 있다.

GPS데이타를 USB-UART 변환 케이블에 전원 접지 TX세가닥만 연결해도 데이타 윈도우즈 보조프로그램 통신 폴더에 기본으로 들어앉아 계시는 하이퍼터미널로 데이타를 볼수 있다. 

그러나 보인다고 다 이해할 수 있는 것은 아니다. 깨져보이는 것은 아닌것 같으나 그 의미는 깨질때나 안깨질때나 별 다르지 않아보인다.

인터넷에 돌아다니는GPS에 대한 자료들을 보면 GPS가 무엇을 말해주는지에 대해 자세한 설명이 있다. 왼쪽의 구글링크에보면 GPS응용 항법시스템이라는 PDF문서가 있다.

그 문서에도 두 지점간의 거리 및 상대 방위를 구할 수 있는 공식이 있으나 프로그램에 써본결과 거리는 출발점을 위도 경도 0.0으로 옮겨야만 맞고 방위는 거의 대부분의 경우에 결과가 에러로 나온다.


                                                                             요 공식 쓰지말자 --;

문서작성자가 micropilot.co.kr이라는 사이트의 소속인듯한데 그 사이트는 현재 없다. 없을만한것 같다 --;; 그 공식때문에 이삼일 개피봤다. 혹시 이 공식으로 성공한 사람이 있다면 꼭 말해주기 바란다.

이글을 쓰는 이유도 또 누군가가 그런 개고생을 하지 않도록 방지하기 위함이다.

그럼 제대로된 공식은 어디있는가?  출처는 여기고 아르뒤노를 위한 라이브러리라고 아르뒤노 포럼에 소개되었으나 현재는 와이어링에서만 돌아간다. 그 라이브러리의 소스를 보면 거리와 course라고 방위를 계산하는 함수를 찾을 수 있다.

아르뒤노와 와이어링은 오픈소스하드웨어인 마이크로컨트롤러 보드이다. 와이어링이 먼저 생겼고 아르뒤노가 그 구조를 따라서 칩만 Atmega128에서 Atmega168로 바꿔서 만들어진 것이다. 그래서 둘이 같은 언어를 쓰고 있다. 손으로 땜질하기 어려운 128대신 손으로 땜질가능한 168칩으로 바꿔서 자작파들을 배려한 보드가 아르뒤노 되겠다. 가격도 싸서 만들었다고 하는데 사실 칩가격은 별차이 없다. 공산품은 성능이나 재료비보다는 생산량이 가격을 더 좌우하기 때문이 아닐까 싶다.

아무튼 와이어링에는 시리얼 포트가 두 개라서 위에 말한 GPS라리브러리가 그 하드웨어 시리얼을 사용하기 때문에 아르뒤노에서는 프로그래밍 포트와 겹치기 때문에 쓰기가 쉽지 않다.

AFSoftsSerial이란 라이브러리를 쓰면 아르뒤노에서도 시리얼포트를 하나 더 쓸수 있는데 그 소프트웨어 시리얼에서 저 GPS라이브러리가 동작을 하지 않는다.

diydrons.com에도 롱테일 경제학의 저자인 크리스 앤더슨이 올린 간단한 무인기용 프로그램인 Arduipilot에 gps 데이타 처리를 위한 로직이 들어 있지만 그것도 써본결과 제대로 동작하지 않았다.

전체적인 구조는 arduipilot의 것을 가져다 썼지만 GPS부분은 데이타 디코딩부터 계산까지 아직은 쓸만하진 않았다.^^ 좀 더 테스트좀 해서 올려주시기 그랬어요 앤더슨 아자씨~

이번 GPS소동(?)을 계기로 오픈소스의 한계에 대해서도 그 장점 만큼 뼈저리게 실감했다. 그리고 무엇인가를 공개할때는 참으로 신중하게 해야겠다라는 생각도 하게 되었다. gps라이브러리를 올린 maarten 아자씨도 아르뒤노에서는 그 라이브러리를 시험해보지 않고 아르뒤노 포럼에 올려서 올라오는 댓글들 때문에 진땀좀 흘렸을 것이다. 스스로 너무 성급하게 올린것 같다고 했으니까 ㅎㅎ

나도 예전에 F-22 도면 올릴때도 스스로 제작해보지 않은 도면을 올려서 물의(?)를 빚은 적이 있었다. 

계산된결과를 확인하려면 국토지리정보원 자료실에서 엑셀화일을 다운받아서 비교해보기 바란다. 다만 엑셀식에 보면 지구를 어떤종류의 타원체로 볼것인지 완전한 구로 가정할 것인지를 선택하게 되어 있는데, 마틴의 GPS라이브러리는 지구를 구로 가정한 상태에서의 공식이니까 완전한 구로 선택하고 결과값을 비교해야 정확하게 맞을 것이다. 안그래도 별 차이는 안난다.

끝내기 전에 GPS좌표 데이타로 두 지점의 거리와 상대방위를 구하는 방법을 말로 좀 풀어보면,

두 좌표 지점간의 거리는 피타고라스의 정리로 간단하게 풀면되지만, 지구는 둥글어서 앞으로 앞으로 자꾸걸어나가면 다시 집으로 돌아오기때문에 그렇게 평면에서의 공식을 쓰면 오차가 생긴다. 그 오차를 용인할만한 경우라면 앤더슨아자씨 처럼 그냥 피타고라스아자씨의 공식을 써주면 된다.


하지만 앤더슨아자씨도 그냥 피타고라스의 정리를 쓸순 없었다 왜냐하면 위도가 높아질 수록 경도가 짧아 지기 때문에 보정을 해줘야 하기 때문이다. 위도 0도인 적도에서는 경도 1도가 111킬로미터 쯤 되지만, 이것이 북극에 가면 0이 된다.  이무슨 해괴한 경우인가 싶지만 지구가 정말 둥글긴 둥근가보다.

우리가 평소에 보는 넓적한 세계지도는 사실 뻥이다. 지구본을 보라 그린란드는 그렇게 크지 않다 --;  암튼 그래서 피타고라스 옹의 단순무식 공식을 또 보정 하느라고 위도 마다 경우를 나누고 보정을 하고 난리 부르스를 떠느니 깔끔쌈빡한 구면좌표계를 쓴 공식을 한 큐에 적용해서 답을 뽑아 보고 싶은게 내 심정이었다.

그래서 저 위에 문제의 마이크로파일럿제 pdf의 공식을 써봤으나 그 공식은 김구라표였던 것이었다. 내가 너무 아픈과거에 집착하나? 자꾸 그이야기로 샌다.

다시 계산법을 이야기 하자면, 구면좌표계를 쓰는것 까지는 좋은 지도에 쓰이는 위도 경도는 적도가 0도 이고 그리니치천문대를 기준으로 동경 180 서경180도로 나눠지지만 수학자 아자씨들이 만든 구면좌표계는 북극점이 0도이고 그리니치 천문대 비슷한 경도 기준점에서 위에서 볼때 고도리방향 그러니까 시계반대 방향으로 360도까지 한큐에 이어진다.


                                                                  수학에서의 구면좌표계
                                      
                                                  지도에서의 위도와 경도  (사진출처:이미지에 보시다시피)

고로 gps수신기에 수신한 데이타도 그에 맞게 if문 좀 써줘서 변환을 해줘야 한다.

그리고 또 하나, 위도 경도 데이타를 잘 보면 36.214567 이렇게 써있고 36도 21분 45초67이라고 읽는데, 원래는 분 초 단위가 모두 60진법인데 gps수신기에서나오는 데이타는 '분'만 60진법이다.  구면좌표계든 팔면좌표계든 산수에서는 60진법의 숫자는 잘 취급하지 않기 때문에 그걸 10진수로 바꿔줘야한다. 

앤더슨 아자씨의 실수하나 더, 60진법인 분을 10진법으로 변환하지 않으셨다. 코드 내용을 보면 코딩은 같이 진행하는 조르디라는 젊은이가 한 것 같은데 뭐 올리길 그 아자씨가 올렸으니 이런말 정도는 들어주셔야지^^  뭐~ 탓은 안해요. 그렇다 그거지. 오픈소스는 No Warranty이고 그거 감안해서 써야하는거 다 아니까요 ^^