0. 이론 공부
교재
선형대수, 확률통계, 최적화이론, 동적시스템에 대한 수학적인 기초가 있어야 완벽하게 이해할수 있음
(1) SLAM 이해와 구현 -> 국내 SLAM 연구 및 개발자들이 정리한 입문자용 문서, 기초부터 이론까지 잘 정리되어 있음, slam 개발자 커뮤니티에서 공개된 자료임
https://drive.google.com/drive/folders/15XG4GKKP7aI3sRqfA2XnlWX9s41cKw02
(2) 자율주행을 위한 비주얼 슬램, 가오시앙, 장타오 저, 김필은 번역, 지니북스, 2023년 -> 카메라만을 사용하는 비주얼 SLAM 기술, 개념 및 이론이 잘 정리되어 있음
(3) 확률론적 로보틱스 , 세바스천 스런 등 저, 남궁영환 번역, 에이콘, 2020년 -> 로보틱스 전공자들의 필수 교재, 매우 수준이 높아서 선형대수, 확률통계, 최적화이론, 동적시스템에 대한 수학적인 기초가 있어야 이해할수 있음, 자율주행, 로보틱스 분야의 대학원 교재, 구글드라이브에 원서 영문 pdf 있음
slam은 지도작성(mapping)과 위치추정(localization)을 동시에 수행하는 알고리즘을 의미
사용알고리즘에 따라 필터기반 slam(칼만필터, 파티클필터, 확장칼만필터 등)과 그래프 기반 slam으로 구분, 현재는 그래프기반 slam이 대세임
사용한 센서에 따라 카메라 기반 slam, 라이다 기반 slam으로 나눔
본 실습에서는 라이다 기반의 slam을 주로 다루겠음
본 실습에서는 구글에서 개발한 그래프기반 slam 기술로 유명한 cartographer(지도 그리는 사람이라는 뜻)를 사용하겠음
slam 패키지인 cartographer 패키지는 rplidar 패키지의 /scan 토픽을 받아서 주변환경의 지도(/map 토픽)를 출력함
Cartographer ROS(ROS1용)
https://google-cartographer-ros.readthedocs.io/en/latest/
ROS2 Cartographer (foxy버전용)
https://ros2-industrial-workshop.readthedocs.io/en/latest/_source/navigation/ROS2-Cartographer.html
Cartographer github(ROS2버전은 dashing버전만 있음)
https://github.com/cartographer-project/cartographer_ros
Cartographer 알고리즘 설명
https://google-cartographer-ros.readthedocs.io/en/latest/algo_walkthrough.html
cartographer_node, occupancy_grid_node 설명
https://google-cartographer-ros.readthedocs.io/en/latest/ros_api.html
Lua configuration file(SLAM 파라미터 설정파일)
https://google-cartographer-ros.readthedocs.io/en/latest/configuration.html
1. rplidar A1 USB2serial 장치명 고정
[ROS2심화] 2. dynamixel workbench 설치 의 4번을 참고하여 rplidar A1 USB2serial 장치명을 /dev/ttyUSBLidar으로 고정하라.
rplidar의 경우 모든 제품의 제조사id,제품번호,시리얼번호가 동일하므로 이전글에서 첨부파일의 두번째 줄의 정보를 수정없이 사용가능함,
장치명 확인결과 다음처럼 나와야함
$ ls -al /dev/ttyUSB*
앞으로 모든 코드에서 U2D2 사용시는 장치명을 /dev/ttyUSBMotor으로 rplidar의 usb2serial의 경우는 /dev/ttyUSBLidar으로 사용하면됨
2. rplidar A1 패키지 설치
[ROS2기초] 13. Lidar 패키지 작성 게시글에서 이미 설치했음
PC에서 rviz2를 실행하고 scan 데이터를 출력하여 확인할것
PC와 젯슨보드가 모두 같은 공유기에 연결되어야하고 좌측 Displays 메뉴가 아래처럼 설정되어야함
3. cartographer package 설치
리눅스에서 다음처럼 ROS2용 cartographer를 설치한다.
$ sudo apt install ros-eloquent-cartographer
$ sudo apt install ros-eloquent-cartographer-ros
ROS의 분산처리기능을 활용하여 젯슨보드에는 액추에이터나 센서제어패키지를 실행하고 많은 계산량을 필요로하는 slam, localization, navigation패키지는 윈도우즈에서 실행할것임
Windows에서 설치된 foxy버전에는 cartographer가 이미 설치되어 있으므로 윈도우즈에서 cartographer를 실행하겠음
4. cartographer 실행
젯슨보드와 PC가 같은 네트워크에 연결되어 있어야함
젯슨보드와 PC의 ROS_DOMAIN_ID를 같은 값으로 설정할것, 다른 로봇과는 다른값을 사용해야함
젯슨보드에서 할일
(1) 터미널을 새로열고 rplidar 패키지 실행 : /scan 토픽을 퍼블리시해야함, 토픽확인할것
(2) 터미널을 새로열고 dynamixel_workbench_controllers 실행
윈도우즈에서 할일
(1) 첨부한 lua파일을 적당한 곳에 다운로드
오도메트리(odometry) 또는 imu 정보를 사용하지 않고 오직 라이다정보만을 이용하여 수행하도록 설정됨
lua파일의 옵션을 사용자 환경에 맞게 적절하게 수정해야 함
파일은 터틀봇3용으로 만들어진 것이라 사용하는 라이다 제품에 맞게 수정필요함
(2) 터미널을 새로열고 occupancy_grid_node 실행 : 최종 map을 저장해주는 노드
> ros2 run cartographer_ros occupancy_grid_node -resolution 0.05 -publish_period_sec 1.0
(3) 터미널을 새로열고 cartographer_node 실행 : submap을 작성하여 퍼블리시하면 occupancy_grid_node 에서 map을 완성
> ros2 run cartographer_ros cartographer_node -configuration_directory <lua파일경로> -configuration_basename turtlebot3_lds_2d.lua
(4) 터미널을 새로열고 rviz2를 실행하여 map을 출력
> ros2 run rviz2 rviz2
좌측하단메뉴에서 add 클릭->by topic 탭클릭 -> /map Map 클릭
(5) 터미널을 새로열고 dynamixel_workbench_operators 실행
지도에는 고정된 환경만 포함된다. 따라서 움직이는 물건을 모두 제거한 후 SLAM을 실행해야한다.
slam을 시작할때 로봇의 출발위치를 기억해둬야함 따라서 기억하기 쉬운 지점에서 출발하고 반드시 테이프로 표시해둘것
로봇을 원격조종하면서 공간 구석구석을 주행하면서 주변환경을 스캔한다. 지도가 실제환경과 가장 비슷하면 아래 명령어로 저장한다.
로봇이 출발점으로 반드시 다시 돌아오도록 조종해야한다. 출발점으로 돌아오는 순간 slam 알고리즘은 오차를 보정할수 있다.
따라서, 고정밀 지도작성을 위해서는 반드시 출발점으로 돌아오도록 해야함(loop closure)
SLAM 잘하는 요령
- 주행 및 이동 전략
(9) 아래 동영상처럼 실험과정을 저장하라.
5. 과제
- SLAM의 정의와 원리를 조사하시오.
- SLAM 알고리즘의 종류와 장단점을 조사하시오.
(2) 연구실, PC실, 복도 등의 지도를 작성하시오.
(3) cartographer 설정파일인 lua파일의 설정 파라미터를 조사하시오.
(4) pgm 파일형식을 설명하고 맵에서 검정색, 흰색, 회색의 의미를 설명하시오.
(5) 최종결과물 map.yaml의 내용을 설명하시오. 파일의 내용을 이용하여 map의 원점의 좌표를 어떻게 구하는지 설명하라.
(6) rqt_graph를 이용하여 slam을 실행하는 동안 모든 노들들이 주고받는 토픽을 조사하시오.
(7) (6)에서조사된 토픽에 포함된 정보를 설명하시오.
(8) ros2용 다른 slam 패키지를 조사하시오. cartographer와 성능을 비교하시오.
(9) gazebo simulator를 이용하여 cartographer를 이용하여 맵을 작성하시오.