Ubuntu ROS 실습(40)

zeusqoi·2일 전

개인공부 - ubuntu

목록 보기
59/64

이번에는 ROS 2의 SLAM과 Nav2를 이용해 TurtleBot3의 지도 생성 및 내비게이션 실습을 진행했다. Gazebo에서 시뮬레이션 환경을 실행하고, 주변 환경의 지도를 생성한 뒤 파일로 저장했다. 이후 저장한 지도를 불러와 RViz에서 목표 지점을 지정하고 로봇의 이동을 확인했다. 실습 과정에서는 Nav2의 경로 생성과 위치 추정 상태를 확인했으며, 내비게이션이 정상적으로 완료되지 않는 문제도 분석했다.


1. SLAM을 이용한 지도 생성

SLAM은 Simultaneous Localization and Mapping의 약자로, 로봇이 자신의 위치를 추정하면서 주변 환경의 지도를 동시에 생성하는 기술이다.

앞선 실습에서는 Gazebo에서 TurtleBot3 Burger 모델을 실행하고 키보드 텔레오퍼레이션을 이용해 로봇의 이동과 회전을 제어했다. 이번에는 시뮬레이션 환경에서 주변 정보를 수집해 지도를 생성하고, 이후 내비게이션에서 사용할 수 있도록 저장했다.

지도 생성 과정에서는 로봇의 센서 정보와 맵 데이터가 사용된다. 생성된 지도는 RViz에서 확인할 수 있으며, Nav2를 실행할 때 로봇의 위치를 추정하고 목표 지점까지의 경로를 계산하는 데 활용할 수 있다.


2. 생성한 지도 저장

지도를 생성한 다음에는 생성된 맵 데이터를 파일로 저장했다.

이번 실습에서 저장한 파일은 다음과 같다.

  • turtlebot3_map.pgm: 지도 이미지 데이터
  • turtlebot3_map.yaml: 지도 설정 및 메타데이터

PGM 파일에는 지도 이미지가 저장되고, YAML 파일에는 지도 이미지의 경로와 해상도, 원점 등의 정보가 저장된다. Nav2에서 저장한 지도를 사용하려면 YAML 파일을 통해 지도 정보를 불러와야 한다.

지도 저장 과정에서 /map 토픽으로부터 187 × 193 크기의 맵 데이터를 수신한 것을 확인했다. 이후 다음 경로에 지도 파일이 저장됐다.

/home/namseungjoo/turtlebot3_ws/maps/turtlebot3_map.pgm
/home/namseungjoo/turtlebot3_ws/maps/turtlebot3_map.yaml

터미널에는 Map saved successfully라는 메시지가 출력됐다. 이를 통해 지도 저장이 정상적으로 완료된 것을 확인했다.

저장한 지도는 이후 Nav2를 실행할 때 사용했다.


3. 저장한 지도를 이용해 Nav2 실행

지도를 저장한 다음에는 해당 지도를 이용해 Nav2 내비게이션을 실행했다.

Nav2는 ROS 2에서 로봇의 자율 이동을 담당하는 내비게이션 프레임워크다. 로봇의 위치 추정, 경로 계획, 경로 추종 등의 기능을 제공하며, 목표 지점까지 이동할 수 있도록 여러 노드가 함께 동작한다.

먼저 ROS 2와 워크스페이스 환경을 설정했다.

source /opt/ros/humble/setup.zsh
source ~/turtlebot3_ws/install/setup.zsh

이후 다음 명령어로 내비게이션을 실행했다.

ros2 launch turtlebot3_navigation2 navigation2.launch.py \
  map:=/home/namseungjoo/turtlebot3_ws/maps/turtlebot3_map.yaml \
  use_sim_time:=True

각 설정의 의미는 다음과 같다.

  • turtlebot3_navigation2 navigation2.launch.py: TurtleBot3 내비게이션 실행
  • map:=...: 저장한 지도 YAML 파일의 경로 지정
  • use_sim_time:=True: 시스템 시간이 아닌 Gazebo의 시뮬레이션 시간을 사용하도록 설정

Nav2가 실행되면 저장된 지도를 기반으로 위치 추정과 경로 계획을 진행할 수 있다.


4. RViz에서 초기 위치 및 목표 지점 설정

Nav2를 실행한 후에는 RViz에서 지도와 로봇의 상태를 확인했다.

4-1. 초기 위치 지정

내비게이션을 시작하려면 로봇이 지도상에서 어느 위치에 있는지 지정해야 한다. 이를 위해 RViz의 2D Pose Estimate 기능을 사용해 로봇의 초기 위치와 방향을 설정했다.

