본문으로 바로가기

ROS 2 Humble에서 TurtleBot3 시뮬레이션

category 강좌/ROS2 2026. 5. 12. 02:03

1. 목표

 

이번 글에서는 ROS 2 Humble 환경에서 TurtleBot3을 Gazebo 시뮬레이션으로 실행하고, 키보드 조종, SLAM, Navigation2까지 실습하는 전체 과정을 다룹니다.

 

최종적으로 다음을 할 수 있어야 합니다.

 
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
ros2 run turtlebot3_teleop teleop_keyboard
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME/map.yaml

 

 

 

2. 실습 환경

권장 환경은 아래와 같습니다.

        항목                                                                       권장값

 

OS Ubuntu 22.04 LTS
ROS 2 Humble Hawksbill
Simulator Gazebo Classic / ROS Gazebo package
Robot TurtleBot3 Burger, Waffle, Waffle Pi
Shell bash
GPU 없어도 가능하나 있으면 Gazebo가 부드럽습니다

 

ROS 2 Humble의 deb 패키지는 Ubuntu Jammy 22.04를 대상으로 제공됩니다. 따라서 초보자는 Ubuntu 20.04나 24.04가 아니라 22.04에서 시작하는 것이 가장 안전합니다.

 

 

 

3. ROS 2 Humble 설치

 

Humble 설치 블로그 아래 링크를 참조해 주세요

 

https://makingrobot.tistory.com/284

 

 

 

 

4. 개발 도구 설치

 

Humble 개발 환경 설치 블로그 아래 링크를 참조해 주세요

 

https://makingrobot.tistory.com/286

 

 

 

5. TurtleBot3 패키지 설치

 

ROBOTIS 공식 Quick Start에서는 ROS 2 Humble 기준으로 Gazebo, Cartographer, Navigation2 관련 패키지 설치를 안내합니다. 설치에 상당한 시간이 소요됩니다.

 

sudo apt install -y \
  ros-humble-gazebo-* \
  ros-humble-cartographer \
  ros-humble-cartographer-ros \
  ros-humble-navigation2 \
  ros-humble-nav2-bringup

 

 

 

 

TurtleBot3 관련 패키지 설치:

 

sudo apt install -y \
  ros-humble-turtlebot3 \
  ros-humble-turtlebot3-msgs \
  ros-humble-turtlebot3-gazebo \
  ros-humble-turtlebot3-teleop \
  ros-humble-turtlebot3-cartographer \
  ros-humble-turtlebot3-navigation2

 

 

 

 

설치 확인 :

 

ros2 pkg list | grep turtlebot3

 

 

 

ROS Index 기준으로 turtlebot3_gazebo는 TurtleBot3용 Gazebo 시뮬레이션 패키지입니다.

 

 

 

 

6. TurtleBot3 모델 환경 변수 설정

 

TurtleBot3는 모델 종류에 따라 URDF, 파라미터, 센서 구성이 달라집니다.

 

대표 모델:

               모델                                                                 특징
burger 가장 가볍고 기본 실습에 적합
waffle Burger보다 크고 센서 구성이 많음
waffle_pi Raspberry Pi Camera 기반 모델

 

가장 많이 쓰는 모델은 burger입니다.

 

아래의 명령을 실행하여 TurtleBot3의 모델을 burger로 설정합니다. 

 

echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

 

 

설정 확인 :

 

echo $TURTLEBOT3_MODEL

 

 

다른 모델을 쓰려면:

 
export TURTLEBOT3_MODEL=waffle
 

 

또는:

 
export TURTLEBOT3_MODEL=waffle_pi

 

 

추가로 가제보가 설치된 환경을 설정해야 정상적으로 실행됩니다. 아래의 명령을 .bashrc에 등록합니다.

 

echo "source /usr/share/gazebo/setup.sh" >> ~/.bashrc
source ~/.bashrc

 

 

 

 

