티스토리 뷰

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
링크
«   2024/05   »
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 31
글 보관함