-
LiDAR 데이터를 사용한 다중 차량 추적 - Detector (1)Autonomous Navigation/Examples 2021. 8. 30. 13:38
LiDAR 데이터를 사용한 다중 차량 추적 - Introduction
이번 글에서는 MATLAB Sensor Fusion and Tracking Toolbox에 포함된 예제인, LiDAR 데이터를 사용한 다중 차량 추적 프로그램을 간단히 분석해 보겠습니다. 이 프로그램은 MATLAB에서 제공하는 car-mounted LiDAR..
wjdghksdl26.tistory.com
이전 글에서 예제 프로그램의 간단한 작동 방식과 흐름을 살펴보았습니다. 이번 글에서는 detector 부분에 대해 좀 더 자세히 분석해 보도록 하겠습니다.
위 그림은 Detector에 해당하는 HelperBoundingBoxDetector system object의 작동 흐름입니다. 대략 설명해 보자면 다음과 같습니다.
- 전체 포인트 클라우드에서 분석 영역으로 삼을 RoI(Region of Interest) 를 설정하고 크롭합니다.
- pcfitplane 함수를 이용해 도로(땅)에 해당하는 센서 관측값을 구분해냅니다.
- pcsegdist 함수를 이용해 자동차에 해당하는 센서 관측값들을 자동차 1대 단위로 클러스터링합니다.
- pcfitcuboid 함수를 이용해 3.에서 만든 클러스터 하나마나 3-D bounding box를 씌웁니다.
이 과정을 거치면 한 time step의 raw point cloud로부터 (자동차에 해당하는) 3-D bounding box들의 각종 정보(크기, 위치, 방향)가 계산됩니다.
일단 1.에 해당하는 RoI cropping을 수행하는 함수부터 알아보겠습니다. 함수의 이름은 cropPointCloud로, 과정 1~4중에서는 제일 심플한 편입니다.
- 입력 : raw point cloud, x/y/z limit, ego vehicle radius
- 출력 : cropped point cloud, crop영역 안에 있는 point들의 index, crop영역 밖에 있는 point들의 index
x/y/z limit은 계산에 사용할 point cloud의 영역이고, ego vehicle radius는 LiDAR 관측값 중 ego vehicle에 해당하는 값들을 걸러내는 데 쓰이는 threshold입니다.
Line 142~147에서 RoI 내의 point들을 모아 inside에 저장하고, line 150~152에서 ego vehicle에 해당하는 관측값들을 걸러냅니다. 그 후 line 153에서는 RoI내에 있으면서 ego vehicle에 해당하지 않는 point 들을 모으고, line 154부터는 그런 point들의 index와, 거름망을 통과한 point cloud 자체를 생성합니다.
이제 이 point cloud가 ground plane segmentation을 담당하는 함수로 넘어가게 됩니다.
2.에 해당하는 함수의 이름은 removeGroundPlane으로, 대부분의 작업은 pcfitplane이라는 별도의 함수에서 이루어집니다.
- 입력 : filtered point cloud, max ground distance, reference vector, max angular distance, current indices
- 출력 : filtered point cloud, obstacle indices, ground indices
Max ground distance는 도로에서 나온 관측값로 취급될 point들의 최대 높이를 말하며, reference vector는 ground plane에 수직인 벡터(위쪽을 향하는 벡터겠죠?), max angular distance는 fitting된 plane의 normal vector와 reference vector 사이에 허용될 최대 각도입니다. Obstacle indices와 ground indices는 각각 도로가 아닌 point들과 도로에 해당하는 point들의 indices입니다.
pcfitplane함수가 포인트 클라우드와 함께 바로 위에서 설명한 변수들을 받아 포인트 클라우드에 ground plane을 fitting하고, ground plane에 해당하는 point들을 추려냅니다. 이 함수는 MSAC(M-estimator SAmple Consensus) 기법을 사용해 fitting을 수행합니다. MSAC은 RANSAC과 마찬가지로 큰 outlier들이 존재하는 상황에서 fitting을 정상적으로 수행하기 위한 기법인데, error term에 kernel function을 씌움으로서 outlier들이 전체적인 fitting을 틀어지게 하는 일을 방지합니다. 제가 이전에 작성한 SLAM 설명 글들 중 하나인 Visual Odometry 설명글에 나온 robust cost function과 비슷한 컨셉이라고 보시면 되겠습니다.
S-PTAM 리뷰 - 이론(2) : Visual Odometry 2
다음과 같은 자료를 참조하였습니다. https://www.ipb.uni-bonn.de/msr2-2020/ (Cyrill Stachniss 교수님의 Mobile Sensing and Robotics 강의자료) http://rpg.ifi.uzh.ch/teaching.html (Davide Scaramuzza 교..
wjdghksdl26.tistory.com
관련 논문을 읽어보시면 MSAC을 사용한 fitting에 대해 좀 더 자세히 이해하실 수 있습니다. 사실 이 논문 하나를 그냥 읽고 이해하려고 하기보다는, 최적화와 estimation에 대한 전반적인 지식을 익히고 MSAC에 대해 찾아보는 것이 장기적으로 훨씬 큰 도움이 됩니다. 저는 이 블로그들에서 많은 도움을 받았습니다.
하여튼 이 removeGroundPlane 함수를 통과하고 나면 ground plane에 해당하는 point들의 index와 나머지 point들의 index가 반환됩니다. 즉, 포인트 클라우드에서 도로(땅)에 해당하는 관측값들을 걸러낸 것입니다.
3.과 4.는 하나의 함수로 묶여 있고, 해당 함수의 이름은 getBoundingBoxes 입니다. 클러스터링과 bounding box fitting을 함께 수행하는 부분입니다.
- 입력 : Crop되고 ground가 제거된 point cloud, minimum distance threshold, minimum detections per cluster, maximum/minimum z distance
- 출력 : bounding box들
minimum distance threshold와 minimum detections per cluster는 클러스터링 알고리즘을 위한 파라미터이고, maximum/minimum z distance는 자동차에 해당하는 bounding box만을 선택하기 위한 파라미터입니다(예를 들어, 허공 10미터에 떠 있는 bounding box는 자동차가 아니겠죠?). 이 글에서는 클러스터링 알고리즘에 대해 중점적으로 설명하고, bounding box fitting은 다음 글로 넘기도록 하겠습니다.
클러스터링은 pcsegdist 함수를 통해 이루어집니다. 이 함수는 심플하게 유클리디언 거리를 이용해 두 점이 같은 클러스터에 속하는지 아닌지를 판별합니다. 클러스터로 인정받기 위해 가지고 있어야 할 최소 point의 개수도 지정할 수 있습니다. 두 점간의 유클리디언 거리가 문턱값보다 작으면 같은 클러스터, 문턱값보다 크면 다른 클러스터로 판별합니다(DBSCAN의 보급형 버전 같은 느낌이네요). 어떤 점에서 문턱값 거리 내에 어떤 클러스터도 존재하지 않는다면 잡음으로 판별됩니다.
DBSCAN 개념도 비교적 간단한 클러스터링 기법을 사용하는 이유는 이게 매 time step마다 이루어져야 하는데, 하나의 time step마다 생성되는 포인트 클라우드에만 해도 점들이 꽤 많기 때문에 계산 소요 시간을 줄이기 위해서라고 생각됩니다.
하튼 line 104까지 수행되면 클러스터링된 포인트 클라우드가 얻어집니다. Line 105부터는 각각의 클러스터에 대해 bounding box fitting이 이루어지는데, 다음 글에서 알아보도록 하겠습니다.
클러스터링이 이루어진 point cloud는 이런 느낌입니다. ---------- 개인적인 생각 ----------
요즘 이런 분야의 모든 것이 그렇듯, 클러스터링도 딥 러닝 기반으로 수행하는 것이 대세입니다. 인공신경망을 적절히 설계하면 그냥 raw point cloud를 input으로 받아서 바로 bounding box를 출력하는 것도 가능한 것 같던데, 얼른 뉴럴넷을 공부해서 어떤 원리인지 이해하고 앞으로 활용해야 할 것 같습니다. 다른 예제에서 한 번 다루어 보겠습니다.
'Autonomous Navigation > Examples' 카테고리의 다른 글
PointSeg 네트워크를 이용한 LiDAR 데이터 Semantic Segmentation 및 Tracking (0) 2021.08.31 LiDAR 데이터를 사용한 다중 차량 추적 - Tracker (0) 2021.08.30 LiDAR 데이터를 사용한 다중 차량 추적 - Detector (2) (0) 2021.08.30 LiDAR 데이터를 사용한 다중 차량 추적 - Introduction (0) 2021.08.28