문무겸비

PCL (point cloud library) 뜯어보기 본문

개인공부

PCL (point cloud library) 뜯어보기

세월의 잔잔한 느낌 2023. 1. 11. 16:21
반응형

"super resolution 프로젝트 따라하기"에서 시작되어, "PCL뜯어보기" 를 분화하기로 결정. 향후 ROS 뜯어보기도 분화 예정

 

Point Cloud Library는 LiDAR를 통해 취득한 pointcloud를 후처리하는데 사용되는 알고리즘을 구현해둔 라이브러리입니다. C++로 구성되어 있기 때문에 다량의 3d point 데이터에 대해서 빠른 처리, 시각화, 구현이 가능합니다

 

window + python으로 제대로 된 패키지도 없이 LiDAR 데이터를 핸들링하는것에 한계를 경험.

또한 대부분의 센서 개발 업체들 역시 ros, C++ 기반으로 작업이 이루어지는 것을 보면서 지금이라도 리눅스+ C++ 환경에 익숙해 져야겠다고 결정. 이를 위해 PCL을 공부를 시작.

 

PCL은 ros가 깔릴 때 자동으로 깔린다. 조심할것.

 

 

https://pcl.gitbook.io/tutorial/part-0/part00-chapter02

 

chapter02 : PCL 설치 (100%) - Tutorial

 

pcl.gitbook.io

위 튜토리얼을 참고하여 CMakelists.txt 작성. CMakelists도 설명 추가 필요.

 

(1)usr/include/pcl-1.8/pcl
(2)usr/lib/x86_64-linux-gnu/cmake/pcl

 

PCL library는 위 경로에 있다. 

 

그러나 pcl_conversion/pcl_conversion.h의 경우 위 경로에 없으며, 아래 경로에 있다.

(3)/opt/ros/melodic/includes

CMakelists에서는 (2) 경로만 링크해주었으나, 실상 (2)에 헤더파일이 있지는 않다. (2) -> (1)로 링크를 걸어주는 내부 기작이 있을것으로 추정

(3) 에 있는 모든 라이브러리(헤더파일)을 (1) 경로에 복붙 해주었다.

 

임형태 님이 작성해주신 Tutorial을 보고 계속 진행

https://limhyungtae.github.io/2021-09-09-ROS-Point-Cloud-Library-(PCL)-0.-Tutorial-%EB%B0%8F-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95/ 

 

ROS Point Cloud Library (PCL) - 0. Tutorial 및 기본 사용법

기본 사용법 및 operation들 정리

limhyungtae.github.io

 

 

tempalte은 바로 직후 함수 or class 에만 적용되는 것이다. 자료형을 정하지 않고, overloading 기능을 구현케 하는것.

[참고]

https://coding-factory.tistory.com/696

https://blockdmask.tistory.com/43

 

그런 점에서, namespace pcl::PointCloud는 대체 무슨 기능인지 알 수가 없다. 선언만 되어 있고 설명이 없으니 원..

[pcl/common/projection_matrix.h] 
namespace pcl
{
  template <typename T> class PointCloud;
  ...
}

 

namespace가 여러 파일에 각각 다른 내용을 서술하며 정의되어 있는데, 컴파일 할 때 합쳐지는 것인가? -> 가능하다

[참고]

https://learn.microsoft.com/ko-kr/cpp/cpp/namespaces-cpp?view=msvc-170

단일 파일의 여러 블록과 여러 파일에서 네임스페이스를 선언할 수 있습니다. 컴파일러가 전처리 중에 파트를 결합하며..

 

moder C++의 smart pointer 

바의 경우 garbage collector를 통해 메모리를 관리하지만 c++은 사용자가 스스로 메모리를 할당 해제를 통해 관리해야 한다. c에서는 malloc, free로 메모리를 할당및 해제를 수행하고 c++은 new, delete를 사용한다. 이때 할당받은 메모리를 해제하지 않을경우 프로그램은 계속 사용하고 있는 메모리로 인지하고 해당 메모리를 사용하지 않는 메모리 누수(memory leak)가 발생한다. 이와 같은 메모리 누수를 방지하기 위해 스마트 포인터를 제공해준다.

 

smart pointer는 new 연산자와 관련이 있다. 

 

[참고]

https://min-zero.tistory.com/entry/C-STL-1-3-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%8A%A4%EB%A7%88%ED%8A%B8-%ED%8F%AC%EC%9D%B8%ED%84%B0smart-pointer

 

 

new 연산자는 c에서의 malloc과 역할이 동일하다. 더 직관적이고 간단해졌다.

C lang - malloc - free

C++ - new - delete

[참고]

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tipsware&logNo=221067724735

 

auto/static/extern 변수

C lang에서는 auto는 의미 없다.(사실상 사용x) 그러나 C++에서는 자료형 추론에 쓰인다.(template)과 유사

#include <initializer_list>

int main()
{
    // std::initializer_list<int>
    auto A = { 1, 2 };
    // std::initializer_list<int>
    auto B = { 3 };
    // int
    auto C{ 4 };
    // C3535: cannot deduce type for 'auto' from initializer list'
    auto D = { 5, 6.7 };
    // C3518 in a direct-list-initialization context the type for 'auto'
    // can only be deduced from a single initializer expression
    auto E{ 8, 9 };
    
    auto a = true;
    auto b = 'Y';
    auto c = L'Y';
    auto d = "문자열";
    auto e = 26;
    auto f = 3.12;
    auto g = 10000000000;

    auto &h = e;//참조
    auto *i = &e;//포인터

    return 0;
}

static은 지역변수로 선언되면 함수가 시작될 때 할당되며 프로그램이 종료될 때 해제

전역변수로 선언되면 프로그램이 시작될 때 할당되며 프로그램이 종료될 때 해제

extern 변수는 외부 소스에서 변수를 가져와서 사용할 수 있다.

단, static으로 선언된 변수는 외부 소스에서도 extern 변수로 사용할 수 없다.

[참고]

https://dydtjr1128.github.io/cpp/2019/06/04/Cpp-auto.html

https://code4human.tistory.com/128

https://gracefulprograming.tistory.com/54

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dd1587&logNo=221106199316 

 

const 변수는 초기화 이후 변경 불가능한 변수를 의미한다

 

 

반응형