앞 장에서는 패키지에 대한 기본적인 설명이나 동작 원리에 대해서 기술했다. 본 장에서는 해당 ROS 패키지가 어떤 구조를 가지고있으며, 각각을 구성하는 모듈들은 어떤 역할을 하는지 기술한다.
3. 패키지 개요
3.1 패키지 구성
의존 라이브러리
- PCL (Point Cloud Library - pcd 핸들링 라이브러리)
- OpenMP (C/C++ 기반 CPU 병렬처리 라이브러리)
필요 패키지
- pcl_ros (ros 환경에서 PCL을 활용하기 위해 필요)
- ndt_omp (Scan matching 알고리즘)
- fast_gicp (Scan matching 알고리즘2)
- hdl_global_localization (전역 환경에서 relocalize하기위해 사용)
PCL 알고리즘은 포인트클라우드를 다루기 위한 라이브러리이다. 라이다에서 출력되는 데이터를 효율적으로 관리하고 조작하기 위해 사용된다. OpenMP는 CPU의 병렬처리 라이브러리로, 시간소모가 큰 스캔매칭 알고리즘을 병렬화 하는 목적으로 사용된다.
pcl_ros는 위와 같이 PCL을 ros환경에서 사용하기 위해 의존하고, ndt_omp는 스캔매칭 알고리즘이다. fast_gicp도 스캔매칭 알고리즘이며, NDT 연산을 수행하기 힘든 저사양 연산장치에서 사용하기 위해 의존한다. 그리고 hdl_global_localization은 전역 위치를 재추정하거나, rviz에 지도시각화를 위해 사용되는데 분명 몇 년 전까지만해도 필수가 아니었는데 갑자기 의존하게 되었다. 아마 전역 위치 재추정 기능을 추가하기 위함같은데, 실제로도 launch에서 hdl_global_localization을 제외하고 실행시켜도 전체 프로세스에는 영향을 끼치지 않는다.
3.2 모듈 상세 설명
3.2.1 hdl_locazliation
메인 패키지이며 3개의 주요 소스코드 파일이 있다.
- apps/hdl_localization_nodelet.cpp
- 모든 프로세스의 진행을 담당하는 메인 모듈
- 센서 입력(LiDAR, IMU)부터 위치 출력(Odom)까지 모든 절차가 본 파일에 포함되어있음
- apps/globalmap_server_nodelet.cpp
- 전역 지도 관리 모듈
- PCD, UTM 등 다양한 파일 포멧을 읽어들여 전역지도 생성함
- 생성된 전역 지도를 시각화하거나 외부 파일로 출력
- src/hdl_localization/pose_estimator.cpp
- 위치 연산 모듈
- 오돔과 IMU로부터 현재 위치를 예측함
- 전역지도와 LiDAR 스캔데이터로부터 현재 위치를 측정함
- 예측값과 측정값을 기반으로 칼만필터를 운용하여 정확한 현재 위치를 추정함
본 패키지의 계산 과정은 위 3개 파일에서 동작하며, 뭔가 hdl_localization 패키지를 커스터마이징하여 활용하고싶다면 이 3개의 파일을 수정하는데 대부분의 시간을 사용할것이다. 나머지 파일들은 그다지 중요하지 않다. 더 커스터마이징 할만한 파일들은 스캔매칭 알고리즘이나 무향칼만필터 부분인데, 이건 이미 아이큐 300은 될것같은 사람들이 머리싸매고 만든 라이브러리이다. 아예 다른 라이브러리로 교체할 것이 아니라면 굳이 건들 필요가 없다.
3.2.2 hdl_global_localization
-> 추후 기술 예정
4. 아키텍쳐
4.1 정적 분석 (클래스 다이어그램)
hdl localization의 클래스 구조는 위와 같다. HdlLocalizationNodelet이 메인 클래스 역할이며 코어 역할을 맡고있다. 그 하위로는 실제 연산을 담당하는 Estimator 클래스들이 위치하며, 그 아래로는 Estimator에서 사용하는 무향칼만필터와, Pose, Odom 시스템 클래스가 있다.
4.2 통신 구조 분석
-> 추후 기술 예정
'Project > SLAM' 카테고리의 다른 글
[HDL Localization 사용설명서] 소스코드 상세 설명 (3) (0) | 2023.05.04 |
---|---|
[HDL Localization 사용설명서] 패키지 설명 및 동작 원리 (1) (0) | 2023.05.04 |