첫 번째 미션, 로봇의 위치 추정 : GPS & RTK
회사에서 출장을 나가는 길에 같이 개발하는 사수님과 이런 종류의 얘기를 나눈 적이 있습니다.
"지금은 스마트폰이나 자동차에는 GPS 기능이 잘 되어 있지만,
조선시대에 한양으로 과거 시험을 보러 오는 사람들은 어떻게 길을 찾았을까요?"
검색 없이 일단 고민을 하면서 나왔던 아이디어들에는 다음과 같은 방식이 있었습니다.
1. 해가 뜨고 지는 방향을 기준으로 하여 북쪽을 향해 이동한다.
2. 밤에는 별자리의 움직임을 기준으로 방향을 정한다. (별자리 사전 지식 필요)
3. 이정표를 보고 움직인다.
4. 중간중간에 주막을 찾아서 길을 물어보며 이동한다.
5. 과거 시험을 이전에 응시한 적 있는 사람을 따라간다. (지금 글을 작성하면서 떠오른 생각)
특히 지금 당장 모든 전자기기와 통신 수단을 뺏겨 마치 조선시대와 같은 상황이라면,
어떻게 출장지에서 회사로 다시 돌아갈 수 있을지 상상했으나,
이내 포기하고 GPS가 소중한 기술이라는 것을 느꼈습니다.
자동차 내비게이션의 위치를 잡을 수 있는 이유는 GPS 때문인 것은 많이 알려진 사실입니다.
아주 간단하게 원리를 살펴보면 최소 4개의 인공위성에서부터 정보를 받아
거리를 계산하고 시간 오차를 보정하여 위치를 잡는다고 합니다.
일련의 계산 과정은 GPS 모듈이 알아서 처리해주고 있기 때문에 어려움 없이 사용할 수 있습니다.
실제로 GPS를 사용한 결과 위성은 4개보다 훨씬 많게 잡혔고 (최소 8개 이상은 잡혔습니다.)
로봇의 위치를 정의하는 작업이 쉽게 마무리될 줄 알았습니다.
하지만, 로봇을 가만히 두었는데도 로봇의 위치가 천천히 이리저리 변하는 모습이 발생했습니다.
건물 사이에서 테스트할 때는 훨씬 더 크게 오차가 발생하였습니다.
GPS의 오차가 있다는 것은 어느 정도 염두에 두고 진행하였으나, 이대로 사용하기에는 무리가 있었습니다.
우선 왜 저런 오차가 발생하는지 알기 위해서는 GPS의 원리를 조금 더 살펴볼 필요가 있습니다.
인공위성과 GPS 모듈은 전파의 방식으로 데이터를 주고받습니다.
이때 인공위성의 위치는 약 20,000km 상공에서 움직이고 있기에, 상당히 먼 거리까지 통신이 이루어집니다.
이때, GPS가 달려있는 로봇 주변의 큰 나무나 건물들과 지구의 대류권, 이온권을 통과하는 과정에서 발생하는 간섭, 지구 자기장의 간섭이 등 전파는 다양한 방해를 받게 됩니다. 그렇기 때문에 더 많은 수의 인공위성으로 위치를 보정해도, 정확도를 높이기에는 한계가 있습니다.
그 결과 일반적인 GPS의 정확도는 5~10m 정도로 형성이 되어 있는 것입니다.
- 전파의 방해를 경험해 보려면 전자레인지를 돌리고 그 앞에서 핸드폰으로 유튜브 영상을 재생해 보는 방법이 있습니다. 전자레인지의 전파가 와이파이에 간섭을 일으켜 영상을 원활하게 볼 수 없을 것입니다!
- GPS의 오차는 많이 경험해 본 적이 있을 것입니다. 핸드폰으로 지도 어플을 켜고 위치를 확인할 때 종종 건너편 길에 위치가 잡히는 경우가 해당합니다.
그렇다면 GPS 하나만으로 위치를 정확히 잡을 수 없음을 알았으니, 오차를 보정할 방법을 찾아야 합니다.
GPS의 위치를 보정하는 방법 중에 RTK(Real-time Kinematics) 방법을 이용했습니다.
RTK는 GPS 두 개를 가지고 오차를 보정하는 방식입니다. 우선 하나의 GPS는 로봇에 달려서 움직이고, 다른 하나의 GPS는 미동도 없이 고정되어 있습니다. 보통 움직이는 GPS를 로버(ROVER)라 부르고, 고정된 GPS를 베이스(BASE)라고 부릅니다. 원리를 간단히 설명하면 베이스에는 고정된 위치를 부여하고, 베이스에서 수집되는 정보를 이용해 오차를 계산하고, 해당 오차를 로버에 적용하여 로버, 즉 로봇의 위치를 보정해 주는 방식입니다. 어떻게 설정하는지 조금 더 자세히 설명하면 다음과 같습니다.
먼저 베이스를 로봇이 움직이는 공간 근처(최대 10km 반경 이내)에 위치시킵니다. 베이스의 GPS에서 약 24시간 정도 GPS의 raw data를 수집하고, 해당 데이터를 PPP기법을 통해 정밀한 위치를 계산합니다. (다행히도, 캐나다의 CSRS-PPP service를 이용하면 결과를 받아볼 수 있습니다. 해당 사이트에 들어가서 파일만 업로드하면 금방 메일로 결과를 보내줍니다.) 결과로 나오는 위치의 정밀도는 1cm 이내로 표현됩니다. 이후 베이스의 GPS 모드를 fixed 모드로 설정하고, 계산된 정밀한 위치 값을 입력합니다. 이렇게 베이스의 설정을 완료합니다.
다음으로 할 일은 베이스에서 로버로 오차에 해당하는 메시지를 전송하게 만들어야 합니다. 이때 메시지 전달을 도와주는 역할로 NTRIP(Networked Transport of RTCM via internet protocol)이라는 프로토콜이 있습니다. 메시지 전달 방식의 일종이며, 전달되는 과정은 NTRIP source (베이스)에서 메시지를 NTRIP server(각종 rtk 사이트)로 보내고 해당 사이트에서 NTRIP caster를 통해 계산 결과를 NTRIP client(로버)로 전달합니다. 쉽게 말해서 인터넷을 통해 중간자 역할에게 데이터를 보내주면 계산 결과를 로봇에게 전달해 주는 것입니다. 사용해 본 NTRIP server 중에서는 rtkdata.online이라는 사이트가 가장 사용하기 편했습니다. (대부분의 사이트가 적은 수의 로봇과 베이스 스테이션에 대해서는 무료로 운영하고 있습니다.)
이렇게 RTK를 적용할 수 있으나, 베이스 스테이션의 설치가 그렇게 만만한 작업은 아닙니다. 우선, 베이스의 GPS가 절대 움직이지 않으며 최대한 높은 곳에 그리고 주변에 방해를 받지 않는 곳에 위치해야 되며, 인터넷과 연결이 되어 있으며 전기를 계속 공급해 주어야 한다는 점이 있습니다. 베이스의 설치가 어렵다면 국토지리정보원에서 제공하는 기준점이 있어서 이를 이용하는 것도 방법입니다. 다만 앞에서도 언급했지만 베이스로부터 최대 10km 이내까지만 정확도 보정이 가능하다는 점에 유의해야 합니다. 또한 국가에서 운영하다 보니 서버 점검을 할 때 원활히 작동하지 않을 수 있는 위험성도 고려해야 합니다.
국토지리정보원에서 제공하는 베이스 위치 : https://www.ngii.go.kr/kor/content.do?sq=195
RTK 설정 방법은 다음 링크를 참조하여 진행할 수 있습니다.
https://learn.sparkfun.com/tutorials/how-to-build-a-diy-gnss-reference-station/all#introduction
베이스 스테이션을 만들고 위치를 보정하니 오차가 1cm 이하로 감소하였습니다! 테스트용 로봇의 크기가 대략 70cm * 50cm 정도임을 감안하면 크게 신경 쓰지 않아도 될 정도였습니다.
참고로 오차를 확인하는 방법은 GPS 데이터의 covariance 값에 루트를 씌우면 됩니다. RTK를 보정하기 전에는 covariance가 100 가까이 나왔고 (루트를 씌우면 10이며 오차가 10m), 보정 후에는 0.0001(루트를 씌우면 0.01이며 오차가 0.01m)이라는 값을 볼 수 있었습니다.
이제 실시간 위치의 정확도를 확보했으니, 다음으로 할 일은 로봇의 방향을 부여하는 것입니다.
어떻게 로봇에게 방향을 설정해 줄 수 있는지는 다음 글에서 이어가도록 하겠습니다.