1. LiDAR Data
- point cloud data로 부르며 3차원 공간에 존재하는 특정한 점이다
- 일반적인 경우 LiDAR 센서는 이더넷 TCP/IP (대부부은 UDP)를 통해 데이터를 수신하고 데이터의 포맷은 packet 형태를 가진다
- LiDAR가 ethernet protocol을 통해 local로 data를 보내준다
- ethernet 통신의 데이터를 packet이라고 한다
- ethernet 통신을 하는 이유?
- LiDAR 데이터가 크기 때문이다
- 만약 충분이 적은 데이터를 가진 센서라면 다른 인터페이스를 사용하는 경우도 있다
1-1. Packet 구조
- 많은 LiDAR 센서는 Ethernet Packer 구조를 사용하기 때문에 라이브러리 또는 SDK를 제공하지 않는다면 직접 packet을 un-pack(parsing)하는 과정이 필요하다
- 이때는 LiDAR 회사의 공식 문서를 참고해야한다
- 시중의 대부분의 센서는 라이브러리나 SDK를 제공한다
- Ethernet packet의 파일 확장자는
*.pcap
을 사용하고 packet stream Ehsms PCAP file을 point cloud format으로 변환하여 사용한다
Velodyne VLP-16 LiDAR 데이터 구조
- 한 packet의 크기는 1248bytes
- packet의 시작과 끝을 찾고 그 안에 있는 데이터를 가지고 온다
- header : 42bytes
- tail : 6bytes -> 시간, factory(끝을 의미)하는 내용이 담겨있다
- header와 tail을 제외한 데이터 : 1200 bytes
- 12개의 data block (0 ~ 11 block)
- Flag : data block의 시작을 확인할 수 있다, 16진수이기 때문에 2 bytes를 차지한다
- Azimuth : Lidar의 각도
- sequence : VLP-16은 16채널이기 때문에 채널에 대한 데이터가 각각 16개씩 들어있다
- 일반적으로 point cloud data는 다음과 같은 데이터를 의미한다
- X, Y, Z : point의 3차원 위치를 표현
- (optional) intensity : 반사된 laser의 세기
- point cloud data는 .pcd, .las, *.xyz 등을 사용한다
2. PCL (PointCloudLibrary)
- open3D와 같은 유용한 라이브러리도 존재한다
- 또한 OUSTER처럼 자체 SDK를 제공하는 경우도 있다
- ROS를 사용한다면 PCL 라이브러리는 자동으로 설치된다
- ROS 환경이 아니라면
sudo apt install libpcl-dev
명령어로 설치한다
- PCL은 의존 라이브러리가 많이 때문에 직접 컴파일한다면, 반드시 공식 홈페이지를 참고하여 설치한다
- Mandatory, Optional 모두 설치해야한다
2-1. container, data type
container
- 데이터를 담아두는 그릇
pcl::PointCloud<T>
pcl::PCLPointCloud2
: PCL 1.x 버전 이상
data type
- 데이터를 표현하는 이름
pcl::PointXYZ
: 3D scanner를 사용하는 경우
pcl::PointXYZI
: 3D scanner에서 intensity를 같이 사용하는 경우
pcl::PointXYZRGB
: RGB-D camera 또는 LiDAR & Camera calibration을 통해 point cloud에 RGB값을 부여한 경우
pcl::PointXYZRGBA
: pcl::PointXYZRGB
에 투명도가 추가된 것
pcl::PointXY
: 2D scanner를 사용하는 경우
2-2. CMakeLists.txt 작성 방법
- c++로 PCL을 사용할 경우 CMakeLists를 사용해야한다
cmake_minimum_required(VERSION 3.10)
project(project_name)
add_executable(project_name main.cpp)
find_package(PCL 1.12 REQUIRED)
if(PCL_FOUND)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
link_directoried(${PCL_LIBRAry_DIRS})
target_link_libraries(project_name ${PCL_LIBRARIES})
endif()
2-3. PointCloud Container 작성 방법