| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 자바
- BLaST
- 바이오인포매틱스
- 시그모이드
- 바이오파이썬
- COVID
- 캐글
- CNN
- 생물정보학
- 오류역전파
- 로제타폴드
- AP
- SVM
- Java
- ROS2
- 단백질 구조 예측
- 딥러닝
- bioinformatics
- 결정트리
- 서열정렬
- 인공지능 수학
- 파이썬
- 인공지능
- Kaggle
- AP Computer Science A
- ncbi
- 알파폴드
- 이항분포
- 생명정보학
- 인공신경망
- Today
- Total
데이터 과학
ROS 2 Jazzy와 Gazebo Harmonic에서 TurtleBot3 시뮬레이션 본문
ROS 2 Jazzy와 Gazebo Harmonic에서 TurtleBot3 시뮬레이션 실행 및 제어하기
앞선 과정에서 Windows 11의 WSL2에 Ubuntu 24.04를 설치하고 ROS 2 Jazzy와 Gazebo Harmonic까지 구성했습니다.
이번에는 이 환경에 TurtleBot3 시뮬레이션 패키지를 설치하고 Gazebo에 TurtleBot3 Burger 모델을 불러온 뒤, ROS 2의 /cmd_vel Topic과 키보드 Teleop을 이용하여 로봇을 직접 움직여 봅니다.
전체적인 실습 구조는 다음과 같습니다.
Windows 11
│
└── WSL2
│
└── Ubuntu 24.04
│
├── ROS 2 Jazzy
│
├── Gazebo Harmonic
│
└── TurtleBot3
│
├── Gazebo Simulation
│
├── /cmd_vel
├── /odom
├── /tf
└── /scan
이번 실습에서 가장 중요한 것은 단순히 가상 로봇을 움직이는 것이 아니라 ROS 2에서 Node → Topic → Message → Robot으로 명령이 전달되는 과정을 이해하는 것입니다.
ROS 2 환경 확인
먼저 Ubuntu 터미널을 실행합니다.
Windows PowerShell에서 다음과 같이 실행할 수 있습니다.
wsl -d Ubuntu-24.04
Ubuntu가 실행되면 홈 디렉터리로 이동합니다.
cd ~
ROS 2 환경을 불러옵니다.
source /opt/ros/jazzy/setup.bash
ROS 배포판을 확인합니다.
echo $ROS_DISTRO
정상적으로 설치되어 있다면 다음과 같이 나타납니다.
jazzy
Gazebo도 확인합니다.
gz --version
ROS-Gazebo 연동 패키지도 확인합니다.
ros2 pkg list | grep ros_gz
ros_gz_sim, ros_gz_bridge 등의 패키지가 나타나면 됩니다.
TurtleBot3 패키지 확인
먼저 Ubuntu 24.04의 ROS 2 Jazzy 저장소에서 TurtleBot3 관련 패키지를 검색합니다.
apt search ros-jazzy-turtlebot3
현재 환경에서는 다음과 같은 주요 패키지들을 확인할 수 있습니다.
ros-jazzy-turtlebot3-msgs
ros-jazzy-turtlebot3-navigation2
ros-jazzy-turtlebot3-node
ros-jazzy-turtlebot3-simulations
ros-jazzy-turtlebot3-teleop
특히 시뮬레이션에서는 다음 패키지가 중요합니다.
ros-jazzy-turtlebot3-simulations
키보드 제어에는 다음 패키지를 사용합니다.
ros-jazzy-turtlebot3-teleop
TurtleBot3 시뮬레이션 패키지 설치
다음과 같이 설치합니다.
sudo apt update
sudo apt install -y \
ros-jazzy-turtlebot3 \
ros-jazzy-turtlebot3-msgs \
ros-jazzy-turtlebot3-simulations
설치가 완료되면 ROS 2에서 TurtleBot3 패키지를 확인합니다.
ros2 pkg list | grep turtlebot3
여러 패키지 중 다음 패키지가 있는지 확인합니다.
turtlebot3_gazebo
turtlebot3_teleop
Gazebo 패키지를 직접 확인할 수도 있습니다.
ros2 pkg prefix turtlebot3_gazebo
바이너리 패키지로 정상 설치되었다면 일반적으로 다음 경로가 나타납니다.
/opt/ros/jazzy
TurtleBot3 모델 선택
TurtleBot3에는 여러 모델이 있습니다.
이번 실습에서는 가장 기본적인 Burger 모델을 사용합니다.
현재 터미널에서 다음을 실행합니다.
export TURTLEBOT3_MODEL=burger
확인합니다.
echo $TURTLEBOT3_MODEL
다음과 같이 출력되면 정상입니다.
burger
이 환경변수는 현재 터미널을 종료하면 사라집니다.
Ubuntu를 실행할 때마다 자동으로 설정하려면 .bashrc에 추가합니다.
echo 'export TURTLEBOT3_MODEL=burger' >> ~/.bashrc
적용합니다.
source ~/.bashrc
다시 확인합니다.
echo $TURTLEBOT3_MODEL
Gazebo Launch 파일 확인
ROS 2와 Gazebo는 버전에 따라 launch 파일 이름과 내부 구성이 달라질 수 있습니다.
따라서 인터넷에 있는 오래된 명령을 바로 사용하는 것보다 현재 설치되어 있는 launch 파일을 직접 확인하는 것이 안전합니다.
다음 명령을 실행합니다.
ls -l /opt/ros/jazzy/share/turtlebot3_gazebo/launch/
더 자세하게 확인하려면 다음과 같이 합니다.
find /opt/ros/jazzy/share/turtlebot3_gazebo \
-maxdepth 2 -type f | sort
여기에서 실제 설치되어 있는 .launch.py 파일들을 확인할 수 있습니다.
대표적으로 다음과 같은 파일을 사용할 수 있습니다.
empty_world.launch.py
turtlebot3_world.launch.py
turtlebot3_house.launch.py
설치된 버전에 따라 파일 목록은 달라질 수 있으므로 실제 출력 결과를 기준으로 실행합니다.
TurtleBot3 World 실행
TurtleBot3 전용 World를 실행해 봅니다.
export TURTLEBOT3_MODEL=burger
그리고 다음을 실행합니다.
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
현재 TurtleBot3 시뮬레이션의 launch 구조에서는 ros_gz_sim을 이용하여 Gazebo를 시작하고 World와 TurtleBot3 모델을 불러옵니다.
따라서 정상적인 경우 별도로 gz sim을 먼저 실행할 필요가 없습니다.
개념적으로 다음과 같이 동작합니다.
ros2 launch
│
├── Gazebo Harmonic 실행
│
├── TurtleBot3 World 로드
│
├── TurtleBot3 모델 Spawn
│
└── robot_state_publisher 실행
잠시 기다리면 Windows 화면에 Gazebo GUI가 나타나고 World 안에 TurtleBot3 Burger가 표시됩니다.
Gazebo 화면이 나타나면 터미널을 종료하지 않는다
중요한 부분입니다.
다음 명령을 실행한 터미널은 계속 실행 상태로 두어야 합니다.
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
이 터미널에서 Ctrl+C를 누르면 시뮬레이션이 종료될 수 있습니다.
따라서 로봇을 제어하기 위해 두 번째 Ubuntu 터미널을 엽니다.
Windows Terminal을 사용한다면 Ubuntu 탭을 하나 더 열면 편리합니다.
두 번째 터미널에서 ROS 환경 설정
새 터미널에서 다음을 실행합니다.
source /opt/ros/jazzy/setup.bash
모델도 설정합니다.
export TURTLEBOT3_MODEL=burger
.bashrc에 이미 등록했다면 자동으로 설정되어 있으므로 다음과 같이 확인만 하면 됩니다.
echo $ROS_DISTRO
echo $TURTLEBOT3_MODEL
결과가 다음과 같으면 됩니다.
jazzy
burger
실행 중인 ROS 2 Node 확인
다음 명령을 실행합니다.
ros2 node list
현재 시뮬레이션에서 실행되고 있는 ROS Node를 확인할 수 있습니다.
ROS에서 Node는 특정 기능을 수행하는 하나의 실행 단위라고 볼 수 있습니다.
예를 들어 로봇 상태를 전달하는 Node, 센서 데이터를 처리하는 Node, 키보드 명령을 전달하는 Node 등이 서로 독립적으로 동작하면서 Topic을 통해 데이터를 주고받습니다.
ROS 2 Topic 확인
다음 명령을 실행합니다.
ros2 topic list
TurtleBot3 시뮬레이션이 정상적으로 실행되고 있다면 구성에 따라 다음과 같은 Topic을 확인할 수 있습니다.
/cmd_vel
/odom
/tf
/tf_static
/scan
/clock
각 Topic은 서로 다른 역할을 합니다.
/cmd_vel
로봇의 이동 속도 명령
/odom
로봇의 이동 거리와 자세를 나타내는 Odometry
/tf
로봇 각 좌표계 사이의 변환 정보
/tf_static
고정된 좌표계 변환 정보
/scan
LiDAR 센서의 거리 측정 데이터
/clock
시뮬레이션 시간
/cmd_vel Topic 이해하기
TurtleBot3의 이동에서 가장 중요한 Topic 중 하나가 /cmd_vel입니다.
cmd_vel은 Command Velocity의 의미로 로봇에게 어느 방향으로 어느 속도로 움직일 것인지 전달합니다.
Topic의 메시지 타입을 확인합니다.
ros2 topic type /cmd_vel
일반적으로 다음과 같은 메시지 타입을 사용합니다.
geometry_msgs/msg/Twist
Twist 메시지는 크게 두 종류의 속도를 가지고 있습니다.
Twist
│
├── linear
│ ├── x
│ ├── y
│ └── z
│
└── angular
├── x
├── y
└── z
TurtleBot3 Burger는 차동구동 로봇이므로 주로 다음 두 값을 사용합니다.
linear.x
angular.z
linear.x는 전진과 후진 속도이고 angular.z는 좌우 회전 속도입니다.
키보드 Teleop 실행
이제 키보드로 TurtleBot3를 움직여 봅니다.
두 번째 Ubuntu 터미널에서 다음을 실행합니다.
ros2 run turtlebot3_teleop teleop_keyboard
정상적으로 실행되면 터미널에 키보드 조작 방법이 나타납니다.
이 터미널에 키보드 포커스를 둔 상태에서 이동 키를 누르면 Gazebo의 TurtleBot3가 움직입니다.
이 과정은 다음과 같습니다.
사용자 키보드
│
▼
turtlebot3_teleop
│
│
│ geometry_msgs/msg/Twist
▼
/cmd_vel
│
▼
TurtleBot3 Controller
│
▼
Gazebo Harmonic
│
▼
TurtleBot3 이동
즉, 키보드 입력이 Gazebo에 직접 전달되는 것이 아닙니다.
turtlebot3_teleop이라는 ROS 2 Node가 키보드 입력을 받아 Twist 메시지를 만들고 이를 /cmd_vel Topic으로 Publish하는 것입니다.
/cmd_vel 메시지 실시간 관찰
Teleop이 실제로 어떤 명령을 보내는지 확인할 수 있습니다.
세 번째 Ubuntu 터미널을 하나 더 엽니다.
ROS 환경을 적용합니다.
source /opt/ros/jazzy/setup.bash
다음 명령을 실행합니다.
ros2 topic echo /cmd_vel
이제 Teleop 터미널에서 이동 키를 눌러 봅니다.
다음과 비슷한 메시지가 나타납니다.
linear:
x: 0.01
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
회전 명령을 보내면 angular.z 값이 변합니다.
이를 통해 실제로
Keyboard
↓
Teleop Node
↓
Twist Message
↓
/cmd_vel
↓
Robot
구조로 동작하고 있다는 것을 확인할 수 있습니다.
ROS 2 명령으로 TurtleBot3 직접 움직이기
Teleop을 사용하지 않고 터미널에서 직접 /cmd_vel Topic에 메시지를 Publish할 수도 있습니다.
먼저 Teleop 프로그램을 Ctrl+C로 종료합니다.
전진 명령을 다음과 같이 보냅니다.
ros2 topic pub --rate 10 \
/cmd_vel \
geometry_msgs/msg/Twist \
"{linear: {x: 0.2}, angular: {z: 0.0}}"
여기서
linear.x = 0.2
angular.z = 0.0
이므로 로봇은 직진합니다.
--rate 10은 초당 10번 메시지를 발행한다는 의미입니다.
실행 구조는 다음과 같습니다.
ROS 2 CLI
│
│ Twist
▼
/cmd_vel
│
▼
TurtleBot3
│
▼
전진
실험을 중단하려면 Ctrl+C를 누릅니다.
TurtleBot3 정지시키기
정지 명령은 선속도와 각속도를 모두 0으로 지정합니다.
ros2 topic pub --once \
/cmd_vel \
geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: 0.0}}"
여기서 --once는 메시지를 한 번만 Publish한다는 의미입니다.
TurtleBot3 제자리 회전
로봇을 제자리에서 회전시켜 봅니다.
ros2 topic pub --rate 10 \
/cmd_vel \
geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: 0.5}}"
이번에는
linear.x = 0.0
angular.z = 0.5
이므로 앞으로 이동하지 않고 회전합니다.
반대 방향으로 회전하려면 다음과 같이 음수 값을 사용합니다.
ros2 topic pub --rate 10 \
/cmd_vel \
geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: -0.5}}"
직진하면서 회전시키기
선속도와 각속도를 동시에 주면 곡선으로 이동합니다.
ros2 topic pub --rate 10 \
/cmd_vel \
geometry_msgs/msg/Twist \
"{linear: {x: 0.15}, angular: {z: 0.4}}"
이번에는
linear.x = 0.15
angular.z = 0.4
가 동시에 적용되므로 TurtleBot3가 곡선을 그리면서 이동합니다.
이를 통해 차동구동 로봇의 기본적인 이동 원리를 이해할 수 있습니다.
Odometry 확인
TurtleBot3가 이동하면 로봇의 위치 변화에 관한 정보도 발생합니다.
다음 명령을 실행합니다.
ros2 topic echo /odom
/odom은 Odometry의 약자로 바퀴의 이동 등을 이용하여 로봇의 위치와 자세 변화를 표현합니다.
개념적으로 다음과 같습니다.
Wheel Movement
│
▼
Odometry
│
▼
/odom
│
▼
Position + Orientation
로봇을 움직이면서 /odom 데이터를 확인하면 위치와 자세 값이 계속 변하는 것을 볼 수 있습니다.
LiDAR 데이터 확인
TurtleBot3 Burger 시뮬레이션에서 LiDAR 데이터가 정상적으로 제공되는 경우 다음 Topic을 확인할 수 있습니다.
ros2 topic list | grep scan
/scan이 존재한다면 다음과 같이 확인합니다.
ros2 topic echo /scan
LaserScan 메시지에는 주변 장애물까지의 거리 정보가 포함됩니다.
Gazebo World
│
▼
Virtual LiDAR
│
▼
LaserScan
│
▼
/scan
이 데이터는 이후 SLAM과 Navigation2에서 매우 중요하게 사용됩니다.
RViz2에서 확인하기
새 Ubuntu 터미널을 열어 다음을 실행합니다.
rviz2
RViz2에서는 ROS 2를 통해 전달되는 다양한 정보를 시각적으로 확인할 수 있습니다.
대표적으로 다음과 같은 데이터를 추가할 수 있습니다.
RobotModel
TF
LaserScan
Odometry
Path
Map
Gazebo와 RViz2의 역할은 다릅니다.
ROS 2
│
┌───────────┴───────────┐
│ │
▼ ▼
Gazebo RViz2
│ │
물리 시뮬레이션 데이터 시각화
│ │
┌─────┼─────┐ ┌──────┼──────┐
│ │ │ │ │ │
Robot World Sensor TF LiDAR Odom
Gazebo에서는 로봇이 실제 환경처럼 움직이는 모습을 볼 수 있고 RViz2에서는 ROS 2가 주고받는 데이터를 시각적으로 분석할 수 있습니다.
TurtleBot3가 움직이지 않을 때 확인할 사항
Teleop은 정상적으로 실행되는데 Gazebo의 로봇이 움직이지 않는다면 먼저 /cmd_vel이 실제로 발행되고 있는지 확인합니다.
ros2 topic echo /cmd_vel
키를 눌렀을 때 값이 변하면 Teleop 자체는 정상입니다.
다음으로 /cmd_vel의 Publisher와 Subscriber를 확인합니다.
ros2 topic info /cmd_vel -v
여기에서 중요한 것은 단순히 Publisher가 존재하는 것뿐 아니라 Gazebo 측에서 해당 이동 명령을 받아들이는 Subscriber가 존재하는가입니다.
개념적으로 정상 상태는 다음과 같습니다.
turtlebot3_teleop
│
│ Publisher
▼
/cmd_vel
│
│ Subscriber
▼
Gazebo Robot Controller
만약 /cmd_vel 데이터는 출력되는데 로봇이 움직이지 않는다면 Gazebo의 로봇 제어 플러그인이나 ROS-Gazebo 연결 상태를 확인해야 합니다.
/cmd_vel 자체가 보이지 않는 경우
먼저 시뮬레이션이 정상적으로 실행되고 있는지 확인합니다.
ros2 node list
Topic 전체를 확인합니다.
ros2 topic list
TurtleBot3 Gazebo 패키지를 확인합니다.
ros2 pkg prefix turtlebot3_gazebo
설치된 launch 파일도 다시 확인합니다.
ls -l /opt/ros/jazzy/share/turtlebot3_gazebo/launch/
필요하다면 Gazebo를 종료하고 다시 실행합니다.
export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
실습에 사용하는 터미널 구성
TurtleBot3 시뮬레이션을 처음 학습할 때는 터미널을 여러 개 열어 놓으면 구조를 이해하기 쉽습니다.
┌─────────────────────────────────┐
│ Terminal 1 │
│ │
│ Gazebo + TurtleBot3 │
│ │
│ ros2 launch turtlebot3_gazebo │
│ turtlebot3_world.launch.py │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ Terminal 2 │
│ │
│ Keyboard Teleop │
│ │
│ ros2 run turtlebot3_teleop │
│ teleop_keyboard │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ Terminal 3 │
│ │
│ Topic 확인 │
│ │
│ ros2 topic echo /cmd_vel │
│ ros2 topic echo /odom │
│ ros2 topic echo /scan │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ Terminal 4 │
│ │
│ RViz2 │
│ │
│ rviz2 │
└─────────────────────────────────┘
이렇게 구성하면 로봇이 움직이는 모습과 ROS 메시지가 전달되는 과정을 동시에 관찰할 수 있습니다.
전체 데이터 흐름 이해하기
이번 실습에서 가장 중요한 부분은 전체 데이터 흐름입니다.
사용자가 키보드를 누르면 다음 과정이 발생합니다.
Keyboard
│
▼
turtlebot3_teleop Node
│
│ geometry_msgs/msg/Twist
▼
/cmd_vel Topic
│
▼
Gazebo Robot Controller
│
▼
TurtleBot3
로봇이 움직이면 반대 방향으로 상태와 센서 데이터가 생성됩니다.
TurtleBot3
│
▼
Gazebo Harmonic
│
├──────── /odom
│
├──────── /tf
│
└──────── /scan
│
▼
ROS 2
│
▼
RViz2
따라서 ROS 2는 단순히 로봇을 움직이는 프로그램이 아니라 여러 Node가 Topic을 통해 데이터를 주고받도록 구성하는 분산형 로봇 소프트웨어 프레임워크라고 이해할 수 있습니다.
이번 실습의 핵심
이번 실습에서는 ROS 2 Jazzy와 Gazebo Harmonic 환경에서 TurtleBot3 시뮬레이션 패키지를 설치하고 Burger 모델을 Gazebo에 불러왔습니다.
그리고 turtlebot3_teleop Node를 이용하여 키보드 입력을 ROS 2의 /cmd_vel Topic으로 전달했습니다.
여기서 사용한 핵심 구조는 다음과 같습니다.
Node
↓
Publisher
↓
Topic
↓
Message
↓
Subscriber
↓
Robot
이를 TurtleBot3에 적용하면 다음과 같습니다.
Keyboard
↓
turtlebot3_teleop
↓
geometry_msgs/msg/Twist
↓
/cmd_vel
↓
TurtleBot3 Controller
↓
Gazebo Harmonic
↓
TurtleBot3
이 구조를 이해하면 다음 단계부터는 키보드 대신 직접 만든 Python ROS 2 Node에서 /cmd_vel 메시지를 Publish하여 TurtleBot3를 제어할 수 있습니다.
'인공지능 > 피지컬 AI' 카테고리의 다른 글
| Ubuntu 24.04와 ROS 2 Jazzy에서 PuppyPi 4족 보행 로봇 (0) | 2026.09.21 |
|---|---|
| Windows 11 WSL2에서 Ubuntu 24.04, ROS 2 Jazzy, Gazebo Harmonic, TurtleBot3 (0) | 2026.09.21 |
| Ubuntu 26.04 + ROS 2 Lyrical + Gazebo Jetty 설치 (0) | 2026.09.12 |
| PiDog에 프로그램을 넣는 방법 (0) | 2026.09.10 |
| TurtleBot3와 ROS 2 이해하기 (0) | 2026.09.07 |