초기 위치는 Gazebo에서 로봇이 실제로 있는 위치와 일치하도록 지정해야 한다. 초기 위치가 부정확하면 위치 추정과 경로 계획에 영향을 줄 수 있다.

4-2. 목표 지점 설정

초기 위치를 지정한 다음에는 RViz의 Nav2 Goal 기능을 이용해 목표 지점을 설정했다.

목표 지점이 지정되면 Nav2는 현재 위치에서 목표 위치까지의 경로를 계산한다. 이후 컨트롤러가 경로를 따라 이동하도록 속도 명령을 생성한다.


5. 로봇 이동 확인

목표 지점을 지정한 뒤 로봇의 움직임을 확인했다. 로봇이 회전하거나 실제로 이동하는 동작은 확인할 수 있었다.

하지만 목표 지점까지 안정적으로 이동하지 못하고, 복구 동작이 반복되거나 내비게이션이 중단되는 문제가 발생했다.

따라서 로봇의 이동 자체는 확인했지만, 목표 지점까지의 내비게이션이 정상적으로 완료됐다고 보기는 어려웠다.


6. 내비게이션 문제 분석

로봇이 목표 지점까지 이동하지 못하는 원인을 확인하기 위해 ROS 2의 토픽과 액션 정보를 확인했다.

6-1. 전역 경로 확인

먼저 /plan 토픽을 확인했다.

ros2 topic echo /plan --once

명령어 실행 결과 경로 데이터가 출력됐다. 이를 통해 전역 경로가 생성되는 단계는 작동하고 있다는 것을 확인했다.

전역 경로는 로봇이 현재 위치에서 목표 지점까지 이동하기 위한 전체적인 경로를 의미한다. 하지만 전역 경로가 생성됐다고 해서 로봇이 실제로 해당 경로를 따라 이동할 수 있다는 뜻은 아니다.

6-2. 위치 추정 확인

다음으로 /amcl_pose 토픽을 확인했다.

ros2 topic echo /amcl_pose --once

실행 결과 frame_id가 map인 위치 추정 메시지가 출력됐다.

AMCL은 저장된 지도와 센서 정보를 이용해 로봇의 위치를 추정하는 기능이다. 위치 추정 결과는 확인할 수 있었지만, 로그에서는 초기 위치와 좌표 변환에 관한 경고도 반복적으로 나타났다.

따라서 위치 추정 메시지가 출력된다는 사실만으로 위치 추정 과정이 모두 정상이라고 판단할 수는 없었다.

6-3. 경로 추종 액션 확인

Nav2가 경로를 실제로 추종하도록 요청하는 /follow_path 액션도 확인했다.

ros2 action list -t | grep follow_path

/follow_path 액션이 검색되는 것을 확인했다. 이어서 액션 서버 정보를 확인했다.

ros2 action info /follow_path

확인 결과 동일한 이름의 /controller_server가 두 개 표시됐다.

또한 /cmd_vel 토픽의 정보를 확인했을 때 behavior_server가 여러 개의 발행자로 나타나는 현상도 발견했다.

ros2 topic info /cmd_vel -v

이 결과를 바탕으로 Nav2 컴포넌트가 중복 등록됐을 가능성을 확인했다. 다만 중복 등록이 로봇의 이동 문제를 직접 일으킨 원인인지는 아직 확정하지 못했다.


마무리

이번 실습에서는 SLAM을 이용해 지도를 생성하고 저장한 뒤, 저장한 지도를 활용해 TurtleBot3의 Nav2 내비게이션을 진행했다.

RViz에서 초기 위치와 목표 지점을 설정하고 로봇의 회전 및 이동 동작을 확인했다. 또한 /plan에서 전역 경로가 생성되고 /amcl_pose에서 위치 추정 결과가 출력되는 것도 확인했다.

하지만 목표 지점까지 안정적으로 이동하는 데에는 문제가 있었다. 내비게이션 중 복구 동작이 반복됐으며, Nav2의 액션 서버와 속도 명령 발행자에서 중복 등록으로 의심되는 현상도 발견했다.

이번 실습을 통해 지도를 생성하고 저장하는 과정뿐만 아니라, 저장된 지도를 활용해 위치를 추정하고 경로를 추종하는 과정까지 확인할 수 있었다. 특히 경로가 생성되는 것과 로봇이 실제로 목표 지점까지 도달하는 것은 별개의 단계라는 점을 알 수 있었다.

다음에는 Nav2 컴포넌트 중복 등록과 위치 추정 및 경로 추종 문제를 추가로 분석해, 로봇이 목표 지점까지 안정적으로 이동할 수 있도록 개선할 예정이다.

0개의 댓글