Cartographer 사용하여 SLAM하기

Cartographer 소개 #

Cartographer(카르토그래퍼)는 구글에서 개발한 SLAM 라이브러리입니다.

카르토그래퍼는 다양한 플랫폼과 센서(라이다이든 카메라 비젼이든)구성에서 2D 및 3D 환경의 SLAM을 “실시간“으로 제공합니다.

High level system overview of Cartographer (출처: https://google-cartographer.readthedocs.io/en/latest/)

카르토그래퍼 ROS 설치하기 #

카르토그래퍼는 독립적인(Standalone) C++ 라이브러리로서 ROS를 위한 바이너리 패키지를 제공하므로 apt 명령어를 사용하여 간단하게 설치할 수 있습니다.

패키지 이름은 ros-패키지버전-cartographer-ros 입니다.

$ sudo apt install ros-melodic-cartographer-ros

Cartographer SLAM하기 #

omo_r1mini_cartographer 사용하여 mapping 하기 #

먼저 mapping 을 위해 cartographer 노드를 띄웁니다. 이 과정을 수행하기 위해 총 5개의 터미널이 필요합니다.

아래 와면에서 좌측이 HOST PC, 우측이 ROBOT PC입니다.

roscore를 띄우고 로봇을 구동하기 위한 omo_r1mini_robot.launch 그리고 cartographer를 차례대로 띄워줍니다.

hostpc:~$ roscore
r1mini:~$ roslaunch omo_r1mini_bringup omo_r1mini_robot.launch
r1mini:~$ roslaunch omo_r1mini_cartographer omo_r1mini_cartographer.launch

그리고 rviz를 띄우기 위해 HOST PC에서 다음을 입력하면

hostpc:~$ roslaunch omo_r1mini_cartographer omo_r1mini_cartographer_rviz.launch

다음과 같은 rviz 화면이 뜨면서 지도가 보이기 시작합니다.

이제 로봇을 움직여야겠죠?

마지막으로 HOST PC에서 omo_r1mini_teleop_key.launch 를 띄워서 로봇을 이리저리 움직여봅니다.

hostpc:~$ roslaunch omo_r1mini_teleop omo_r1mini_teleop_key.launch

그러면 이렇게 지도가 생성이 됩니다.

앞서의 gmapping과의 차이점이라면 지도의 생성이 좀더 빠르고 부드럽다는 점입니다.

map 저장하기 #

cartographer에서 생성된 지도를 고정된 지도(pgm 파일 형식, Fixed)로 만들거나 확장 가능한 지도 (pbstream)로 저장할 수 있습니다. cartographer 네비게이션을 사용하기 위해서는 pbstream으로 저장합니다.

yaml 파일 생성 #

마찬가지로 지도 생성이 완료되었으면 맵을 저장할 폴더로 이동하여 map_server 명령어로 map을 저장합니다.

$ cd to map folder
$ rosrun map_server map_saver -f map
[ INFO] [1636677468.897507631]: Waiting for the map
[ INFO] [1636677469.185146437]: Received a 336 X 244 map @ 0.050 m/pix
[ INFO] [1636677469.185166480]: Writing map occupancy data to map.pgm
[ INFO] [1636677469.186564869]: Writing map occupancy data to map.yaml
[ INFO] [1636677469.186609286]: Done

그러면 map.pgm 파일과 map.yaml 파일이 생성이 됩니다.

이 파일을 사용하여 navigation을 수행할 수 있습니다.

map.pbstream 생성 #

cartographer SLAM이 실행중인 상태에서 ~/catin_ws/src/omo_r1mini/omo_r1mini_cartographer/scripts 안에 save_pbstream.sh 를 실행합니다.

r1mini:~$ ./catkin_ws/src/omo_r1mini/omo_r1mini_cartographer/scripts/save_pbstream.sh 
status: 
  code: 0
  message: "Finished trajectory 0."
status: 
  code: 0
  message: "State written to '/home/r1mini/Downloads/map.pbstream'."
Map saved to /home/r1mini/Downloads/map.pbstream

이제 map.pbstream 이라는 파일이 HOME/Downloads 안에 저장되었습니다.

이 파일을 omo_r1mini_navigation2/maps 로 복사합니다.

r1mini:~$ cd Downloads/
r1mini:~/Downloads$ cp map.pbstream ~/catkin_ws/src/omo_r1mini/omo_r1mini_navigation2/maps/

Cartographer mapping 동영상 #

다음 동영상은 지금까지 수행한 과정을 정리한 것입니다.

Cartographer Navigation #