7. Gazebo 시뮬레이션 실행

a. Empty World 실행

 

가장 기본 월드입니다.

 

ros2 launch turtlebot3_gazebo empty_world.launch.py

 

 

실행되면 Gazebo 창에 TurtleBot3가 나타납니다. 만약 정상적으로 실행이 되지 않을 경우 Ubuntu를 재부팅하고 다시 시도해 보시기 바랍니다.

 

 

 

b. TurtleBot3 World 실행

 

가장 많이 쓰는 기본 실습 월드입니다.

 

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

 

 

이 월드는 SLAM, Navigation2 실습에 적합합니다.

 

 

 

 

c. House World 실행

 

ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py

 

 

잡한 실내 환경을 테스트할 때 사용합니다. 가제보 실행에 상당한 시간이 소요됩니다.

혹시 이전에 Gazebo를 실행하고 종료했는데 위의 명령이 정상적인 실행이 되지 않을 때에는 아래와 같이 완전히 정리한 후에 다시 실행하시기 바랍니다.

 

killall gzserver gzclient gazebo
rm -rf ~/.gazebo/paging
rm -rf ~/.gazebo/ogre.log

 

 

 

 

ROBOTIS e-Manual은 TurtleBot3 Simulation에서 Gazebo Simulation 실행 절차를 공식적으로 제공합니다.

 

 

https://emanual.robotis.com/docs/en/platform/turtlebot3/simulation/?utm_source=chatgpt.com

 

ROBOTIS e-Manual

 

emanual.robotis.com

 

 

 

 

8. 현재 ROS 2 토픽 확인

새 터미널을 열고 가장 많이 쓰는 기본 실습 월드를 실행합니다.

 

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

 

 

새 터미널을 열고 토픽 목록을 확인합니다.

 

ros2 topic list

 

 

아래와 같은 토픽들이 보입니다.

 

 

각 토픽 의미:

 

                                           토픽                                                                                             의미
/cmd_vel 로봇 속도 명령
/odom 오도메트리
/scan LiDAR 스캔 데이터
/tf 좌표 변환
/clock 시뮬레이션 시간
/joint_states 바퀴 조인트 상태
/robot_description URDF 로봇 모델

 

 

 

9. 키보드로 TurtleBot3 조종하기

 

Gazebo가 실행된 상태에서 새 터미널에서 teleop_keyboard를 실행합니다.

 

ros2 run turtlebot3_teleop teleop_keyboard

 

 

조작 키:

        w
   a    s    d
        x

w : 전진
x : 후진
a : 좌회전
d : 우회전
s : 정지
 

 

실제로 이 노드는 /cmd_vel 토픽으로 geometry_msgs/msg/Twist 메시지를 발행합니다.

 

cmd_vel 토픽 확인:

 

ros2 topic echo /cmd_vel

 

 

 

키보드를 누르면 다음과 비슷한 메시지가 나옵니다.

 

 

 

 

 

10. ROS 2 노드 구조 이해

 

실행 중인 노드 확인:

 

ros2 node list

 

 

노드 정보 확인:

 

ros2 node info /robot_state_publisher

 

 

토픽 타입 확인:

 

ros2 topic info /scan

 

 

ros2 interface show sensor_msgs/msg/LaserScan

 

 

/scan은 TurtleBot3의 LiDAR 데이터입니다. SLAM과 Navigation2에서 핵심 입력으로 사용됩니다.

 

 

 

11. RViz2로 TurtleBot3 보기

 

새 터미널:

 

rviz2

 

 

 

 

RViz2에서 다음을 설정합니다.

 

Fixed Frame은 odom를 선택(slam 중에는 map 선택) 합니다.

 

 

왼쪽 아래 Add 클릭 후 추가:

 

                             Display                                                                                Topic
RobotModel /robot_description
TF /tf
LaserScan /scan
Odometry /odom

 

 

