머신러닝

본문 바로가기
사이트 내 전체검색


머신러닝
머신러닝

9. LiDAR 센서

페이지 정보

작성자 관리자 댓글 0건 조회 1,870회 작성일 21-01-21 20:45

본문

9. LiDAR 센서

LiDAR (Light Detection And Ranging)는 원거리에서 물체를 탐지하는 장치입니다.

360도로 회전하는 LiDAR는 각도와 거리 값을 측정할 수 있습니다.

어느방향, 어느 정도 거리에 물체가 있음을 탐지할 수 있습니다.

AIot SerBot에 장착된 LiDAR는 0.45도 마다 최대 12m까지 측정하며 초당 10회전하여 스캔합니다.


1. LiDAR 기본 제어

LiDAR는 Pop.LiDAR 라이브러리를 이용해 사용할 수 있습니다.

LiDAR센서는 1대1 통신으로 실시간 데이터를 단 한번만 송신합니다.

그러므로 여러프로세스에서 동시에 LiDAR값을 수신하는 경우 데이터 수신에 실패할 확률이 높습니다.

장비를 제어하는 주요 메소드는 다음과 같습니다.


- connect() : LiDAR 연결

- startMotor() : LiDAR 스캐닝 모터 시작

- stopMoter() : LiDAR 스캐닝 모터 정지

- getVectors() : 1회전 동안 스캔한 벡터값 튜플(Degree, Distance, Quality)를 각도 기준 오름차순으로정렬한 리스트 반환

- getXY() : 1회전 동안 스캔한 좌표값 튜플(x,y)를 각도 기준 오름차순으로 정렬한 리스트 반환

- getMap(size, limit_distance) : 1회전 동안 스캔한 값을 2차원 맵으로 반환

  - size : 반환할 맵의 사이즈, 기본값: (300,300)

  - limit_distance : 맵에 표현할 최대 거리, 2000으로 설정한다면 2000mm 이하의 값만 맵으로 반영, 기본값: 1200


먼저, Pop에서 LiDAR라이브러리를 불러오고 Rplidar 클래스를 생성합니다.


from pop import LiDAR

lidar = LiDAR.Rplidar()


Rplidar 객체가생성되었다면 connect()메소드로 LiDAR와 연결하고 startMotor()메소드로 스캐닝 모터를 동작시킵니다.


lidar.connect()

lidar.startMotor()



getVectors() 메소드를 사용하면 1회전 동안 스캔된 각도와 거리 데이터를 갖는 벡터를 반환합니다.

for문을 이용해 출력하면 각도, 거리, 데이터 신뢰도가 출력됩니다.

각도는 degree, 거리는 mm 단위입니다

데이터 신뢰도는 반사되어 돌아온 빛의 산란도와 굴절도 등으로 산출된 값으로 0~47 사이의 값을 가집니다.



vectors = lidar.getVectors()

for v in vectors:

    print(v)



[ 22.13745117 598.          47.        ]

[ 22.74719238 520.          47.        ]

[ 22.98339844 524.          47.        ]

[ 23.30749512 522.          47.        ]

[ 23.54370117 524.          47.        ]

[ 23.82385254 526.          47.        ]

[ 24.10400391 528.          47.        ]

[ 24.38964844 528.          47.        ]



getXY()메소드를 사용하면 1회전 동안 스캔된 X좌표와 Y좌표 데이터를 갖는 좌표 객체를 반환합니다.

for문을 이용해 출력해 보면 (X,Y)가 출력됩니다.

단위는 mm입니다.


coords = lidar.getXY() 

for c in coords:

    print(c)



[  24.95395505 5783.94617023]

[  77.71760319 5831.48214214]

[ 130.80393419 5854.53895117]

[ 183.55981602 5853.12239697]

[ 234.45161301 5819.27903104]

[ 286.49144936 5808.93954603]

[ 338.83006633 5806.12178534]

[ 389.52710161 5778.88679913]

[ 443.42049432 5799.07184515]



getMap() 메소드를 사용하면 1회전 동안 스캔된 값을 2차원 배열로 반환합니다.

2000mm 이하의 값만 스캔해 jmshow() 메소드로 출력해보면 회색조 맵이 출력됩니다.

2차원 배열 값의 범위는 0~255이며 해당 좌표에 인식된 값이 많을 수록 255에 가까워 집니다.


from pop.Util import imshow 


lidar_map = lidar.getMap(limit_distance=2000, size=(300,300))

imshow("map",lidar_map)



1.PNG



getMap()메소드의 size를 (50,50)으로 조절하면 조금 더 간소화된 맵을 출력합니다.




lidar_map = lidar.getMap(limit_distance=2000, size=(50,50))

imshow("map",lidar_map)


2.PNG



lidar.stopMotor() 




댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.