티스토리 뷰
2017/05/23 - [전자/Raspberry] - 라즈베리에서의 GPS 이용
위 글의 경우에는 ascii 코드 형태로 출력되는 것이라 parsing하는게 쉬웠다.
고가의 GPS들은 IMU와 fusion되어있고 10~100Hz로 데이터를 출력하기때문에
대부분 바이너리 형태의 출력을 지원한다.
한달전쯤에 VN-200이라는 vectornav사의 GPS를 이용한 코드 작성을 의뢰받았다.
이런 때 가장 기본적인 방법은 기존 라이브러리를 이용하는 것이다.
다만 이 클라이언트의 경우 Visual studio 2015를 써서 코딩해달라고 의뢰를 했기때문에
기존 라이브러리를 포팅하기가 불편했다.(vs에는 표준화된 시리얼 라이브러리가 없어서)
어차피 싼 단가에 받은일이고 해서 GPS 설정은 sensor explorer라는 전용 프로그램으로 직접 했다.
바이너리로된 GPS값을 수신하는건 정말 간단하다.
보통 바이너리 형태의 데이터는 시작문자가 존재하고 바이너리의 길이가 정해져있거나 특정영역에
길이정보가 저장되어있다.
if (buffercnt<72)
{
if (Buffer[0] == 0xFA)
{
buffercnt = buffercnt + 1;
}
else
{
buffercnt = 0;
}
}
else if (buffercnt==72)
{
getBuffer();
buffercnt = 0;
}
이런식으로 원하는 형태로 일단 msg를 자른다.
void GCS_MAIN::Read(uint8_t& i, uint8_t& c)
{
i = Buffer[c];
c = c + 1;
}
void GCS_MAIN::Read2(uint16_t& i, uint8_t& c)
{
memcpy(&i, &Buffer[c], 2);
c = c + 2;
}
void GCS_MAIN::Read4(float& i, uint8_t& c)
{
memcpy(&i, &Buffer[c], 4);
c = c + 4;
}
void GCS_MAIN::Read8(double& i, uint8_t& c)
{
memcpy(&i, &Buffer[c], 8);
c = c + 8;
}
void GCS_MAIN::Read8(uint64_t& i, uint8_t& c)
{
memcpy(&i, &Buffer[c], 8);
c = c + 8;
}
사실 이경우에 바이너리 msg를 가장 빠르게 원하는 데이터로 바꾸는 방법은
struct를 만든 후 캐스팅하는 것이다.
이 방법은 빠르고 간편하지만 바람직한 방법은 아니다.
정해진 바이트만큼 읽어오고 counter를 증가시키는 단순한 형태로 msg를 읽어오는 함수를 만들었다.
Read라는 한 함수로 오버로딩해도 되지만 클라이언트가 초보자시라
그냥 함수를 여러개 만들었다.
uint8_t temp = 0;
temp = temp + 6;
Read4(yaw, temp);
Read4(pitch, temp);
Read4(roll, temp);
Read(year8, temp);
year = year8 + 2000;
Read(mon, temp);
Read(day, temp);
Read(hour, temp);
hour = (hour + 9)%24;
Read(min, temp);
Read(sec, temp);
Read2(ms, temp);
Read8(tow, temp);
Read(nsat, temp);
Read8(lat, temp);
Read8(lon, temp);
Read8(alt, temp);
Read4(velu, temp);
Read4(velv, temp);
Read4(velw, temp);
Read2(cksum, temp);
Update();
그 이후엔 단순하다. sensor explorer에서 설정한대로 값을 읽어오면 된다.
마지막의 update 함수는 단순 출력함수이다.
이렇게 하면 값이 잘 읽어와진다.
- Total
- Today
- Yesterday
- 통신
- vectornav
- 카메라
- 벽돌복구
- pi
- vn-200
- C++
- Raspberry Pi
- GPS
- 모듈
- 개발
- 비전
- 소나 센서
- NMEA
- ti
- opencv
- RaspberryPi
- WiFi
- dsp
- RTSP
- 라즈베리파이
- 무선
- 라즈베리
- Raspberry
- G2
- 영화
- 라즈베리 파이
- 파이
- 알레한드로
- 복구
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |