차량이나 로봇이 실외에서 주행할 때 위치를 파악하는 가장 기본적인 센서가 GPS 수신기가 됩니다. GPS의 위치 정밀도 만으로는 차량의 정밀한 위치 파악과 주행을 보장하기는 어렵지만, 그래도 10m정도 오차 범위의 대략적인 위치를 알 수 있기때문에 로봇의 위치인식 센서로 종종 사용되곤 합니다.
여기서는 GPS 수신기로부터 문자열을 읽어 NMEA 파서로 필요한 데이터를 추출하고, 위도, 경도, 고도 데이터로부터 TM(Transverse Mercator) 좌표로 변환하여 지도상의 위치로 표시하는 과정을 수행하는 예제 프로그램에 대하여 소개합니다.
GPS 수신기로는 (주)아센코리아의 ASCEN GPS680 모델을 사용하였습니다. 이 모델은 PC와 USB로 연결되는데, 가상의 시리얼(COM) 포트로 통신이 가능합니다. 그래서 프로그램에서는 COM 포트를 열어서 주기적으로 데이터를 읽으면 됩니다.
예제 프로젝트의 GpsReceiverDlg.cpp 파일에 다음과 같이 COM 포트를 설정하는 부분이 있습니다. GPS를 연결하면 COM 포트는 바뀔 수 있기때문에 다음 코드에서 붉은색 글자 부분을 수정해 주어야 합니다.
_rc.Open ("\\\\.\\COM7", CBR_115200, 8, ONESTOPBIT, NOPARITY);
_rc.SetTimeout (10, 10, 10);
대부분의 GPS에서 읽은 데이터는 NMEA 규격으로 엔코딩 되어있습니다. NMEA 규격은 텍스트 기반으로 복잡하지 않기때문에 간단히 파싱할 수 있습니다. (참조: http://ko.wikipedia.org/wiki/NMEA)
예제 프로젝트에서 NMEA 파서는 NMEAParser.h와 NMEAParser.cpp 파일에 구현되어 있습니다.
이제 위도, 경고, 고도 값을 읽어왔기때문에, 실제로 x, y 평면 좌표계 상에서 그려진 지도에서 사용하려면 TM 좌표변환 과정이 필요합니다. 예제 프로젝트에서는 WGS84_TM.cpp 파일에 구현되어 있습니다. 변환 과정에 대한 자세한 수식은 다음 문서를 참조하시기 바랍니다.
VC++ 2008로 작성된 예제 프로젝트: