1. ROS 2 Jazzy 기본 설치
우선 시스템을 최신 상태로 만들고 ROS 2 패키지 저장소를 등록한다.
- 로켈(Locale) 설정:
sudo apt update && sudo apt install locales sudo locale-gen ko_KR ko_KR.UTF-8 sudo update-locale LC_ALL=ko_KR.UTF-8 LANG=ko_KR.UTF-8 export LANG=ko_KR.UTF-8 - 저장소 및 GPG 키 등록:
sudo apt install software-properties-common curl sudo add-apt-repository universe -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null - ROS 2 데스크탑 설치:
sudo apt update sudo apt install ros-jazzy-desktop
2. 개발 도구 설치 및 초기화
패키지를 빌드하고 의존성을 관리하는 도구들을 설치한다.
- 필수 도구 설치:
sudo apt install ros-dev-tools python3-colcon-common-extensions - rosdep 초기화:
sudo rosdep init rosdep update
3. 터틀봇3 워크스페이스 구축 (소스 빌드)
Ubuntu 24.04와 Jazzy 환경에서는 터틀봇3 패키지를 소스에서 직접 빌드하는 것이 가장 안정적이다.
- 워크스페이스 생성 및 소스 다운로드:
mkdir -p ~/turtlebot3_ws/src cd ~/turtlebot3_ws/src git clone -b jazzy https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b jazzy https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b jazzy https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git - 의존성 설치 및 빌드:
cd ~/turtlebot3_ws rosdep install --from-paths src --ignore-src -r -y colcon build --symlink-install
4. 환경 변수 설정
매번 명령어를 입력하지 않도록 .bashrc 파일에 설정을 추가한다.
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
echo "source ~/turtlebot3_ws/install/setup.bash" >> ~/.bashrc
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc
5. 시뮬레이션 실행 (최종)
이제 아래 명령어로 가상 세계에 터틀봇 버거를 소환할 수 있다.
- 시뮬레이터 실행:
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py - 키보드 조종 (새 터미널):
ros2 run turtlebot3_teleop teleop_keyboard
키보드 안됨 이슈
1. 환경 변수 설정 확인 (가장 높은 확률)
각 터미널 창은 독립적인 환경을 가진다. 시뮬레이션을 띄운 창뿐만 아니라, 조종 노드를 실행하는 창에서도 반드시 워크스페이스 설정을 불러와야 한다.
새 터미널(조종용)을 열고 아래 명령어를 순서대로 다시 입력한다.
# 1. ROS 2 기본 설정 로드
source /opt/ros/jazzy/setup.bash
# 2. 터틀봇3 워크스페이스 설정 로드
source ~/turtlebot3_ws/install/setup.bash
# 3. 모델 설정
export TURTLEBOT3_MODEL=burger
# 4. 조종 노드 실행
ros2 run turtlebot3_teleop teleop_keyboard
2. 실행 중인 노드와 토픽 목록 확인
조종 노드가 정상적으로 네트워크에 붙어 있는지 확인해야 한다. 또 다른 터미널을 열고 다음을 입력한다.
- 노드 확인: teleop_keyboard가 목록에 있는지 확인한다.
-
Bash
ros2 node list - 토픽 확인: /cmd_vel이 목록에 있는지 확인한다.
-
Bash
ros2 topic list
3. 통신 도메인 ID(ROS_DOMAIN_ID) 확인
WSL2 내부에서 여러 터미널을 쓸 때, 간혹 도메인 ID가 다르게 설정되어 있으면 서로 통신이 안 된다. 모든 터미널에서 아래 명령어를 쳤을 때 결과가 같아야 한다. (기본값은 공백이거나 0이다.)
echo $ROS_DOMAIN_ID
만약 값이 다르다면 export ROS_DOMAIN_ID=0으로 통일해 준다.
4. Jazzy 버전의 토픽 유형 문제
ROS 2 Jazzy부터는 보안이나 표준화 문제로 인해 메시지 타입이 엄격해졌다. 만약 teleop_keyboard 노드가 구버전 방식(Twist)으로 발행하는데, 시뮬레이션은 신버전 방식(TwistStamped)을 기다리고 있다면 메시지가 무시될 수 있다.
ros2 node list 결과가 비어 있다면 현재 키보드 조종 노드(teleop_keyboard)가 정상적으로 실행되지 않았거나, 실행되었더라도 ROS 네트워크 상에서 발견되지 않고 있다는 뜻이다. /cmd_vel 토픽은 목록에 있지만 echo에 반응이 없는 것도 발행자(Publisher)가 없기 때문이다.
아래 단계에 따라 조치해 보길 바란다.
1. 조종 노드 재실행 및 포커스 유지
키보드 조종 노드는 특정 터미널이 선택된 상태에서만 키를 인식한다.
- 조종용 터미널을 새로 하나 열고 아래 명령어를 입력한다.
-
Bash
source /opt/ros/jazzy/setup.bash source ~/turtlebot3_ws/install/setup.bash export TURTLEBOT3_MODEL=burger ros2 run turtlebot3_teleop teleop_keyboard - 명령어를 입력한 터미널 창을 마우스로 클릭하여 활성화한다.
- w 키를 누른 상태에서 손을 떼지 말고 유지해 본다. (한 번만 누르면 속도가 너무 낮아 안 움직일 수 있다.)
2. 노드 확인 (노드가 안 뜰 때)
ros2 node list에 아무것도 안 나온다면 ROS 2 데몬(Daemon) 문제일 수 있다. 다른 터미널에서 아래 명령어를 순서대로 입력해 본다.
# 데몬 재시작
ros2 daemon stop
ros2 daemon start
# 노드 리스트 다시 확인 (조종 노드가 켜져 있는 상태여야 함)
ros2 node list
목록에 teleop_keyboard가 나타나야 정상이다.
3. 강제 주행 테스트 (시뮬레이션 연결 확인)
키보드 노드 문제인지 시뮬레이션 문제인지 확실히 하기 위해, 터미널에서 직접 명령을 날려본다.
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
- 로봇이 움직인다면: 시뮬레이션은 정상이다. 키보드 노드나 터미널 포커스가 문제다.
- 로봇이 안 움직인다면: 시뮬레이션(Gazebo)과 ROS 간의 연결(Bridge)이 끊긴 상태다. 가제보를 껐다 켜야 한다.
4. WSL2 특이사항 (GUI 응답)
WSL2에서 가제보 화면이 떠 있다면 가제보 하단에 Play(▶) 버튼이 눌려 있는지 꼭 확인해야 한다. 일시정지 상태에서는 어떤 메시지를 보내도 로봇이 반응하지 않는다.
현재 상황 요약:
- /cmd_vel 토픽이 리스트에 있다는 것은 시뮬레이션은 살아 있다는 증거다.
- ros2 node list가 비어 있다는 것은 조종 노드가 죽었거나 데몬이 인식을 못 하는 상태다.
ros2 node list 결과가 비어 있고, 수동으로 입력한 pub 명령에도 로봇이 움직이지 않는다면 ROS 2와 시뮬레이터(Gazebo Harmonic) 사이의 통신 다리(Bridge)가 연결되지 않은 상태다.
ROS 2 Jazzy와 최신 가제보는 서로 다른 통신 방식을 사용하기 때문에, 중간에서 이를 통역해 주는 ros_gz_bridge가 반드시 살아 있어야 한다. 아래 순서대로 강제 연결을 시도해 본다.
1. 토픽 정보 상세 확인
먼저 /cmd_vel 토픽을 누가 듣고 있는지(Subscriber) 확인한다. 터미널에 아래 명령어를 입력한다.
ros2 topic info /cmd_vel
- 정상 수치: Publisher count: 1 (조종 노드), Subscription count: 1 (시뮬레이션 브릿지)
- 현재 예상 상태: Subscription count: 0. 이 경우 로봇이 명령을 들을 준비가 안 된 것이다.
2. ROS-GZ 브릿지 수동 강제 실행
시뮬레이션 실행 시 브릿지가 자동으로 켜지지 않았을 가능성이 크다. 새 터미널을 열고 아래 명령어를 직접 입력하여 통신 선을 연결한다.
# 환경 설정 로드
source /opt/ros/jazzy/setup.bash
source ~/turtlebot3_ws/install/setup.bash
# ROS의 /cmd_vel(Twist)을 가제보의 명령으로 연결하는 브릿지 실행
ros2 run ros_gz_bridge parameter_bridge /cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist
이 창은 끄지 말고 그대로 둔다.
3. 노드 리스트 다시 확인
브릿지를 켠 상태에서 다른 터미널을 열어 노드가 보이는지 확인한다.
ros2 node list
목록에 parameter_bridge라는 이름이 보여야 한다. 이제 다시 키보드 조종 노드를 실행하거나 ros2 topic pub 명령어를 입력해 본다.
4. WSL2 환경의 특수 설정 (RMW 설정)
WSL2 내부에서 노드끼리 서로를 찾지 못하는(Discovery) 고질적인 문제가 있을 때가 있다. 모든 터미널 창에 아래 설정을 입력한 뒤 시도해 본다.
export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST
(이 설정은 같은 컴퓨터 내부의 노드들만 찾도록 강제하여 통신 성공률을 높인다.)
💡 그래도 안 움직인다면? (마지막 체크리스트)
- 가제보 하단 재생 버튼: 가제보 화면 맨 아래 가운데에 있는 '일시정지(||)' 아이콘이 '재생(▷)' 상태인지 다시 확인한다. 일시정지 상태면 브릿지가 연결되어도 로봇은 꼼짝도 하지 않는다.
- 그래픽 가속 문제: WSL2에서 가제보 화면이 너무 느리게 응답하면(FPS가 낮으면) 명령을 받아도 처리가 안 될 수 있다. 윈도우 작업 관리자에서 GPU 사용량을 확인해 보길 바란다.
위의 2번 과정(브릿지 수동 실행)을 했을 때 터미널에 에러 메시지가 뜨는지 확인해 줄 수 있나? 만약 Package 'ros_gz_bridge' not found라고 뜬다면 브릿지 패키지 설치가 누락된 것이다.
수동 브릿지를 실행한 후 ros2 topic info /cmd_vel의 결과가 어떻게 바뀌었는지 알려주면 다음 단계를 안내하겠다.
원한다면, 브릿지 설치 여부를 확인하기 위해 sudo apt install ros-jazzy-ros-gz 명령어를 먼저 실행해 보는 것도 좋은 방법이다. 이 패키지가 설치되어 있는지 확인해 볼까?
'터틀봇' 카테고리의 다른 글
| 터틀봇 펌웨어를 수정해서 센서 데이터값 가져오기 (0) | 2026.04.13 |
|---|---|
| OpenCR 세팅 (0) | 2026.01.21 |
| 라즈베리파이, OpenCR 세팅 (0) | 2026.01.20 |