센서 구동 - SICK LMS511 (2)

SICK 사의 대표적인 라인업 LMS를 사용해보자. (2)

이전 블로그에 있던 내용을 보강하여 작성됨. http://blog.naver.com/blastak/10120566333

SICK LMS 511 Communication


이 글에서는 소켓 프로그래밍에 관한 내용을 다루진 않는다. 바로 통신 포맷과 타이밍 등에 관한 내용을 소개한다.

2편을 바로 작성하고 싶었으나,, 회사일에 치여 개인적인 시간을 낼 수가 없었다. 야간뿐만아니라 심지어 주말에도

PC 설정

처음 사용했을 때 랜선을 PC에 꼽으면 당연히 통신이 될 줄 알았다. 하지만 내 PC의 IP를 설정해주어야만 통신을 할 수 있다는 것을 알게 되었다. 물론 지금은 SOPAS ET 소프트웨어로 자동 검색 및 IP 변경이 되는 것을 알지만, 그때는 무지했다.

설정 방법은 센서 IP 주소와 세 자리가 동일하게 PC 의 IP 설정을 하고, 마지막 자리를 센서와 다르게 설정하면 통신이 가능하다.

  • 예를 들어, 센서의 주소가 192.168.0.1 일 때, PC의 주소는 192.168.0.xxx 로 설정한다. (xxx는 2~255 사이의 값)
  • factory setting 은 다음과 같다.
    • IP address: 192.168.0.1
    • subnet mask: 255.255.255.0
    • TCP port: 2111

PC의 IP를 변경하였다면 ping을 보내서 연결됐음을 확인해보자.

Data Format

여기에서는 센서의 status 등의 정보를 주고 받는 명령과 센서값 수신에 핵심이 되는 명령만 설명한다.

매뉴얼(다운로드)의 10장 Annex파트를 보자. 최신 매뉴얼은 데이터 송수신에 대해 친절하게 설명되어 있지 않다. 내가 못 찾은걸 수도 있는데, 암튼 2010년 버전의 매뉴얼로 설명하려고 한다.

네트워크 설정이 끝나서 ping 테스트까지 완료하였으면 접속할 준비가 된 것이다. PC에서 TCP 방식의 소켓 프로그래밍을 구현하면 센서와 통신 패킷을 주고 받을 수 있다. 참고로 센서가 “server”이기 때문에 PC가 “client”로 접속을 하는 형태이다.

접속

connect함수를 이용하여 포트 2111 에 접속한다. (default port: 2111)
센서에 메시지 보낼 때는 각 문자가 1바이트로 되어있는 ASCII 값들을 보내면 된다.

센서 상태 체크

센서 상태를 체크하기 위하여 다음과 같은 메시지를 보내보자. STXETX를 항상 메시지 앞뒤로 붙여야하고, 띄어쓰기 또한 하나의 문자로 생각하면 된다.

<STX>sRN STlms<ETX>

위의 ASCII code 값을 send함수(리눅스에서는 write함수)로 센서에 보내자. 위의 값을 hexadecimal로 보면 다음과 같다. (편의상 “0x” 는 생략한다)

02 73 52 4e 20 53 54 6c 6d 73 03

위에서 볼 수 있듯이 STX, ETX, space(공백)는 ASCII code로 각각 0x02, 0x03, 0x20 값이다. 정상적으로 보내졌다면 센서로부터 다음과 같은 응답이 온다.

<STX>sRA STlms 7 0 8 00:00:00 8 01.01.06 0 0 0<ETX>

위의 예는 매뉴얼 79페이지에 나와있는 것과 같이 작성되었다. 중요한 것은 “7”이라는 문자인데, 이것이 센서의 현재 상태를 나타내므로, 우리는 데이터를 요청할지 다른 작업을 수행할지 결정할 수 있다. (상태는 0~7 까지의 값으로 나옴)

센서 상태 응답 포맷

센싱 데이터 수신

레이저스캐닝을 통해 얻어진 데이터를 수신하기 위해서는 먼저 센서에 알려달라고 요청해야한다. 송신 메시지는 크게 query 방식과 continuous 방식이 있다.

query 방식은 센서 상태체크하는 방식과 같이 메시지를 하나 보내고 센서로 응답이 올 때까지 기다리는 방식이다. 따라서 명령당 1회의 스캔 데이터만 받을 수 있다(Request & Response). 메시지와 응답은 각각 다음과 같다.

<STX>sRN LMDscandata<ETX>
02 72 52 4e 20 4c 4d 44 73 63 61 6e 64 61 74 61 03
<STX>sRA LMDscandata ..............<ETX>
02 73 52 41 20 4c 4d 44 73 63 61 6e 64 61 74 61 03 .............

위 응답에 …… 부분에 굉장히 많은 정보가 있기 때문에 아래 그림으로 대체한다.

센서 데이터 응답 포맷

continuous 방식은 PC에서 메시지를 한번 보내고 센서에서 알아서 데이터를 지속적으로 보내는 방식이다. 앞서 설명한 것과 같이 시리얼 통신보다 속도가 빠르므로 데이터 파싱(data parsing)을 위한 스레드(thread)를 따로 사용하는 것이 유리하다.

  • PC -> Sensor (continuous 방식 ON)
<STX>sEN LMDscandata 1<ETX>
  • Sensor -> PC (위 메시지에 대한 응답)
<STX>sEA LMDscandata 1<ETX>
  • Sensor -> PC (데이터 취득이 완료될 때 마다 PC쪽으로 보냄)
<STX>sSN LMDscandata ..............<ETX>
  • PC -> Sensor (continuous 방식 OFF; 종료시)
<STX>sEN LMDscandata 0<ETX>
  • Sensor -> PC (위 메시지에 대한 응답)
<STX>sEA LMDscandata 0<ETX>

데이터 파싱 (Data parsing)

그림 “센서 데이터 응답 포맷”을 보면 중간쯤에 [Data_1 Data_n] 항목이 있다. 저것이 센서에서 측정된 거리 데이터의 raw 값이다. 따라서 패킷에서 항목을 찾아서 순차적으로 저장하면 거리 데이터를 얻을 수 있다.

데이터 시각화 (Data visualization)

취득한 데이터를 육안으로 확인을 해보자. 아래 그림처럼 polar coordinate로 변환해서 보여주면 된다.

Transform

Example Code

百聞이 不如一見이라. 퀘퀘 묵은 코드를 소개한다.

https://github.com/blastak/rklib-sensor/blob/master/src/Sick.h

https://github.com/blastak/rklib-sensor/blob/master/src/Sick.cpp

굉장히 예전에 작성한 코드라 맘에 안드는 점이 한 두 가지가 아닌데 차차 수정하기로 하자..

마치며


마지막에 힘이 떨어져서 급하게 마무리한 경향이 있는 것 같은데,,;;; 앞으로 계획적인 글쓰기를 해야겠다.. 아 힘들다



blastak © 2017. All rights reserved.