PCL이야기 블로그를 쓰는 조국 연구원과 같이 PCD(Point Cloud Data)를 처리할 일이 생겨 그 내용을 간단히 정리해 봅니다. 우리의 최종 목표는 Velodyne 센서로 숲속에서 취득한 PCD에서 사람과 나무 그리고 나머지 알 수 없는 것들을 분리하는 것입니다. 사람은 추적하는 용도로 사용할 것이고, 나무는 지도를 작성하는 feature로 최종적으로 사용될 예정입니다.
우선, 다음과 같은 환경에서 Velodyne HDL-32E 센서를 장착한 차량을 운행하여 데이터를 취득하였습니다. 우리가 선택한 환경은 바닥이 도심과 같이 평탄하지 않고 굴곡이 있으며 주로 나무가 많이 심어져 있는 환경입니다.
차량의 전면에 장착된 Velodyne HDL-32E 센서 입니다. 센서가 차량의 전방에 낮게 설치되어 측정된 센서 데이터에서 차량이 일부 보이고 있으면 센서를 보호하기 위한 지붕을 떠받이는 기둥도 보이고 있는 등 데이터에 불필요한 부분이 좀 있습니다.
다음 데이터는 Velodyne HDL-32E로 측정한 데이터를 조금 가공하여 파일로 저장한 것인데, 데이터의 용량이 큰 관계로 외부 링크를 걸도록 하겠습니다.
PCD:
우선 이 데이터를 읽어서 OpenCV 라이브러리를 사용하여 시각화 하였습니다. 데이터에서 센서를 기준으로 좌우 -10m ~ +10m, 앞뒤 -10m ~ +10m 범위 내의 데이터만 잘라 내었으며, Velodyne 센서가 장착된 차량 자체를 센싱한 2m 내의 데이터도 무효화 하였습니다. 아래 동영상에서 Velodyne 센서가 전방향(0~360도)을 측정하기 때문에 화면의 오른쪽과 왼쪽은 서로 연결되어 있다고 보시면 됩니다. 우리는 이 영상에서 사람과 나무를 분리해 내고 구분하는는 것이 목적입니다. 그러기 위해서는 먼저 그래서 먼저 지면을 잘라낼 필요가 있는데, 지면을 제거하게 되면 각각의 오브젝트 들이 서로 연결되지 않고 떨어지기때문에 segmentation이 쉬워집니다.
다음 영상은 이전 영상에서 지면을 제거한 영상입니다. 여기서는 지면을 단순히 평평한 평면으로 가정합니다. 먼저, 데이터를 구성하는 3D 포인트 중에서 노멀 벡터가 하늘로 향하고 있는 지면 후보군들을 찾습니다. 이 후보군들 중에는 outlier가 많이 포함되어 있기때문에 RANSAC 알고리즘을 사용하여 후보군들을 가장 잘 표현하는 평면을 찾게 됩니다. 찾은 평면에서 최단 거리가 7.5cm 인 점들(지면 근처의 점들)을 지워버리면 지면이 어느 정도 제거된 영상을 볼 수 있습니다. 하지만 산악 지형에는 굴곡이 있기때문에 평면으로는 지면이 제대로 제거되지 않는 것을 볼 수 있습니다.
아래는 다음 영상을 만들어 낸 소스코드 입니다. (소스코드에는 데이터가 첨부되어 있지 않습니다.)
소스코드:
*참조:
- 평면의 방정식 및 평면에 내린 수선의 길이: