ROS 2 Humble 설치 후 매번 터미널에서 source /opt/ros/humble/setup.bash 명령을 입력하는 것은 번거롭습니다.
따라서 ~/.bashrc 파일에 ROS 2 환경 설정, 워크스페이스 설정, 자주 사용하는 alias를 등록해 두면 개발 효율이 좋아집니다.
1. bashrc 파일 열기
아래와 같이 다양한 편집기를 사용할 수 있습니다. 저는 윈도우용인 gedit를 사용하겠습니다.
nano ~/.bashrc
또는
vim ~/.bashrc
또는
gedit ~/.bashrc
bashrc에 명령어를 추가할 때 기존 내용은 삭제하지 말고, 파일 맨 아래에 추가합니다.
2. 반드시 추가할 항목
아래 항목은 ROS 2 Humble 개발 환경에서 거의 필수입니다. 가능한 반드시 추가하시기 바랍니다.
# ==============================
# ROS 2 Humble Environment
# ==============================
source /opt/ros/humble/setup.bash
# ROS 2 Workspace
source ~/ros2_study/install/local_setup.bash
# ROS Domain ID
export ROS_DOMAIN_ID=7
# DDS Middleware
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
a. ROS 2 Humble 환경 불러오기
source /opt/ros/humble/setup.bash
ROS 2 명령어인 ros2, colcon, 패키지 실행 환경을 사용할 수 있게 해 줍니다.
b. 사용자 워크스페이스 환경 불러오기
source ~/ros2_study/install/local_setup.bash
직접 만든 ROS 2 패키지를 터미널에서 바로 인식하게 해줍니다.
단, ~/ros2_study에서 한 번 이상 빌드가 되어 있어야 합니다.
cd ~/ros2_study
colcon build --symlink-install
ROS 2에서:
source install/setup.bash
은 현재 워크스페이스 + 부모 ROS 2 환경까지 같이 적용합니다.
source install/local_setup.bash
은 현재 워크스페이스만 적용합니다.
쉽게 말하면
파일 의미 보통 사용
| setup.bash | 전체 환경 연결 | 많이 사용 |
| local_setup.bash | 내 워크스페이스만 연결 | 특수한 경우 |
c. ROS_DOMAIN_ID 설정
export ROS_DOMAIN_ID=7
같은 네트워크 안에서 다른 ROS 2 시스템과 통신이 섞이지 않게 구분하는 ID입니다.
여러 로봇을 사용할 경우 로봇마다 다르게 설정하는 것이 좋습니다.
예:
robot1: ROS_DOMAIN_ID=7
robot2: ROS_DOMAIN_ID=8
robot3: ROS_DOMAIN_ID=9
d. DDS Middleware 설정
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
ROS 2 Humble의 기본 DDS 계열 미들웨어로 Fast DDS를 사용합니다.
일반적인 개발에서는 이 설정으로 충분합니다.
DDS란?
DDS는 여러 프로그램이나 컴퓨터가 데이터를 주고받게 해주는 통신 미들웨어 표준입니다.
ROS2에서는 노드끼리 데이터를 주고받을 때 내부적으로 DDS를 사용합니다.
쉽게 말하면, DDS는 ROS2에서 토픽 통신을 실제로 처리해 주는 기반 기술입니다
DDS의 핵심 특징
1. 데이터 중심 통신
DDS는 “누가 보냈는가”보다 어떤 데이터를 주고받는가에 집중합니다.
ROS2에서는 데이터를 Topic 단위로 주고받습니다.
예를 들어:
/camera_image
/lidar_points
/odom
/cmd_vel
같은 토픽 이름을 기준으로 데이터를 발행하고 구독합니다.
2. 발행-구독 구조
DDS는 Publisher / Subscriber 방식을 사용합니다.
Publisher → Topic → Subscriber
예를 들면:
카메라 노드 → /camera_image 발행
비전 처리 노드 → /camera_image 구독
Publisher는 데이터를 보내고, Subscriber는 필요한 데이터만 골라서 받습니다.
ROS1처럼 roscore 같은 중앙 마스터가 꼭 필요하지 않습니다.
그래서 ROS2는 더 분산형 구조에 가깝습니다.
3. QoS 설정
DDS의 중요한 장점은 QoS(Quality of Service) 입니다.
QoS는 통신 품질을 정하는 옵션입니다.
대표적으로 다음과 같은 설정이 있습니다.
| Reliability | 데이터를 반드시 받을지, 빠르게 보낼지 결정 |
| Durability | 늦게 접속한 구독자가 이전 데이터를 받을 수 있는지 결정 |
| History | 최근 데이터를 몇 개까지 보관할지 결정 |
예를 들어 센서 데이터처럼 빠른 속도가 중요한 경우에는 Best Effort를 사용할 수 있습니다.
반대로 명령 데이터처럼 손실되면 안 되는 경우에는 Reliable을 사용할 수 있습니다.
ROS2가 DDS를 사용하는 이유
ROS1은 roscore라는 중앙 관리자가 필요했습니다.
이 구조는 간단하지만, 시스템이 커지거나 실시간성이 필요한 환경에서는 한계가 있습니다.
ROS2는 DDS를 사용하면서 다음 장점을 얻었습니다.
중앙 마스터가 필요 없음
분산 시스템 구성에 유리함
실시간 통신에 더 적합함
QoS로 통신 품질 조절 가능
산업용 시스템에 적용하기 좋음
즉, DDS 덕분에 ROS2는 드론, 자율주행, 로봇 제어, 스마트팩토리 같은 환경에 더 잘 맞게 되었습니다.
ROS2에서 DDS가 하는 일
ROS2 노드는 토픽을 발행하거나 구독합니다.
그 뒤의 실제 연결 관리는 DDS가 처리합니다.
DDS는 내부적으로 다음 일을 합니다.
Publisher와 Subscriber 자동 연결
같은 Topic을 사용하는 노드 탐색
QoS 조건 확인
데이터 전달
네트워크 변화에 따른 재연결 처리
개발자는 직접 네트워크 연결을 관리하지 않아도 됩니다.
토픽을 만들고 데이터를 보내거나 받으면, DDS가 뒤에서 통신을 처리합니다.
ROS2에서 사용하는 DDS 종류
ROS2에서는 여러 DDS 구현체를 사용할 수 있습니다.
| Fast DDS | ROS2에서 기본적으로 많이 사용됨 |
| Cyclone DDS | 가볍고 성능이 좋아 많이 사용됨 |
| RTI Connext DDS | 산업용 고성능 DDS, 주로 상용 환경에서 사용 |
프로젝트 목적에 따라 DDS 구현체를 바꿔 사용할 수 있습니다.
정리
DDS는 ROS2의 통신 기반입니다.
ROS2에서 노드들이 토픽으로 데이터를 주고받을 수 있는 이유가 바로 DDS 덕분입니다.
핵심만 정리하면 다음과 같습니다.
DDS = ROS2 통신을 담당하는 미들웨어
Topic = 데이터가 오가는 이름
Publisher = 데이터를 보내는 쪽
Subscriber = 데이터를 받는 쪽
QoS = 통신 품질 설정
3. 상황에 따라 사용할 설정
아래 설정은 필수는 아니지만, 프로젝트 구조에 따라 유용합니다.
export ROS_NAMESPACE=robot1
모든 노드, 토픽, 서비스 앞에 namespace를 붙입니다.
여러 대의 로봇을 동시에 운용할 때 유용합니다.
단, 처음 ROS 2를 학습하는 단계에서는 혼란을 줄 수 있으므로 필요할 때만 사용하십시오.
4. 로그 출력 설정
로그를 간단하고 보기 쉽게 출력합니다.
기본 개발 환경에서는 아래 형식이 가장 무난합니다.
# ==============================
# ROS 2 Logging
# ==============================
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'
export RCUTILS_COLORIZED_OUTPUT=1
export RCUTILS_LOGGING_USE_STDOUT=0
export RCUTILS_LOGGING_BUFFERED_STREAM=1
디버깅을 더 자세히 하고 싶다면 아래 형식을 사용할 수 있습니다.
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})'
1. RCUTILS_CONSOLE_OUTPUT_FORMAT
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'
이 변수는 콘솔에 출력되는 로그 형식을 지정합니다.
예를 들어 ROS 2 Python 코드에서:
node.get_logger().info('Hello ROS 2')
node.get_logger().warn('Battery low')
node.get_logger().error('Motor error')
기본 출력은 보통 이런 식입니다.
[INFO] [1710000000.123456789] [my_node]: Hello ROS 2
[WARN] [1710000000.123456789] [my_node]: Battery low
[ERROR] [1710000000.123456789] [my_node]: Motor error
그런데 아래처럼 설정하면:
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'
출력이 이렇게 단순해집니다.
[INFO]: Hello ROS 2
[WARN]: Battery low
[ERROR]: Motor error
즉, 시간, 노드 이름, logger 이름 등을 빼고 로그 레벨과 메시지만 출력하게 됩니다.
사용 가능한 대표 항목은 다음과 같습니다.
| {severity} | 로그 레벨: DEBUG, INFO, WARN, ERROR, FATAL |
| {message} | 실제 로그 메시지 |
| {name} | logger 이름 |
| {time} | 로그 발생 시간 |
| {function_name} | 로그를 호출한 함수 이름 |
| {file_name} | 로그를 호출한 파일 이름 |
| {line_number} | 로그가 호출된 줄 번호 |
예를 들어:
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}] [{name}]: {message}'
그러면 출력은 이런 식입니다.
[INFO] [my_node]: Hello ROS 2
디버깅할 때는 더 자세히 이렇게도 씁니다.
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}] [{time}] [{name}] {file_name}:{line_number} {message}'
출력 예:
[INFO] [1710000000.123456789] [my_node] test_node.py:25 Hello ROS 2
2. RCUTILS_COLORIZED_OUTPUT
export RCUTILS_COLORIZED_OUTPUT=1
이 변수는 로그에 색상을 입힐지 여부를 정합니다.
export RCUTILS_COLORIZED_OUTPUT=1
이면 색상 출력 사용입니다.
보통 다음처럼 보입니다.
| DEBUG | 회색 |
| INFO | 기본색 또는 초록 계열 |
| WARN | 노랑 |
| ERROR | 빨강 |
| FATAL | 진한 빨강 |
터미널에서 로그를 볼 때 WARN, ERROR가 눈에 잘 띄어서 편합니다.
끄려면:
export RCUTILS_COLORIZED_OUTPUT=0
또는 자동 판단을 원하면 설정하지 않아도 됩니다.
3. RCUTILS_LOGGING_USE_STDOUT
export RCUTILS_LOGGING_USE_STDOUT=0
이 변수는 로그를 stdout으로 보낼지 stderr로 보낼지 정합니다.
0인 경우
export RCUTILS_LOGGING_USE_STDOUT=0
로그가 stderr로 출력됩니다.
1인 경우
export RCUTILS_LOGGING_USE_STDOUT=1
로그가 stdout으로 출력됩니다.
둘의 차이는 중요합니다.
| stdout | 일반 출력 |
| stderr | 에러/로그/진단 출력 |
Linux에서 리다이렉션할 때 차이가 납니다.
예를 들어:
ros2 run my_pkg my_node > output.txt
이 명령은 stdout만 output.txt로 저장합니다.
만약 로그가 stderr로 나가고 있으면, 위 명령으로는 로그가 파일에 저장되지 않고 터미널에 계속 보입니다.
로그까지 파일로 저장하려면:
ros2 run my_pkg my_node > output.txt 2>&1
여기서:
2>&1
은 stderr도 stdout으로 합쳐서 저장하라는 뜻입니다.
현재 설정은:
export RCUTILS_LOGGING_USE_STDOUT=0
이므로 로그는 stderr로 출력됩니다.
즉, 로그를 일반 출력과 분리해서 다루겠다는 설정입니다. 실무에서는 이쪽이 더 정석입니다.
4. RCUTILS_LOGGING_BUFFERED_STREAM
export RCUTILS_LOGGING_BUFFERED_STREAM=1
이 변수는 로그 출력 스트림을 버퍼링할지 여부를 정합니다.
버퍼링이란?
출력할 때마다 바로바로 터미널에 찍는 것이 아니라, 어느 정도 모았다가 한 번에 출력하는 방식입니다.
export RCUTILS_LOGGING_BUFFERED_STREAM=1
이면 버퍼링 사용입니다.
export RCUTILS_LOGGING_BUFFERED_STREAM=0
이면 버퍼링을 끕니다.
차이는 이렇습니다.
| 0 | 로그가 바로바로 출력됨 |
| 1 | 로그를 버퍼에 모았다가 출력할 수 있음 |
개발 중에는 보통 즉시 출력이 편합니다.
export RCUTILS_LOGGING_BUFFERED_STREAM=0
특히 노드가 갑자기 죽거나 crash 날 때는 버퍼에 남은 로그가 출력되지 못할 수 있습니다.
그래서 디버깅할 때는 0이 더 낫습니다.
반대로 로그가 너무 많고 성능을 조금이라도 챙기고 싶으면 1을 쓸 수 있습니다.
현재 설정 전체 의미
현재 설정은:
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'
export RCUTILS_COLORIZED_OUTPUT=1
export RCUTILS_LOGGING_USE_STDOUT=0
export RCUTILS_LOGGING_BUFFERED_STREAM=1
의미는 다음과 같습니다.
로그 출력 형식은 [INFO]: message 처럼 단순하게 한다.
로그 색상은 사용한다.
로그는 stdout이 아니라 stderr로 보낸다.
로그 출력은 버퍼링한다.
예상 출력:
[INFO]: Node started
[WARN]: Waiting for service
[ERROR]: Service call failed
ROS 2 학습/디버깅용 추천 설정
처음 공부하거나 디버깅할 때는 저는 아래 설정이 더 낫다고 봅니다.
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}] [{name}]: {message}'
export RCUTILS_COLORIZED_OUTPUT=1
export RCUTILS_LOGGING_USE_STDOUT=1
export RCUTILS_LOGGING_BUFFERED_STREAM=0
이렇게 하면:
[INFO] [my_node]: Hello ROS 2
처럼 노드 이름도 나오고, 로그도 바로바로 출력됩니다.
특히 여러 노드를 동시에 실행할 때는 {name}이 있는 게 좋습니다.
5. 반드시 추천하는 alias
아래 alias는 ROS 2 개발 시 자주 사용하므로 등록하는 것을 추천합니다.
# ==============================
# Workspace Alias
# ==============================
alias cw='cd ~/robot_study'
alias cs='cd ~/robot_study/src'
# ==============================
# Colcon Build Alias
# ==============================
alias cb='cd ~/robot_study && colcon build --symlink-install'
alias cbs='colcon build --symlink-install'
alias cbp='colcon build --symlink-install --packages-select'
alias cbu='colcon build --symlink-install --packages-up-to'
# ==============================
# ROS 2 Basic Alias
# ==============================
alias rt='ros2 topic list'
alias re='ros2 topic echo'
alias rn='ros2 node list'
a. 워크스페이스 이동
alias cw='cd ~/robot_study'
alias cs='cd ~/robot_ study/src'
b. 전체 빌드
alias cb='cd ~/robot_study && colcon build --symlink-install'
어느 경로에 있든 ~/robot_study 로 이동한 뒤 전체 빌드합니다.
c. 현재 위치 기준 빌드
alias cbs='colcon build --symlink-install'
현재 위치에서 빌드합니다.
d. 특정 패키지만 빌드
alias cbp='colcon build --symlink-install --packages-select'
사용 예:
cbp my_robot_package
e. 특정 패키지와 의존 패키지 빌드
alias cbu='colcon build --symlink-install --packages-up-to'
사용 예:
cbu my_robot_package
f. 토픽, 노드 확인
alias rt='ros2 topic list'
alias re='ros2 topic echo'
alias rn='ros2 node list'
6. 선택적으로 추천하는 alias
아래는alias는 있으면 편하지만 필수는 아닙니다.
# ==============================
# Colcon Test Alias
# ==============================
alias ct='colcon test'
alias ctp='colcon test --packages-select'
alias ctr='colcon test-result'
# ==============================
# Colcon CD
# ==============================
alias ccd='colcon_cd'
# ==============================
# Code Quality
# ==============================
alias af='ament_flake8'
alias ac='ament_cpplint'
# ==============================
# Test Nodes
# ==============================
alias testpub='ros2 run demo_nodes_cpp talker'
alias testsub='ros2 run demo_nodes_cpp listener'
alias testpubimg='ros2 run image_tools cam2image'
alias testsubimg='ros2 run image_tools showimage'
7. Gazebo 관련 alias
ROS 2 Humble에서는 Gazebo Classic 또는 Ignition/Gazebo 계열을 프로젝트에 따라 다르게 사용합니다.
Gazebo Classic을 사용하는 경우:
alias killgazebo='killall -9 gazebo & killall -9 gzserver & killall -9 gzclient'
Gazebo Sim 계열을 사용하는 경우 추가로 사용할 수 있습니다.
alias killgz='killall -9 gz sim & killall -9 gzserver & killall -9 gzclient'
단, 강제 종료 명령이므로 시뮬레이터가 멈췄을 때만 사용하는 것이 좋습니다.
8. 최종 bashrc 예시 - ROS2 Humble
아래 내용을 ~/.bashrc 맨 아래에 추가합니다.
# ==================================================
# ROS 2 Humble Environment
# ==================================================
source /opt/ros/humble/setup.bash
# User ROS 2 Workspace
if [ -f ~/robot_ws/install/local_setup.bash ]; then
source ~/robot_ws/install/local_setup.bash
fi
# Colcon Auto Completion
if [ -f /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash ]; then
source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
fi
if [ -f /usr/share/colcon_cd/function/colcon_cd.sh ]; then
source /usr/share/colcon_cd/function/colcon_cd.sh
fi
if [ -f /usr/share/vcstool-completion/vcs.bash ]; then
source /usr/share/vcstool-completion/vcs.bash
fi
export _colcon_cd_root=~/ros2_study
# ROS 2 Network
export ROS_DOMAIN_ID=7
# export ROS_NAMESPACE=robot1
# DDS Middleware
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# ROS 2 Logging
export RCUTILS_CONSOLE_OUTPUT_FORMAT='[{severity}]: {message}'
export RCUTILS_COLORIZED_OUTPUT=1
export RCUTILS_LOGGING_USE_STDOUT=0
export RCUTILS_LOGGING_BUFFERED_STREAM=1
# ==================================================
# Alias
# ==================================================
# Workspace
alias cw='cd ~/ros2_study'
alias cs='cd ~/ros2_study/src'
alias ccd='colcon_cd'
# Build
alias cb='cd ~/ros2_study && colcon build --symlink-install'
alias cbs='colcon build --symlink-install'
alias cbp='colcon build --symlink-install --packages-select'
alias cbu='colcon build --symlink-install --packages-up-to'
# Test
alias ct='colcon test'
alias ctp='colcon test --packages-select'
alias ctr='colcon test-result'
# ROS 2 CLI
alias rt='ros2 topic list'
alias re='ros2 topic echo'
alias rn='ros2 node list'
# Gazebo
alias killgazebo='killall -9 gazebo & killall -9 gzserver & killall -9 gzclient'
alias killgz='killall -9 gz sim & killall -9 gzserver & killall -9 gzclient'
# Code Check
alias af='ament_flake8'
alias ac='ament_cpplint'
# Demo Nodes
alias testpub='ros2 run demo_nodes_cpp talker'
alias testsub='ros2 run demo_nodes_cpp listener'
alias testpubimg='ros2 run image_tools cam2image'
alias testsubimg='ros2 run image_tools showimage'
9. 적용
bashrc 수정 후 아래 명령을 실행합니다.
source ~/.bashrc

아래의 명령을 실행하여 ROS Command가 정상적으로 등록되었는지를 확인합니다.
ros2 --version
echo $ROS_DOMAIN_ID
echo $RMW_IMPLEMENTATION
cw

'강좌 > ROS2' 카테고리의 다른 글
| ROS2 Topic (0) | 2026.05.04 |
|---|---|
| ROS2 Service (0) | 2026.05.04 |
| ROS2 Humble에서 Turtlesim 설치 및 실행하기 (0) | 2026.05.03 |
| ROS2 Humble 개발 환경 설정 (0) | 2026.05.03 |
| Ubuntu 22.04에서 ROS2 설치 (0) | 2026.05.03 |
