ROS2 Mastery [1편] ROS2 Jazzy 개발환경 구성 및 작업공간 (Workspace) 완벽 가이드
안녕하세요! 마케팅 팀의 에이든(Aiden)입니다.
로봇 공학과 자율주행을 연구하시는 대학생, 그리고 현장의 연구원 여러분. 쿼드(QUAD) 드론연구소의 ‘ROS2 속성 마스터 과정’을 바탕으로 진행되는 연재 블로그에 오신 것을 환영합니다.
본격적인 로봇 프로그래밍에 앞서 가장 중요하고 기초가 되는 단계는 바로 ‘개발 환경을 올바르게 구축하는 것’입니다. 환경 설정이 꼬이면 이후 복잡한 로봇 코드를 작성할 때 원인을 알 수 없는 에러에 시달리기 쉽습니다. 이번 1편에서는 ROS2 Jazzy 버전을 기준으로, 쉘(Shell) 환경 설정부터 나만의 작업 공간(Workspace)을 만들고 오버레이(Overlay) 개념을 통해 코드를 수정하고 빌드하는 전체 과정을 아주 친절하고 상세하게 안내해 드리겠습니다.
ROS2 작업공간(Workspace)과 언더레이/오버레이의 이해
ROS2 프로그래밍을 시작하기 전에 반드시 이해해야 하는 개념이 있습니다. 바로 작업 공간(Workspace)과 이를 결합하는 언더레이(Underlay) / 오버레이(Overlay) 시스템입니다.
- 작업 공간(Workspace): ROS2로 개발 중인 시스템의 패키지들이 위치하는 디렉토리를 나타내는 ROS 용어입니다.
- 언더레이(Underlay): 컴퓨터에 기본적으로 설치된 핵심 ROS2 작업 공간(예:
/opt/ros/jazzy)을 의미합니다. - 오버레이(Overlay): 우리가 직접 코드를 짜고 패키지를 추가하기 위해 만드는 후속 로컬 작업 공간(예:
~/ros2_ws)입니다.

ROS2는 터미널(쉘 환경)을 사용하여 이러한 작업 공간들을 결합합니다. 오버레이에 있는 패키지는 언더레이에 있는 동일한 패키지를 무시하고 재정의(Override)할 수 있습니다. 이를 통해 기존의 시스템(언더레이)을 망가뜨리지 않고도 새로운 기능을 추가하거나 기존 패키지를 수정하여 안전하게 테스트해 볼 수 있습니다. 또한 여러 버전의 ROS2 배포판을 동일 컴퓨터에 설치하고 쉽게 전환할 수 있도록 도와줍니다.
필수 환경 설정 (Environment Setup)
ROS2 패키지를 원활하게 사용하려면 터미널을 열 때마다 환경 설정 파일을 ‘소싱(Sourcing)’해야 합니다.
1. 설정 파일 소싱 및 환경 변수 확인
터미널을 열고 다음 명령어를 입력하여 ROS2 Jazzy의 기본 환경(언더레이)을 불러옵니다.
# ROS2 기본 환경 소싱
source /opt/ros/jazzy/setup.bash매번 터미널을 열 때마다 위 명령어를 입력하기 번거롭다면, 사용 중인 쉘의 시작 스크립트(~/.bashrc)에 해당 명령을 추가해 두는 것이 좋습니다.
환경이 올바르게 설정되었는지 확인하려면 환경 변수를 검사해 봅니다.
# ROS 관련 환경변수 확인
printenv | grep -i ROS명령어를 치면 ROS_DISTRO, ROS_VERSION 등의 변수가 나타날 것입니다. 예를 들어 Jazzy를 사용 중이라면 ROS_DISTRO=jazzy로 표시되어야 합니다.
2. 연구실 및 강의실 환경을 위한 고급 환경 변수 설정
대학생이나 연구원 여러분은 여러 명의 인원이 같은 공유기(네트워크)를 사용하는 연구실이나 강의실에서 개발을 진행하는 경우가 많습니다. 이때 다른 사람의 로봇 제어 신호가 내 로봇으로 들어오는 아찔한 상황을 방지하기 위해 두 가지 중요한 환경 변수를 알아두셔야 합니다.
- ROS_DOMAIN_ID: ROS2는 통신 미들웨어로 DDS를 사용합니다. 서로 다른 그룹이 하나의 물리적 네트워크를 공유할 때 간섭을 막으려면 각 그룹마다 고유한 정수 값을
ROS_DOMAIN_ID로 설정해야 합니다 (기본값은 0). - ROS_LOCALHOST_ONLY: 내 로봇의 통신이 외부 네트워크로 나가지 않고 오직 내 컴퓨터(localhost) 안에서만 이루어지도록 제한합니다. 여러 로봇이 동일한 토픽을 발행하여 이상 행동을 유발하는 교실 환경에서 매우 유용합니다.
# ~/.bashrc 파일에 추가하여 적용할 수 있습니다.
export ROS_DOMAIN_ID=30
export ROS_LOCALHOST_ONLY=1나만의 ROS2 작업 공간(Workspace) 만들기
이제 본격적으로 코드를 작성할 로컬 작업 공간을 만들어 보겠습니다. 모범 사례에 따라 모든 새 작업 공간은 새로운 디렉토리를 만들고, 내부의 모든 패키지는 src 디렉토리 안에 넣어야 합니다.
# 새로운 디렉토리 및 src 폴더 생성 후 이동
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src1 샘플 리포지토리 복제 (Clone)
우선 작업 공간이 어떻게 동작하는지 연습하기 위해, ROS2 튜토리얼에서 널리 쓰이는 turtlesim 패키지가 포함된 ros_tutorials 리포지토리를 복제해 보겠습니다. 여기서 중요한 점은, 현재 설치된 ROS2 배포판(Jazzy)을 대상으로 하는 브랜치(-b)를 가져와야 한다는 것입니다.
# ~/ros2_ws/src 디렉토리 안에서 실행
git clone -b jazzy https://github.com/ros/ros_tutorials.git

