본문 바로가기

AI로봇/ROS2+SLAM

AI로봇랩 4강) Cartographer SLAM with ROS2 on Omorobot

Frenz AI로봇랩에서 진행한 AI로봇랩 2기 4강 내용입니다.

3강: https://keep-steady.tistory.com/46

내용

   - Lidar SLAM at JetsonNano with ROS2 (ROS2를 이용하여 JetsonNano에서 라이다 SLAM)

 

참고

 


1) SLAM mapping으로 맵 생성

  • 로봇을 원격으로 조종하며 지도 그린다.
  • 2D YD라이다로 2차원 맵을 생성하고, 만들어진 맵을 가지고 주행하려 한다.
  • 우선 주행하며 맵을 생성해 보자.
  • R1mini의 ROS2 패키지는 Cartographer ROS 패키지 기반으로 개발되었다.
  • Cartographer는 로봇의 Odometry 데이터와 2D 라이다 센서 데이터를 이용하여 맵핑과 내비게이션 수행한다.

 

2) Cartographer SLAM을 위한 노드 실행

  • 4개의 터미널을 열고 2개는 각각 ssh로 r1mini에 (ip가 192.168.0.1인 경우) 접속, 나머지 2개는 PC에서 각각 수행한다

2.1) Terminal 1 (Omorobot)

  • 원격PC에서 SSH를 이용해 r1mini(Omorobot)에 접속한 후 실행
  • Omorobot을 구동하기 위한 bringup node를 실행

 

(terminal 1) >> ssh r1mini@<<로봇IP>>
                ex) ssh@r1mini@192.168.0.1  # IP가 192.168.0.1인 경우
(terminal 1) >> ros2 launch omo_r1mini_bringup omo_r1mini_bringup.launch.py  # bringup node

 

 

 

2.2) Terminal 2 (Omorobot)

  • 원격PC에서 SSH를 이용해 r1mini(Omorobot)에 접속한 후 실행
  • Omorobot이 Cartographer SLAM을 수행하도록 cartographer 노드를 실행

 

(terminal 2) >> ssh r1mini@<<로봇IP>>
                ex) ssh r1mini@192.168.0.1  # 로봇의 IP가 192.168.0.1인 경우 
(terminal 2) >> ros2 launch omo_r1mini_cartographer cartographer.launch.py

 

2.3) Terminal 3 (원격PC)

  • 원격 PC에서 Omorobot을 키보드로 제어(teleop keyboard) 하기 위하여 아래 명령어를 입력한다.

 

(terminal 3) >> ros2 run omo_r1mini_teleop teleop_keyboard

 

 

2.4) Terminal 4 (원격 PC)

  • 원격 PC에서 Omorobot의 주행을 실시간 가시화하기 위해 RVIZ 시뮬레이터를 연다

 

(terminal 4) >> ros2 launch omo_r1mini_cartographer cartographer_rviz.launch.py  # rviz를 실행

 

 

  • PC에서 rviz가 뜨며 아래와 같이 나오는지 확인
  • 방화벽은 public/private 모두 허용 체크

 

 

 

3) 로봇을 원격으로 조종하며 지도 그리기

  • 2) 과정에서 4개의 터미널을 열고 각각 로봇과 원격 PC의 설정을 마쳤다. 그럼 (terminal 3)에 커서를 눌러서 원격PC의 키보드로 teleop keyboard 명령으로 로봇을 제어할 수 있다
  • 이때 키보드로 앞뒤좌우(w, x, a, d)를 눌러 로봇을 천천히 주행한다
  • 장애물에 없고, 움직이는 물체가 없는 곳에서 천천히 2~3바퀴 돌며 지도를 그린 후 정지(s)를 눌러 로봇을 멈춘다
  • 'Loop closure'를 통해 에러를 잡기 위해 한 바퀴를 돌아 제자리로 돌아오도록 주행한다

 

 

 

 

4) 맵 저장 및 ~.yaml 파일 생성

  • 3)의 과정을 수행하면 로봇이 주행한 주변 환경의 지도를 만들 수 있다.

4.1) 지도 생성

  • 아래 명령어를 통해 맵을 생성 한다. <<지도 이름>>에는 맵의 저장 이름을 설정한다. 'map'으로 설정하면 map 이름으로 지도와 yaml파일이 생성된다.

 

1. (terminal 1, r1mini) >> cd ~/ros2_ws  # 저장하고자 하는 clear경로로 이동
2. (terminal 1, r1mini) >> ros2 run nav2_map_server map_saver_cli -f <<지도 이름>>> 명령어로 지도를 저장한다. 여기서 <<지도 이름>>은 사용자가 저장하고자 하는 맵의 이름이다.
                           ex) >> ros2 run nav2_map_server map_saver_cli -f map  # map을 지도의 이름으로 하는 경우

 

 

4.2) 생성된 맵 확인

아래 명령어를 통해 맵이 원하는 저장 경로에 생성되었는지 확인한다. '~.pgm' 파일과 '~.yaml'파일이 생성되면 성공~!

 

>> ls  # map.pgm 그림파일과 map.yaml이 생성되었는지 확인한다

 

 

 

5) SLAM Navigation 실행

5.1) Terminal 1 (Omorobot)

  • Omorobot을 동작시키기 위한 bringup 노드 실행

 

(terminal 1) >> ssh r1mini@192.168.0.1  # IP가 192.168.0.1인 경우
(terminal 1) >> ros2 launch omo_r1mini_bringup omo_r1mini_bringup.launch.py  # bringup node

 

 

5.2) Terminal 2 (Omorobot)

내비게이션 수행 노드 실행, 앞서 제작한 지도 경로를 입력한다

navigation2.launch.py파일을 사용. 앞서 제작한 지도(map.yaml)를 사용하도록 지정

 

(terminal 2) >> ssh r1mini@192.168.144.192
(terminal 2) >> ros2 launch omo_r1mini_navigation2 navigation2.launch.py map:=map.yaml  # navigation2.launch.py파일을 사용. 앞서 제작한 지도(map.yaml)를 사용하도록 지정

 

 

5.3) Terminal 3 (원격 PC))

PC에서 rviz를 통해 시각화하고 제어

 

 

(terminal 3) >> ros2 launch omo_r1mini_navigation2 navigation2_rviz.launch.py

 

5.4) RVIZ 창 활용법

  • 지도 위에 로봇이 있을 것으로 추정되는 위치와 방향에 가져다 놓기 위해 상단의 메뉴 중 2D Pose Estimate 버튼을 눌러 지도에 클릭 후 드래그해준다.
  • 그러면 아래 그림과 같이 로봇의 위치와 함께 주변 장애물들이 표시가 된다.
  • 로봇의 위치가 조금 어긋나더라도 상관없다.
  • 주행을 시작하면서 로봇이 알아서 맞추게 된다.
  • 이제 상단 메뉴에서 Navigation Goal 버튼을 눌러 로봇이 이동하고자 하는 목적지를 누르면 로봇이 스스로 길을 찾아 이동한다!

 

 

 

 

 

우와. 로봇이 처음 가본 장소에서 지도도 만들고 자율주행도 하네요!

끝~!