ros2를 조금 공부하고 나서 Slam을 하려다가, 라이다의 개념이 잘 안 잡혀서, 프레임워크 없이 그냥 Python pyserial만으로 접근해보다가, 듕국 애들 진짜 영어 좀 잘하지~ 하는 원망이 터져 나온다. 영어 문법 안 맞는 거야 추측하면 되는데, 아예 빼먹거나 부호를 잘 못 적거나, 그림을 잘 못 그려놓거나 한 걸 보면 땡콩 한대 때리고 싶다.
문제의 원인은 YDLidar G2 develment Manual... X4 메뉴얼과 일부 비슷한 면이 있는데 제일 다른 점은 포인트 한 점을 저장하는 바이트가 G2는 3바이트 (돈 값하네. 발광 intensity 도 된다능...)이고, X4는 2바이트임(intensity가 안 됨). 20만원짜리와 10만원짜리 차이를 보여주네. G2는 실시간으로 프리퀀시 변경도 된다능...ㅎㅎ 생긴 것도 늠름하게 G2가 잘 생겼다는...장군 모습... X2는 말단 장수 느낌...(G2와 X2를 가지고 있고, X4는 없음. X4는 메뉴얼만 참고함.)
picamera2 개발 메뉴얼만 해도 수십 페이지인데, 라이다 개발 메뉴얼이 꼴랑 10페이지라...ㅎ
1) 제일 눈에 뜨는 메뉴얼 오류는... Distance analysis 에서
𝐷𝑖𝑠𝑡𝑎𝑛𝑐𝑒 = 𝑑𝑒𝑐(𝐿𝑠ℎ𝑖𝑓𝑡𝑏𝑖𝑡(0𝑥6𝐹, 6)) + 𝑑𝑒𝑐(𝑅𝑠ℎ𝑖𝑓𝑡𝑏𝑖𝑡(0𝑥𝐸5,2)) = 7161𝑚
중간에 +가 아니고 비트 연산인 '|'이다. 젠장. 비트 연산하면서 가운데에 + 쓰는 것을 잘 본 못지라, 뭐지 싶었는데, 결국 OR 연산이었던 것이다.
2-1) Second-level analysis: Angle correction formula:
tand−1 는 math.atan 함수를 사용하면 된다.(math.atan(분자/분모) 하는 식으로) math.atan2()함수를 사용하려면 분자와 분모를 분리해서, 가령 math.atan2(분자, 분모) 식으로 사용하면 된다.
2-2) AngCorrect1 = − 6.7622° , AngCorrect𝐿𝑆𝑁 = −7.8374°
예제에서 이 값이 나와야 하는데 값이 너무 작게 나오지 않나? 라디안을 degree로 바꿔주어야 한다. 디그리를 라디안으로 바꾸는 math.radians()와, 라디안을 디그리로 바꾸는 math.degrees()가 있으니, 굳이 * 180/math.pi 나 * math.pi/180 (곱) 해주지 않아도 된다. * math.pi/180 하는 식으로 pi가 위로 올라가면 라디안으로 변환하는 것이고, pi가 분모에 있으면 degree로 변환하는 것이라고 나도 기억을 해야징...
3) check code (cs) 의 망발
패킷 데이터가 올바른지 체크하기 위해서는 cs 값을 불러와서, 그외 나머지 값들을 XOR 연산해서 그 값이 CS와 동일한지 체크하면 된다. 얘가 리틀 인디엔 방식이라, 일일이 뒷 바이트를 8번 쉬프트해서 앞 바이트와 OR 연산을 해야 한다는 점이다.
가령 CT | ( LSN << 8) 을 하고 나서 얘를 기존 값과 XOR 연산을 하면 되는데, 문제는 ...
왼쪽 그림이 G2 메뉴얼 그림이고, 오른쪽이 X4다.
S1(1st) 은 그냥 사용해도 된다. 어차피 ' 0x00 << 8 | S1(1st)'이나 'S1(1st)'값이 같기 때문이다. 문제는 두번째인데, 오른쪽 그림(X4용)을 보면 자연스레 S2(2nd) | S2(3rd) << 8 해서 이 값을 사용할 것 같은데, (실제로 그렇게 사용하면 된다. 문제는 G2 메뉴얼이 모호해서 따라했다가 1시간을 헤맸다), G2 메뉴얼 그림을 보면,
S1(2nd) << 8 | S1(3rd) 하는 식으로 연산을 하게 된다는 점이다. 다른 값들은 모두 이와 반대다. 가령,
FSA1 | FSA2 << 8 이고 LSA1 | LSA2 << 8식으로 2바이트 값을 잡게 된다. 즉, G2 그림에서 S2(2nd)와 S2(3rd)의 자리가 뒤바뀌어야 한다는 점이다. 이렇게 하니 check code가 모두 들어맞았다. 만세!! XOR 연산은 '^'임. 교환법칙이 성립하므로 순서는 상관없음.
즉, cs == PH ^ FSA ^ S1 ^ S2 ... ^ (CT << 8 | LSN) ^ LSA 이 참이어야 한다는 점이다.
코드는 완료하면 올리는 걸로...
X2보다는 X4가 좋아보인다. X4보다는 G2가 좋아보이고...