이제 ~/ros2_ws/src 안에는 turtlesim 패키지가 포함된 ros_tutorials 폴더가 생성되었습니다. (이 저장소의 일부 다른 패키지는 COLCON_IGNORE 파일을 포함하고 있어 자동으로 빌드 대상에서 제외됩니다).
2 패키지 종속성(Dependency) 해결
복제한 패키지를 빌드하기 전에는 반드시 종속성을 확인하고 해결해야 합니다. 패키지 안에 있는 package.xml 파일에는 해당 코드가 구동되기 위해 필요한 외부 패키지 정보가 선언되어 있습니다. 종속성을 확인하지 않고 빌드를 돌렸다가 오랜 시간 뒤에 에러가 나면 연구 시간이 크게 지연되겠죠? 작업 공간의 최상위 폴더(~/ros2_ws)에서 rosdep 도구를 사용하여 누락된 종속성을 설치해 줍니다.
# 작업 공간 루트로 이동
cd ~/ros2_ws
# 종속성 해결 명령어 실행 (필요 패키지 자동 설치)
rosdep install -i --from-path src --rosdistro jazzy -y만약 모든 종속성이 이미 설치되어 있다면 콘솔에 알림 메시지가 반환됩니다.
Colcon으로 작업 공간 빌드하기
이제 colcon 빌드 시스템을 사용하여 작업 공간을 구축할 차례입니다. 작업 공간의 루트(~/ros2_ws)에서 아래 명령어를 실행합니다.
# 전체 작업 공간 빌드
colcon build --symlink-install[💡 연구원을 위한 Colcon Build 꿀팁] colcon build 명령어 뒤에 붙일 수 있는 유용한 옵션들을 소개합니다.
--symlink-install: 이 옵션은 매우 중요합니다! Python 스크립트나 설정 파일을 수정할 때마다 매번 다시 빌드할 필요 없이, 심볼릭 링크를 통해 변경 사항이 즉시 반영되게 해줍니다. 개발 시간을 획기적으로 단축해 줍니다.--packages-up-to <패키지명>: 수많은 패키지가 있을 때 전체를 빌드하지 않고, 내가 원하는 특정 패키지와 그 종속성 패키지들만 빌드하여 시간을 절약합니다.--event-handlers console_direct+: 빌드 진행 중 발생하는 모든 로그(콘솔 출력)를 실시간으로 터미널에서 볼 수 있게 해줍니다. 빌드 에러 디버깅에 큰 도움이 됩니다.
빌드가 무사히 완료되고 ls 명령어로 디렉토리를 확인해 보면, 우리가 만든 src 외에도 build, install, log 등 새로운 디렉토리들이 생성된 것을 확인할 수 있습니다. 이 중 install 디렉토리 안에 앞으로 우리가 사용할 오버레이 설정 파일들이 들어있습니다.
5. 오버레이(Overlay) 소싱 및 코드 수정 테스트
작업 공간을 빌드했다면, 이제 새로 빌드한 로컬 패키지(오버레이)를 시스템이 인식할 수 있도록 소싱(Sourcing)을 해주어야 합니다.
1 반드시 새로운 터미널을 여세요!
여기서 가장 주의해야 할 점이 있습니다. 작업 공간을 빌드했던 터미널에서 그대로 오버레이를 소싱하거나, 오버레이가 소싱된 상태에서 다시 빌드를 진행하면 복잡한 경로 꼬임 문제가 발생할 수 있습니다.
따라서 반드시 새 터미널을 열고 다음과 같이 실행합니다.
# 새 터미널 오픈 후 기본 환경(언더레이) 소싱
source /opt/ros/jazzy/setup.bash
# 작업 공간 루트로 이동하여 오버레이 소싱
cd ~/ros2_ws
source install/local_setup.bash2 Turtlesim 수정으로 오버레이 강력함 확인하기
오버레이 환경이 기본 언더레이 환경보다 우선순위가 높다는 것을 직접 눈으로 확인해 보겠습니다.
~/ros2_ws/src/ros_tutorials/turtlesim/src경로에 있는turtle_frame.cpp파일을 VS Code 등의 텍스트 편집기로 엽니다.- 약 52행 근처에 있는
setWindowTitle("TurtleSim");코드를 찾아, 괄호 안의 글자를"MyTurtleSim"으로 변경하고 저장합니다. - 처음에 빌드를 진행했던 터미널(첫 번째 터미널)로 돌아가
colcon build를 다시 실행합니다. - 빌드가 완료되면, 오버레이를 소싱했던 터미널(두 번째 터미널)로 돌아가서 거북이 시뮬레이터를 실행해 봅니다.
# 두 번째 터미널에서 실행
ros2 run turtlesim turtlesim_node거북이 창의 상단 제목 표시줄이 방금 수정한 “MyTurtleSim”으로 변경되어 실행되는 것을 확인할 수 있습니다.
언더레이 시스템은 안전할까요? 이를 확인하기 위해 완전히 새로운 세 번째 터미널을 열고, 로컬 오버레이(~/ros2_ws)는 소싱하지 않은 채 기본 ROS2 언더레이(source /opt/ros/jazzy/setup.bash)만 소싱한 뒤 ros2 run turtlesim turtlesim_node를 실행해 보세요. 원래대로 “TurtleSim”이라는 제목을 가진 기본 거북이가 실행될 것입니다. 이것이 바로 기존 시스템을 보존하면서도 내 마음대로 코드를 변경하고 테스트할 수 있는 ‘오버레이 시스템의 강력함’입니다.
수고하셨습니다! 오늘은 로봇 연구와 개발을 위한 가장 기본적이고도 핵심적인 단계인 ‘ROS2 환경 구성 및 작업 공간(Workspace) 구축’에 대해 깊이 있게 알아보았습니다. 언더레이와 오버레이 구조를 이해하고, colcon을 통해 빌드하며, 내 코드의 변경 사항이 어떻게 기존 시스템을 오버라이드(재정의) 하는지 직접 확인하셨을 것입니다.
이외에도 쾌적한 프로그래밍을 위해 자주 쓰는 명령어를 .bashrc에 단축키(Alias)로 설정해 두거나, 자동 완성 및 디버깅 기능이 강력한 Visual Studio Code(VS Code)를 주력 에디터로 설치해 두시는 것을 추천합니다.
다음 2편에서는 ROS2 프로그래밍의 뼈대가 되는 “Node, Topic, Service, Action, Parameter 핵심 통신 개념 이해하기”와 이를 시각화해 주는 강력한 도구인 “RQT 활용법”에 대해 다루어 보도록 하겠습니다.
YouTube 강좌

작성자: 에이든(Aiden), 쿼드(QUAD) 드론연구소 마케팅팀
기고일: 2026.03.30