LiDAR가 정상이라면 TurtleBot3 주변에 점 형태의 LaserScan이 표시됩니다.

 

 

 

 

 

12. SLAM 실행하기

 

SLAM은 로봇이 이동하면서 지도를 만드는 기능입니다. TurtleBot3에서는 Cartographer를 많이 사용합니다.

 

먼저 Gazebo 실행:

 

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

 

 

 

새 터미널에서 Cartographer 실행:

 

ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True

 

 

 

 

use_sim_time:=True가 중요합니다. Gazebo 시뮬레이션에서는 실제 PC 시간이 아니라 /clock 토픽의 시뮬레이션 시간을 사용해야 합니다.

 

새 터미널에서 키보드 조종:

 

ros2 run turtlebot3_teleop teleop_keyboard

 

 

로봇을 천천히 움직이면 RViz2에 지도가 만들어집니다.

 

 

 

 

키보드로 터틀봇 3을 움직여 아래와 같이 완전한 지도를  작성합니다.

 

 

 

13. SLAM 지도 저장하기

 

지도 작성이 끝났다면 새 터미널에서:

 

mkdir -p ~/maps
cd ~/maps

 

 

지도 저장:

 

ros2 run nav2_map_server map_saver_cli -f turtlebot3_map

 

 

생성 파일:

 

turtlebot3_map.pgm
turtlebot3_map.yaml

 

 

아래의 명령을 실행하여 yaml 파일의 내용을 확인합니다.

 

gedit turtlebot3_map.yaml

 

 

turtlebot3_map.pgm은 파일은 파일 탐색기를 실행하여 파일을 더블클릭하면 이미지 뷰어로 볼 수 있습니다.

 

 

 

 

14. Navigation2 실행하기

 

Navigation2는 저장된 지도를 기반으로 로봇을 목적지까지 자동 이동시키는 ROS 2 내비게이션 스택입니다. ROBOTIS Quick Start에서도 Navigation2와 nav2_bringup 설치를 안내합니다.

 

먼저 Gazebo 실행:

 

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

 

 

 

새 터미널에서 Navigation2 실행:

 

ros2 launch turtlebot3_navigation2 navigation2.launch.py \
  use_sim_time:=True \
  map:=$HOME/maps/turtlebot3_map.yaml

 

 

 

 

a. 초기 위치 설정

 

상단 메뉴에서 "2D Pose Estimate"를 선택하고 로봇의 실제 위치와 방향을 지도 위에 지정합니다.

 

 

 

 

b. 목적지 설정

 

상단 메뉴에서 "Nav2 Goal"를 선택하고  원하는 위치를 클릭하고 방향을 드래그합니다.

 

 

그러면 TurtleBot3가 자동으로 경로를 생성하고 이동합니다.

 

 

 

 

주행을 계속해서 목적지에 도달합니다.

 

 

 

 

15. 자주 쓰는 명령어 정리

 

a. 패키지 확인

 

ros2 pkg list | grep turtlebot3

 

 

 

b. 런치 파일 확인

 

아래의 명령어는 turtlebot3_gazebo 패키지가 ROS 2 환경에서 어디에 설치되어 있는지 확인하는 것입니다.

 

ros2 pkg prefix turtlebot3_gazebo

 

 

 

 

c. 토픽 확인

 

가제보를 실행한 후에 아래의 CLI를 실행하여 결과를 확인합니다.

 

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

 

ros2 topic list

 

 

ros2 topic echo /scan

 

 

ros2 topic echo /odom

 

 

ros2 topic echo /cmd_vel

 

