불과 몇년 전 까지는 컴퓨터 비전(영상처리) 분야나 로보틱스 분야에서 연구/개발을 하는 사람들 사이에서만 익숙한 용어였던 Point Cloud는 자율주행의 급속한 발전으로 대중들에게 더 가까워지면서 이제는 해당 분야 전문가가 아닌 사람들 사이에서도 어느정도 알려지게 되었습니다. 그만큼 이를 활용하는 곳이 많아지고 앞으로도 더 중요해질 개념이라고 볼 수도 있겠습니다. 이번 포스팅에서는 최근 조금씩 비전문가에게도 알려지고 있는 Point Cloud의 개념부터 연구/개발에 있어 꼭 알아야할 내용까지 소개드려보도록 하겠습니다.
참고로, 로보틱스와 관련한 다른 포스팅과 미국 대학원 박사과정 유학에 대해서도 적어본 포스팅이 있어 함께 공유드립니다. 연구로서 로보틱스를 관심있게 생각하시는 분들께는 도움이 될 수 있을 것 같습니다.
Table of Contents
Point Cloud란?
결론부터 우선 적자면 Point Cloud는 3차원 공간의 정보를 담는 자료의 틀 입니다. 마치 우리가 스마트폰으로 사진을 찍으면 ‘사진파일’에 색상 정보가 담기는 것과 같이 3차원 공간의 정보를 담는 일종의 자료의 형태 입니다. 2차원과 3차원 정보에 대해 익숙하시지 않은 분들을 위해 간단히 차이를 적어보도록 하겠습니다.
(이미 이 내용을 어느정도 아신다면 넘어가셔도 됩니다.)
3차원 정보가 필요한 이유
아마도 이 글을 읽으시는 분들께서는 모두 스마트폰으로 사진을 찍고나서 찍은 사진을 확인해본 경험이 있으실 것 입니다. 이 과정을 조금 더 기술적으로 풀어보면 아래와 같이 순차적인 과정을 생각해 볼 수 있습니다.
우리가 사진을 찍는 대상을 모두 실제 공간에 있는 3차원의 형태, 쉽게 생각하면 너비, 높이, 부피가 모두 존재하는 대상체 입니다. 얇은 종이라고 해도 두께가 없는 것은 아니죠. 즉, 사진을 찍은 대상은 3차원 입니다.
하지만, 우리가 찍는 사진은 항상 평면의 형태로만 존재합니다. 물론 사진에서 어느 물제가 얼마나 거리를 두고 있는 지 ‘경험을 더해’ 추측할 수 있지만, 엄밀히 사진에는 대상체의 어느 부분이 얼마나 떨어져있는지에 대한 정보는 존재하지 않습니다. 즉, 사진을 찍는 과정에서 카메라와 대상체 사이 거리에 대한 정보는 날려버리게 되는 것이죠.
아래 사진에서 예를 들면, 찍힌 사진만으로 로봇과 벽이 얼마나 떨어져있는지 알 수 있는 방법이 없습니다. 사진을 찍는 과정에서 거리 정보는 없어졌기 때문이죠.
사진을 찍는 카메라의 원리는 흔히 눈의 망막에 비유를 합니다. 각막을 통해 망막에 색이 비춰지면 망막에서 색상을 인지하는 방식이죠. 카메라도 마찬가지입니다. 차이라면, 카메라의 센서는 바둑판과 같이 칸칸이 나눠져 있고, 각 칸에 비춰진 색을 처리하여 하나의 ‘픽셀’을 만들어 냅니다. 이런 픽셀이 칸칸이 모여 하나의 사진이 완성됩니다.
이렇다 보니 일반적인 사진은 대상체의 거리가 필요한 경우에는 바로 사용이 어려운 데이터 입니다. 가장 대표적인 예로 대상체와의 거리를 알아야 하는 자율주행 자동차를 생각해 볼 수 있습니다. 사람의 경험으로 비춰보도라도 사진 한장에서는 대상체가 ‘몇 미터’ 떨어져있는지를 잘 맞추는 것은 어렵습니다. 이래서 사진을 찍는 순간 거리 정보를 버리지 않고 저장하는 방식을 생각하게 된 것 같습니다.
3차원 정보를 얻는 방법
픽셀에 색상정보를 담는 방식은 이미 센서가 잘 개발되었기도 하고 개념적으로 그리 복잡한 과정을 아니지만, 3차원 정보를 담는 과정을 필연적으로 이보다는 더 복잡합니다. 이를 위한 방법이 여러가지 존재하는데, 그 중 가장 많이 사용되고 있는 두가지 방식에 대해 소개드리도록 하겠습니다.
사람의 눈 처럼 두 사진 이용
눈이 하나라면 거리를 예측하기 어렵지만, 두 눈을 이용하면 더 나은 거리측정이 가능해집니다. 사진 한장에서는 얻을 수 없었던 추가정보가 생기는 샘이죠.
자세히 다루자면 꽤 자세히 적어야 하니 최대한 간단히만 적어보겠습니다. 공학적으로 더 자세한 내용은 이곳에서 확인하실 수 있습니다.
만약 우리에게 두 눈과 같이 같은 곳을 바라보는 두대의 카메라가 있다고 생각해 보겠습니다. 당연히 두 카메라가 같은 위치에 있을 수는 없으니 어느정도의 거리를 두고 위치해 있고, 그렇다 보니 동시에 같은 대상체를 찍어도 약간은 다른 사진이 찍히게 됩니다.
이 때, 두 사진에서 같은 물체가 얼마나 다르게 찍혔는지, 그리고 두 카메라의 거리를 가정했을 때 대상체가 두 사진에서 그 차이를 보이기 위한 거리는 이론적으로 하나밖에 나오지 않습니다. 이를 픽셀마다 계산하면 어느정도 거리를 계산할 수 있습니다.
이러한 방식을 이용하는 장치를 스테레오 카메라 Stereo Camera 라고 합니다. 다른 3D 측정장치 보다 주로 가격이 저렴한 것이 특징인데, 그 중에서도 인텔에서 만드는 리얼센스 RealSense가 가장 많이 사용되고 있습니다. 이를 이용하면 아래와 같은 사진과 3D 데이터를 얻을 수 있습니다.
아래 3D 데이터는 클릭하여 더 자세히 확인할 수 있습니다.
위 데이터에서 볼 수 있듯이 스테레오 카메라 방식은 가성비는 좋으나 절대적인 정확도에서 단점이 분명하게 들어납니다. 대상체를 바라보는 각도와 거리에 따라 작은 디테일은 왜곡되기 쉽고, 사진으로 부터 얻는 정보인 만큼 주변 조명으로 부터도 영향을 받습니다.
또, 하드웨어에 따라 측정이 잘 되는 거리가 달라 아쉽게도 활용할 수 있는 범위가 제한적인 편 입니다. 그럼에도 여러 연구를 통해 단점을 개선하면서 꽤 잘 쓰여지고 있기도 합니다.
눈치 채신 분들이 계실지 모르겠지만, 최근 식당에서 종종 보이는 서빙로봇의 하단에 이 스테레오 카메라가 장착되어 있습니다. 저렴한 가격에 실내에서 장애물 회비 목적으로는 꽤 적합한 편인 것 같습니다.
거리를 측정해서 저장하기
개념상으로는 스테레오 카메라로 충분할 것도 같지만, 실제 사용하는데 있어 스테레오 카메라는 한계가 여럿 있습니다. 여러가지가 있지만 두 카메라가 모두 보는 영역에 제한된다는 점과 측정 거리의 제약을 가장 큰 제약으로 꼽아볼 수 있겠습니다. 활용하기에 따라 문제가 되지 않을 때도 있지만, 자율주행과 같이 주변을 모두 빠르게 그리고 멀리 봐야하는 경우라면 문제가 될 수 있습니다.
그래서 활용하는 방식이 자율주행 관련하여 종종 들을 수 있는 LiDAR라는 장치가 사용하는 거리측정 방식입니다.
라이다 LiDAR는 LASER Range Finder의 약자이며, 이는 레이저 센서의 한 종류입니다. 레이저는 빛을 쏘고 돌아오는 시간을 측정하여 거리를 계산하는 장비인데, 원리는 간단합니다. 한 중학교 쯤 과학시간에 거리, 속도, 시간에 대한 관계를 배운 적이 있으실 것 입니다. 레이저는 직진하는 빛이고, 빛의 속도는 알고 있으니 레이저를 쏘고 돌아오는 시간을 재면 거리를 계산할 수 있다는 원리 입니다.
라이다는 레이저 포인터와 이를 감지하는 레이저 감지기로 이루어져 있습니다. 레이저가 꺼져있다가 켜지는 순간의 시간과 감지기에서 감지한 시간을 비교하여 레이저 빛이 돌아오는데 걸리는 시간을 계산합니다. 빛의 이동 속도가 항상 일정하다는 점을 이용하면, 레이저가 반사된 지점의 거리를 상당히 정확하게 계산할 수 있습니다.
이렇게 구성된 센서는 레이저 포인터가 도달하고 반사되는 한 점까지의 거리만 측정할 수 있습니다. 한 점이지만 빠르게 여러번 측정할 수는 있죠.
만약 이런 점 하나만 측정하는 센서가 돌아가는 모터 위에 장착되어 회전하면서 측정하고 있다고 가정해 보겠습니다. 센서는 빠르게 측정을 할 수 있으니, 어느 방향을 바라보고 측정한 점인지만 알면 아래와 같이 주변 환경을 한 평면으로나마 정확하게 측정할 수 있습니다.
이러한 방식으로 하나의 레이저 포인터 센서를 빠르게 회전시키면서 주변 환경으로 부터 점 거리를 얻어내는 장치가 라이다 LiDAR 입니다. 이 중에서도 하나의 레이저 센서를 회전시켜 한 평면의 데이터를 측정하는 라이더를 2D 라이더라고 합니다.
눈으로 보기에는 크게 많은 정보가 보이지 않지만, 이를 잘 활용하면 간단한 자율주행은 가능하기 때문에 스마트 크루즈 같은 기능에 이미 활용되고 있습니다.
이번엔 한발 더 나아가 이렇게 회전하는 레이저 포인터 센서가 위아래로 여러 겹 쌓여서 동시에 동작한다고 가장해 보겠습니다. 이렇게 구성되어 동작하는 라이다를 3D LiDAR 라고 하며, 아래와 같은 데이터를 얻게 됩니다.
라이다는 거리 측정이 정확하다는 장점은 장점은 있지만, 모든 거리측정을 담당할 수 있는 완벽한 장비는 아닙니다. 위 스테레오 카메라 데이터와 비교했을 때 측정하는 밀도가 낮은 것을 눈으로도 알 수 있습니다. 측정하는 범위는 넓지만 데이터 밀도가 낮아 조밀한 측정은 오히려 스테레오 카메라가 더 적합할 때도 있습니다.
라이다는 측정할 수 있는 거리도 스테레오 카메라 보다 멀지만 역으로 가까운 대상을 측정이 어렵습니다. 이는 빛의 속도가 너무 빠르기 때문인데, 너무 일찍 반사되어 버리면 반사되어 돌아온 레이저를 인식하는 센서가 반응하기 전에 이미 레이저가 도착하여 센서가 이를 놓쳐버리게 되기 때문입니다.
아직 라이다가 일반적으로 많이 보이는 장비는 아니라 큰 문제로 떠오르지는 않고 있지만, 본질적으로 레이저는 어느 장비에서 발생된지 알기 어렵기 때문에 여러 라이다가 같은 공간에 있을 때 다른 라이다의 레이저가 인식되면서 데이터가 왜곡되어 버리는 문제가 발생하기도 합니다. 이는 여러대의 자율주행 자동차가 모두 라이다를 달고 있다면 문제가 될 수 있습니다.
3차원 정보를 저장하는 Point Cloud
위의 두 방식 혹은 다른 방식으로 3차원 정보를 얻었다면, 이를 저장하는 과정도 필요합니다. 카메라로 찍은 색상정보를 직사각형 사진에 저장하듯, 3차원 정보도 어딘가 저장을 해야하는데, 한 차원 높은 정보인 만큼 사진과는 다른방식을 써야합니다. 이 때 사용하는 데이터 형태가 Point Cloud 입니다.
그 이름에서 알 수 있듯 Point Cloud는 여러개의 점 정보를 한곳에 모아 둔 데이터 입니다. 일반적으로 실제 물체를 측정한 지점에 점들이 모여있어 Cloud라는 이름을 붙인 것으로 쉽게 예상해 볼 수 있죠.
Point Cloud 데이터의 구성
지금부터는 조금 더 기술적인 내용을 소개드리도록 하겠습니다. 개념적으로는 여러 3차원의 점을 한곳에 모은 데이터인데, 이를 하나의 파일 혹은 (프로그래밍 상에서의) 오브젝트에 구성하는 방법이 여럿 있습니다.
실무적으로 사용되는 틀은 몇가지 있지만, 본질적으로는 크게 다르지 않은 구성을 가지고 있습니다.
3차원 점 3D Point
점 하나만 생각해보면 별로 대단할 것 없는 데이터 입니다. 3차원 공간을 x, y, z 세가지 축으로 표현한다고 생각했을 때 이 좌표로 점의 위치를 찍을 수 있습니다.
이를 다시 보면 한 점은 x값, y값, z값 세 수치로 위치를 정할 수 있습니다. 그렇다면, 아래와 같이 여러 점을 한 데이터에 모으는 것 역시 쉽게 생각해 볼 수 있습니다.
위와 같이 n개의 점을 한 오브젝트 혹은 파일에 모아놓으면 필요한 대로 다수의 3차원 점 정보를 모두 담을 수 있습니다. 100개의 점이 있다면, 아래와 같이 표현할 수 있는 모든 정보를 담는 것이 가능한 것 입니다.
Organized Point Cloud 그리고 Unorganized Point Cloud
여러 점을 순차적으로 나열하는 방식에 대해 소개드렸는데, 한줄로 나열하는 과정에서 각 순서가 의미가 있는 경우도 있고 아닌 경우도 있습니다.
순서가 의미있는 경우 이를 Organized Point Cloud라고 하기도 합니다. 이름에서 알 수 있듯 의미가 있는 순서대로 점이 나열된 경우라고 보면 쉽습니다. 예를 들어 스테레오 카메라를 이용해 직사각형 형태의 이미지 형태로 거리 정보를 얻은 경우, Point Cloud로 정보를 저장할 때 픽셀 순서대로 저장하는 것이 어렵지 않습니다. 이 경우, 어느 점이 어느 점과 이웃한 점인지 나중에도 파악할 수 있게 됩니다. 컴퓨터 비전에서는 이런 경우에만 사용할 수 있는 알고리즘들도 존재합니다.
반면, Point Cloud에 담긴 점의 순서는 아무 의미를 가지지 않는 경우들도 있습니다. 대표적인 경우로 데이터의 후처리로 인해 중간중간 데이터를 필터링 했거나, 여러 Point Cloud를 merge하여 하나의 Point Cloud로 합친 경우 입니다. 한 공간을 스캔할 때 한 위치에서는 모두 볼 수 없기 때문에 장치를 이동시키면서 데이터를 얻는데, 여러 위치에서 얻은 데이터를 하나로 합치게 되면 순서가 섞이기 때문에 원래 Organized 였다고 하더라도 이 의미가 사라지게 되는 경우가 많습니다.
기술적으로 설명하자면 내용이 많으니 의미있는 순서가 있는 경우를 Organized, 순서가 의미가 없을 땐 Unorganized 라고 보면 어느정도 맞을 것 같습니다.
Point Cloud용 라이브러리 – PCL
개념적으로 데이터의 구조가 단순한 만큼 직접 데이터 타입을 구성하여 프로그래밍 할 수도 있지만, 사용이 간단하면서 사이즈가 큰 데이터를 효율적으로 다룰 수 있게 이미 만들어진 라이브러리가 있습니다. Python에서는 numpy를 이용해 데이터를 다루기도 하지만, C++에서는 PCL (Point Cloud Library)를 가장 많이 사용합니다. 일반적으로 Point Cloud는 처리해야 하는 데이터가 크기 때문에 같은 연산도 더 빠르게 처리할 수 있는 C++를 여전히 많이 사용합니다.
라이브러리에 대한 자세한 내용은 PCL 홈페이지에서 확인할 수 있습니다.
PointCloud vs PointCloud2
PCL에서 사용할 수 있는 Point Cloud 구조는 크게 PointCloud와 PointCloud2 두가지로 나뉩니다. 언뜻 보면 pointCloud2가 나중에 개선된 더 좋은 구조인 듯한 인상을 주지만, 두 구조는 어느 하나가 더 좋다고 볼 수는 없는 차이를 가지고 있습니다.
PointCloud는 위에서 소개드린 대로 한 점의 정보를 담는 point 오브젝트를 리스트로 모아 둔 형태의 데이터 구조 입니다. 직관적으로 되어있어 바로 데이터 처리를 할 수 있는 형태입니다.
PointCloud2는 데이터를 처리하기 위한 구조라기 보다는 데이터를 전송하기 유리한 형태의 구조라고 볼 수 있습니다. 일반적으로 (메모리를 공유할 수 있는 특수한 경우를 제외하고) 한 PC에서 다른 PC로, 혹은 같은 PC 내에서도 한 프로세스에서 다른 프로세스로 데이터를 전송할 때는 바이트 byte 단위로 쪼개서 한 바이트씩 전송하게 됩니다.
Float 형태로 하나의 값을 저장하는 경우 한 숫자를 4개의 byte로 구성하기 때문에 하나의 바이트는 숫자 하나도 담지 못합니다. 점 하나에 숫자가 (XYZ만 담는다면) 세개가 필요하니 12 byte, 즉 12개의 바이트로 쪼갠 다음 순서대로 보내야 합니다. PointCloud 형태로 데이터가 저장되어 있었다면 전송하기 전 점 개수의 12배에 해당하는 바이트 수로 먼저 쪼갠 다음 보내야 합니다.
이 때문에 데이터를 전송하는 것이 주 목적이라면 처음부터 미리 나눠놓으면 더 빠르고 좋습니다. 이런 목적으로 사용하는 형태가 PointCloud2 입니다. 쪼개진 바이트가 나열된 하나의 큰 행렬이 있고, 이를 다시 해석하기 위한 정보를 담는 일종의 설명서로 구성됩니다. 이 설명서에 해당하는 정보를 메타데이터 라고도 하는데, 몇번째 byte가 무슨 정보인지를 알 수 있게 데이터 구성 순서를 명시하는 정보입니다. 이렇게 쪼개서 한 줄로 나열하는 과정을 Serialization 이라고 합니다.
즉, 데이터를 읽어 처리하기 위함이면 PointCloud, 데이터를 전송하기 위함이라면 PointCloud2로 저장하는 것이 좋습니다. 이러한 이유로 ROS에서도 센서 데이터의 전송은 거의 모두 PointCloud2로 받게 됩니다.
물론 두 데이터 간 변환은 메모리만 충분하다면 필요할 때 언제든지 가능합니다.
PCL을 이용해 Point Cloud 처리하기
구체적인 기능을 소개하는 내용을 별도의 포스팅에서 작성하도록 하고 이번 포스팅에서는 PointCloud 데이터를 이해하는 정도의 예시를 소개드리도록 하겠습니다.
데이터 생성 및 데이터 읽기
PCL을 이용하면 손쉽게 Point Cloud 데이터를 직접 만들수도 있고, 이미 있는 파일을 읽어 데이터를 활용할 수도 있습니다. 우선 데이터를 임의로 만드는 예시를 보여드리도록 하겠습니다.
위와 같이 입력한 정보가 Point Cloud 데이터에 추가된 것을 확인할 수 있습니다. 디버깅으로 값을 확인할 수도 있고, 파일로 저장 후 Point Cloud 뷰어 프로그램을 사용하여 확인해 볼 수도 있습니다.
// PCL Basic Example Code
// 2024.1.28
// KONGINEER
//
#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
typedef pcl::PointXYZ pclType;
typedef pcl::PointCloud<pclType> pclCloud;
using namespace std;
int main()
{
cout << "Point Cloud Example by KONGINEER" << endl;
// Define the point cloud
pclCloud::Ptr cloud(new pclCloud);
// Manually add 5 points to the point cloud
pclType point1(1.0, 2.0, 3.0);
pclType point2(4.0, 5.0, 6.0);
pclType point3(7.0, 8.0, 9.0);
pclType point4(10.0, 11.0, 12.0);
pclType point5(13.0, 14.0, 15.0);
cloud->push_back(point1);
cloud->push_back(point2);
cloud->push_back(point3);
cloud->push_back(point4);
cloud->push_back(point5);
// Save the point cloud to a PLY file
pcl::io::savePLYFileASCII("outputCloud.ply", *cloud);
std::cout << "PointCloud saved to outputCloud.ply." << std::endl;
return 0;
}
이미 만들어져 파일로 저장된 데이터를 읽어 사용하는것 역시 어렵지 않습니다. 아래 코드와 같이 파일명과 위치를 불러오는 함수에 넣어주면 PointCloud 오브젝트로 데이터를 불러올 수 있습니다.
// PCL Basic Example Code
// 2024.1.28
// KONGINEER
//
#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
typedef pcl::PointXYZ pclType;
typedef pcl::PointCloud<pclType> pclCloud;
using namespace std;
int main()
{
cout << "Point Cloud Example by KONGINEER" << endl;
// Define the point cloud
pclCloud::Ptr cloud(new pclCloud);
pcl::io::loadPLYFile("outputCloud.ply", *cloud);
std::cout << "PointCloud loaded from outputCloud.ply." << std::endl;
return 0;
}
데이터 처리하기
Point Cloud 데이터를 처리하는 기능은 여러가지가 있지만, 이번 포스팅에서는 간단히 일부 point를 옮기는 기능으로 Point Cloud 데이터를 활용하는 개념의 이해를 위한 예시를 소개드리도록 하겠습니다.
// PCL Basic Example Code
// 2024.1.28
// KONGINEER
//
#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
typedef pcl::PointXYZRGB pclType;
typedef pcl::PointCloud<pclType> pclCloud;
using namespace std;
int main()
{
// Use your file name
string file_name = "bottle.ply";
// Load PLY file
pclCloud::Ptr cloud(new pclCloud);
if (pcl::io::loadPLYFile<pclType>(file_name, *cloud) == -1) {
PCL_ERROR("Couldn't read file your_file.ply\n");
return (-1);
}
// Define the range for x and y
float min_x = -0.08;
float max_x = -0.02;
float min_y = -0.09;
float max_y = -0.026;
// Move points within the specified range by 0.1 in the x-axis
for (size_t i = 0; i < cloud->size(); ++i) {
if (cloud->points[i].x >= min_x && cloud->points[i].x <= max_x &&
cloud->points[i].y >= min_y && cloud->points[i].y <= max_y) {
cloud->points[i].x += 0.1;
}
}
// Save the modified point cloud
pcl::io::savePLYFile("bottle_modified.ply", *cloud);
return 0;
}
PCL에는 이보다 더 복잡하고 다양한 기능을 API로 제공하는데, 이 중 일부 유용한 기능들은 추후 별도 포스팅에서 소개드리고자 합니다. 또 PCL 홈페이지에 공식 예제들도 있으니 참고하시면 기능 사용법 이해에 도움이 되실 것 같습니다.
마무리
이번 포스팅에서는 Point Cloud에 대한 기본적인 내용 소개와 PCL을 활용하여 프로그래밍에 Point Cloud 데이터를 이용하는 방법에 대해 소개해 보았습니다. 이 글을 읽으시는 분들 중에는 어느정도 Point Cloud에 대해 알고 계시는 분들도 계실 것이고 분야가 달라 거의 모르시는 분들도 있으실 것 같습니다. 최대한 여러 분들에게 정보를 드리고자 가장 기본적인 내용부터 약간의 기술적인 내용까지 함께 다루어 보았는데, 이 내용 이해에 도움이 되었으면 합니다.
최근 몇년을 돌아보면 자율주행의 기대감과 함께 3D 데이터에 대한 개념에 대해 관심을 가지는 사람들이 정말 많아진 것 같습니다. 라이다라는 용어도 불과 몇년 전만 해도 관련 분야에 있는 사람들 사이에서만 알려지던 내용인데, 이제는 자율주행에 대해 투자라도 하는 분이라면 자연스럽게 알게될 수 있는 용어가 되었습니다. 지금 이 글을 읽으시는 분들 모두 이 흐름에 먼저 타게되시는 분들이라고 생각합니다.
요약하자면, Point Cloud 데이터는 우리 주변의 현실을 작은 점으로 표현한 것이며, 이는 자율 주행부터 제조업까지 다양한 분야에서 유용하게 활용되고 있습니다. 이 기술은 현대 기술의 중요한 부분을 차지하고 있으며, 앞으로 더 많은 혁신을 이끌어낼 것으로 기대됩니다.
이러한 기술은 자율 주행, 생산라인에서의 품질 향상 등 다양한 분야에서 혁신을 이끌어내고 있습니다. PCL과 같은 도구를 활용하면 누구나 쉽게 Point Cloud 데이터를 다룰 수 있어, 이를 통한 창의적인 응용이 더욱 기대됩니다. 앞으로도 기술의 발전과 산업 현장에서의 다양한 활용을 지켜봐야 할 것입니다. 감사합니다.