이제 최적화를 해줄 차례다.
내가 해본 바로는 최적화에 가장 좋은 것은 Harry's Laptimer 인 것 같다.
https://play.google.com/store/apps/details?id=com.harrys.tripmaster
그런데 GPS 부분만 따로 잘라서 무료로 뿌리기 때문에 굳이 살 필요는 없다.
내가 써본 바로는 아이폰에서는 어떨지 모르겠으나 안드로이드에서는 강제 종료되는 등 문제가 있다. 그리고 너무 무겁고 센서를 찾는데도 너무 오래 걸린다.
Part. 2에서 말했고 여기서 다시 말하지만 Bluetooth모듈이나 USB2UART 모듈이 동시에 꽂혀있으면 UART 명령어가 작동을 안 한다. 저것 때문에 블루투스로 세팅을 할 수가 없어 추후에 USB2UART 모듈을 빼고 USB디렉트 연결로 만들고 USB에서는 전원만 뽑아 올 생각이다. 처음엔 USB로도 UART 만지고 Bluetooth로도 UART 만질 생각이 었는데 설계 미스다.
블루투스 SPP를 이용하여 GPS에 Hex 명령을 보내려면
https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal
이 앱을 설치해 주면 된다.
하지만 나는 블루투스로 세팅을 못하므로
https://play.google.com/store/apps/details?id=de.kai_morich.serial_usb_terminal
이 앱을 설치해주고 OTG로 폰 USB 포트에 GPS를 꽂고 실행을 시켰다.
이렇게 NMEA 값들이 엄청나게 빠르게 전송이 된다.
이제 Harry's Laptimer를 실행시켜보자.
Harry's Laptimer의 Sensors에 GPS를 등록하면 이렇게 접속이 된다. 그런데 해리스 랩 타이머가 GPS를 찾는데 미친 듯이 오래 걸린다. 진짜 졸라 느리다. RaceChrono의 Start 버튼만 누르면 연결되는 그 빠르기와 차이가 있다.
연결된 상태에서 GPS이름을 누르면 현재 활성화된 NMEA Sentences를 볼 수 있다. 현재 GBS, RMC, GGA, GSV, GSA가 살아있다. RaceChrono는 GBS를 지원하지 않지만 Harry's Laptimer는 GBS를 지원한다. Harry's Laptimer에 GBS를 활성화하면 정확도 계산이 좀 더 정밀해진다. 실제 정확도가 좋아지는 건 아니고 Harry's Laptimer상에 나오는 정확도만 정밀해진다는 것이다. 여하튼 나는 범용 GPS를 만들고 싶었으므로 GBS까지 살려줬다.
그런데 문제가 발생했다. 저기 Device에 빨간불이 뜨는 게 제대로 수신이 안되고 있다는 소리다
이게 뭐가 문제인지 찾아보니 GPS가 보내는 메시지의 양이 Bluetooth의 대역폭을 초과했다는 뜻이란다...
Harry's Laptimer에서는 그런 경우를 대비하여 Binary NMEA도 지원한다고는 하는데 뭐 개발자 프로그램에 들어가야 한단다. 아....
20hz로 낮춰봤으나 실패 GBS를 꺼봤으나 실패
GBS 켜고 10hz로 낮춰도 보고 그냥 10hz로도 낮춰보았다
아아.... 안된다...
이게 좀 이상했다. 그 10hz 랩 타이머 만드는 놈들은 잘만 10hz로 하던데 나는 왜 10hz가 안 되는 거냐...
그러다 Harry's Laptimer 포럼에서 원인을 찾았다.
// ***************** Current sentence / value matrix *****************
//
// VB* RMC GGA GSA GSV VTG ZDA GBS PWR
// ------------------------------------------------------------
//
// # satellites X X
// tracked satellite ids X
// satellites almanac X
// differential X X
// positioning X X
// validity X X X
// utc date X X X
// utc time X X X X X
// latitude X X X
// longitude X X X
// speed X X X
// heading X X X
// height X X
// battery X X
// HDOP X X
// GBS accuracy X
// ...
//
// # sentences / fix 1 1 1 1-3 1-8
//
// ********************* valid combinations *************************
//
// VB* missing satellite almanac but complete otherwise
// RMC+GGA+GSA+GSV complete
// GGA+GSA+GSV+ZDA complete
// GGA+GSA+GSV complete (date reproduced)
//
// GBS optional for better accuracy calculation
// PWR optional, support for additional Dual XGPS firmware v2 sentence
이런 거였다. 저기 VB*로 표시된 게 Vbox 프로토콜이다.
Vbox 프로토콜의 경우에는 한 줄 안에 GSV메시지만 없고 모든 메시지가 들어있어 Hz당 한 줄만 전송하면 되지만
우리의 NMEA 메시지의 경우에는 RMC 1줄 GGA 1줄 GSA 3줄 GSV 8줄을 전송해야 하고 거기다 중복된 값이 많아 대역폭 낭비가 오진다는 것이다...
비싼 GPS랩 타이머의 경우에는 자체 프로토콜을 사용하는 것이었다. 쌩고생 안 하려면 사서 쓰세요.
CAN-Bus 디코딩할 때부터 사서 쓰는 게 나을 거 같다는 생각은 했지만 이때 좀 많이 멘탈 나갔었다.
솔직히 이때는 포기하고 싶었다.
레이스크로노에서도 RC2/RC3 프로토콜을 공개하고는 있지만 어떻게 NMEA Output을 해당 프로토콜로 변경해야하는지를 모르겠다는게 가장 큰 문제였다. 아니 이거 하려면 stm32 같은 프로세서 하나 사와서 NMEA output을 받아서 리프로세싱 해야하는거 아닌가???
일단은 돈 쓴 게 아까워서라도 5hz로 낮춰보았더니 잘 작동했다. satellite in view도 16개 이상 뜨고 Tracked는 12개까지 떴다.
안드로이드에서 세팅을 쉽게 바꾸려면 USB Serial Terminal 앱에서 세팅에서 Send탭에 Edit Mode를 Hex로 바꾸고 저번 포스팅에서 같이 알아보았던 Hex 명령어를 전송해주면 된다. 자주 쓰는 명령어는 밑에 매크로 버튼을 길게 눌러서 편집하여 Hex 명령어를 붙여 넣어 세팅이 필요할 때마다 눌러주면 된다.
여하든 5Hz에서 잘 작동된 것에서 약간의 희망을 얻고 정신승리를 시작했다
"VB 프로토콜도 GSV는 지원 안 하잖아. 그럼 그냥 GSV를 빼버려도 괜찮잖아?"
나는 VBox보다만 나으면 된다.
결론적으로 25hz에서 GGA RMC GSA GBS를 모두 살리는 건 불가능했고 20hz에서는 가능했다.
20hz에서는 GGA RMC GSA GBS를 살리고 안정적으로 구동이 되는 걸 확인했다 빨간불도 들어오지 않았다.
그리고 GBS를 적용했을 때 반경 0.2m 정확도를 얻을 수 있었다.
RaceChrono에 따르면
NMEA 0183. Sentences GGA+RMC or RMC+VTG+ZDA required, GSV+GSA optional
이라고 한다.
즉 GSA는 없어도 된다는 것
GGA RMC GBS만 살리고 25Hz로 했을 때는 RaceChrono 및 Harry's Laptimer에서 25hz로 안정적인 사용이 가능했다.
혹시 RaceChrono 및 Harry's Laptimer에서 사용하고자 한다면 GGA RMC GBS만 살리고 25hz로 사용하면 된다.
25hz로 사용하는 게 20hz로 사용하는 것보다 초의 소수점 두 번째 정확도가 더 높다.
하지만 나는 Vbox보다 나은 GPS가 목표였으므로 20hz에 GSA까지 포함해서 GGA RMC GSA GBS로 사용하려고 한다.
블루투스 모듈을 비싼 걸 쓰면 저 대역폭을 다 소화할 수 있지 않을까 싶어서 지금도 블루투스 모듈을 찾는 중이지만 일단은 케이스만 만들어 주고 여기쯤에서 마무리하는 게 좋을 것 같다.
내 Bluetooth 모듈은 Bluetooh SPP 및 BLE를 동시에 지원하는데 BLE도 적용해보았으나 BLE에서는 대역폭의 문제로 위와 같이 GGA RMC GSA GBS를 모두 살릴 수는 없고 GGA RMC GBS만 살리면 가능했다. Harry's Laptimer에서 BLE GPS를 사용하기 위해서는 UUID를 알아야 하는데
https://play.google.com/store/apps/details?id=com.punchthrough.lightblueexplorer
그걸 알기 위한 툴은 LightBlue라는 앱을 추천한다.
먼저 LightBlue라는 앱을 실행시키면 현재 존재하는 BLE 디바이스가 뜬다
거기서 GPS의 BLE를 누르고 접속한다.
접속하면 여러 정보가 뜰 텐데
거기서 스크롤을 내리다 보면 희한한 숫자가 나와있는 창이 뜬다
저기서 화살표를 하나씩 눌러 들어가서
주황색 네모가 되어있는 곳을 UTF-8 String으로 바꿔주고
빨간색 네모를 눌렀을 때 아까 우리가 보았던 NMEA Sentences가 나오는 것이 우리가 찾는 UUID이다.
위에 있는 초록색 및 보라색 네모로 표시한 저 id를 복사한다. 길게 누르면 복사가 된다.
Harry's Laptimer로 돌아와서 Setting에서 맨 밑으로 내리면 Expert Setting이 있다 우리는 Expert니까 눌러서 들어가 준다.
Expert Setting에서 내리다 보면 Accessory Tweaks에 Use Bluetooth LE Sensors가 있다 체크해준다.
그리고 Custom BTLE GPS Adaptor 칸이 우리가 입력해야 할 UUID를 넣는 곳이다.
아까 초록색 네모로 표시한 Service UUID 및 보라색 네모로 표시한 Characteristic UUID를 넣어준다.
그렇게 설정하고 오면 Custom BTLE GPS로 엄청나게 빠르게 연결되며 사용이 가능하다.
'GPS Laptimer' 카테고리의 다른 글
RaceChrono와 상용 GPS Laptimer간의 오차에 관한 고찰 Part. 2 (0) | 2021.06.23 |
---|---|
RaceChrono와 상용 GPS Laptimer간의 오차에 관한 고찰 (0) | 2021.06.22 |
RaceChrono용 블루투스 25hz GPS 만들기 Part .4 - 케이스 (0) | 2021.06.13 |
RaceChrono용 블루투스 25hz GPS 만들기 Part .2 (0) | 2021.06.10 |
RaceChrono용 블루투스 25hz GPS 만들기 Part .1 (0) | 2021.06.09 |
25hz GPS 랩타이머 만들기 PROJECT (0) | 2021.05.31 |