`

 

 

d. 노드 확인

 

ros2 node list

 

 

ros2 node info /robot_state_publisher

 

 

 

e. TF 확인

 

ros2 run tf2_tools view_frames

 

 

evince frames.pdf

 

 

 

 

16. 직접 /cmd_vel 발행해서 움직이기

 

키보드 teleop 없이 명령어만으로 전진:

 

ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

 

 

정지:

 

ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

 

 

회전:

 

ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}}"

 

 

 

 

17. Python 노드로 TurtleBot3 움직이기

 

a. 워크스페이스 생성

 

mkdir -p ~/tb3_ws/src
cd ~/tb3_ws/src

 

 

패키지 생성:

 

ros2 pkg create tb3_control --build-type ament_python --dependencies rclpy geometry_msgs

 

 

파일 생성:

 

cd ~/tb3_ws/src/tb3_control/tb3_control
touch simple_move.py

 

 

소스 :

 

import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist


class SimpleMove(Node):
    def __init__(self):
        super().__init__('simple_move')
        self.publisher = self.create_publisher(Twist, '/cmd_vel', 10)
        self.timer = self.create_timer(0.1, self.timer_callback)

    def timer_callback(self):
        msg = Twist()
        msg.linear.x = 0.1
        msg.angular.z = 0.0
        self.publisher.publish(msg)


def main(args=None):
    rclpy.init(args=args)
    node = SimpleMove()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()
    
if __name__ == "__main__"    :
	main()

 

 

 

setup.py 수정:

 

entry_points={
    'console_scripts': [
        'simple_move = tb3_control.simple_move:main',
    ],
},

 

 

빌드 :

 

cd ~/tb3_ws
colcon build
source install/setup.bash

 

 

 

실행 :

 

ros2 run tb3_control simple_move

 

 

 

 

 

 

 

18. 장애물 회피 예제

 

/scan 데이터를 읽고 앞에 장애물이 가까우면 회전하는 예제입니다.

 

cd ~/tb3_ws/src/tb3_control/tb3_control
touch obstacle_avoid.py

 

 

소스 :

 

import math

import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan


class ObstacleAvoid(Node):
    def __init__(self):
        super().__init__('obstacle_avoid')

        self.cmd_pub = self.create_publisher(Twist, '/cmd_vel', 10)
        self.scan_sub = self.create_subscription(
            LaserScan,
            '/scan',
            self.scan_callback,
            10
        )

        self.front_distance = float('inf')
        self.timer = self.create_timer(0.1, self.control_loop)

    def scan_callback(self, msg):
        ranges = list(msg.ranges)

        front_ranges = ranges[0:10] + ranges[-10:]
        valid_ranges = [
            r for r in front_ranges
            if not math.isinf(r) and not math.isnan(r)
        ]

        if valid_ranges:
            self.front_distance = min(valid_ranges)
        else:
            self.front_distance = float('inf')

    def control_loop(self):
        cmd = Twist()

        if self.front_distance < 0.5:
            cmd.linear.x = 0.0
            cmd.angular.z = 0.5
        else:
            cmd.linear.x = 0.12
            cmd.angular.z = 0.0

        self.cmd_pub.publish(cmd)


def main(args=None):
    rclpy.init(args=args)
    node = ObstacleAvoid()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()
    
if __name__ == "__main__"    :
	main()

 

 

 

setup.py에 추가:

 

entry_points={
    'console_scripts': [
        'simple_move = tb3_control.simple_move:main',
        'obstacle_avoid = tb3_control.obstacle_avoid:main',
    ],
},

 

 

 

빌드 :

 

cd ~/tb3_ws
colcon build
source install/setup.bash

 

 

 

실행:

 

ros2 run tb3_control obstacle_avoid

 

 

아래의 그림처럼 기둥을 만나면 자동으로 회피주행을 합니다.

 

 

 

 

정지는 아래와 같이 강제로 속도 값을 0으로 설정합니다.

 

 

 

 

19. Launch 파일 실행하기

 

Launch 파일을 만들어 자동 실행할 수 있습니다.

 

패키지 생성:

 

cd ~/tb3_ws/src
ros2 pkg create tb3_bringup --build-type ament_python

 

 

 

 

런치 파일 생성:

 

cd ~/tb3_ws/src/tb3_bringup
mkdir launch
touch launch/tb3_sim.launch.py

 

 

 

launch 파일 소스 코드 :

 

from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, SetEnvironmentVariable
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import PathJoinSubstitution


def generate_launch_description():
    gazebo_launch = IncludeLaunchDescription(
        PythonLaunchDescriptionSource([
            PathJoinSubstitution([
                FindPackageShare('turtlebot3_gazebo'),
                'launch',
                'turtlebot3_world.launch.py'
            ])
        ])
    )

    return LaunchDescription([
        SetEnvironmentVariable('TURTLEBOT3_MODEL', 'burger'),
        gazebo_launch,
    ])

 

 

 

SetEnvironmentVariable('TURTLEBOT3_MODEL', 'burger')
 

 

TURTLEBOT3_MODEL 환경 변수를 burger로 설정합니다.

 

 

setup.py에 launch 설치 설정 추가:

 

import os
from glob import glob
from setuptools import setup

package_name = 'tb3_bringup'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        (os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='user',
    maintainer_email='user@example.com',
    description='TurtleBot3 simulation bringup package',
    license='Apache-2.0',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [],
    },
)

 

 

 

빌드 :

 

cd ~/tb3_ws
colcon build
source install/setup.bash

 

 

 

실행:

 

ros2 launch tb3_bringup tb3_sim.launch.py

 

 

 

 

 

 

 

20. 자주 발생하는 에러와 해결법

 

a. TURTLEBOT3_MODEL 에러

 

에러 예:

TURTLEBOT3_MODEL is not set
 

 

해결:

 
export TURTLEBOT3_MODEL=burger
 

 

영구 적용:

 
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc
 
 
 

b. Gazebo가 너무 느립니다

 

해결 방법:

 
killall gzserver
killall gzclient
 

 

다시 실행:

 
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
 

 

가상머신에서는 3D 가속이 약해서 느릴 수 있습니다. 가능하면 네이티브 Ubuntu 설치를 추천드립니다. 만약 가상머신에서 실행하는 경우 CPU를 4개 이상 사용할 것을 권장합니다.

 

 

 

c. package not found

 

예:

Package 'turtlebot3_gazebo' not found
 

 

해결:

 
source /opt/ros/humble/setup.bash
 

설치 확인:

 
sudo apt install ros-humble-turtlebot3-gazebo
 

 

 

d. 빌드 후 새 패키지가 실행되지 않음

 

해결:

 
cd ~/tb3_ws
colcon build
source install/setup.bash
 

 

~/.bashrc에 추가:

 
echo "source ~/tb3_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
 
 
 
 

e. Navigation2에서 로봇이 움직이지 않음

 

체크리스트:

 
echo $TURTLEBOT3_MODEL
 
ros2 topic echo /scan
 
ros2 topic echo /odom
 
ros2 topic list | grep map
 

 

그리고 RViz2에서 반드시 2D Pose Estimate로 초기 위치를 지정해야 합니다.

 

 

23. 정리

 

ROS 2 Humble에서 TurtleBot3 시뮬레이션을 제대로 익히면 다음 핵심 개념을 한 번에 배울 수 있습니다.

                    개념                                                                        실습 대상

 

ROS 2 노드 Gazebo, robot_state_publisher, teleop
토픽 통신 /cmd_vel, /scan, /odom
메시지 Twist, LaserScan, Odometry
TF map, odom, base_link, laser
시뮬레이션 시간 /clock, use_sim_time
SLAM Cartographer
자율주행 Navigation2
로봇 제어 Python 노드 작성

 

TurtleBot3는 ROS 2 입문용으로 매우 좋은 플랫폼입니다. 단순히 Gazebo에서 로봇을 띄우는 것에서 끝내지 말고, /cmd_vel, /scan, /odom, /tf를 직접 확인하면서 구조를 이해하시면 실전 로봇 개발에 많은 도움이 될 것입니다.

 

 

728x90
728x90