본문으로 바로가기

ROS2 Topic

category 강좌/ROS2 2026. 5. 4. 23:18
728x90
728x90

ROS 2에서 토픽(Topic)은 노드(Node) 간 데이터를 전달하는 가장 기본적이고 핵심적인 통신 방식입니다.

실제 로봇 시스템을 구성할 때 센서 데이터 처리, 상태 공유, 제어 명령 전달 등 대부분의 데이터 흐름이 이 토픽을 기반으로 이루어진다고 보시면 됩니다.

아래에서는 개념부터 구조, 특징, 그리고 실무적인 활용까지 체계적으로 정리해 드리겠습니다.

 

1. 토픽 통신의 기본 구조

 

토픽 통신은 Publisher(발행자)Subscriber(구독자) 간의 메시지 교환 구조로 이루어집니다.

 

 

 

 

  • Publisher
    • 특정 토픽으로 데이터를 발행하는 역할
    • 센서 값, 상태 정보, 명령 데이터 등을 송신
  • Subscriber
    • 특정 토픽을 구독하여 데이터를 수신
    • 수신된 메시지를 기반으로 로직 수행
  • Message (msg)
    • 통신 시 사용되는 데이터 형식
    • 사전에 정의된 구조체 형태 (예: geometry_msgs, sensor_msgs 등)

즉, Publisher는 데이터를 "보내는 역할", Subscriber는 데이터를 "받는 역할"을 수행하며, 이 둘은 직접 연결되는 것이 아니라 토픽 이름을 통해 간접적으로 연결됩니다.

 

 

2. 다양한 통신 형태 (1:N, N:1, N:N)

 

토픽 통신은 단순한 1:1 구조를 넘어서 매우 유연한 확장이 가능합니다.

 

 

 

  • 1 : 1
    • 기본적인 Publisher ↔ Subscriber 구조
  • 1 : N
    • 하나의 Publisher → 여러 Subscriber
    • 예: 카메라 센서 데이터를 여러 노드에서 동시에 처리
  • N : 1
    • 여러 Publisher → 하나의 Subscriber
    • 예: 여러 센서 데이터를 하나의 데이터 처리 노드에서 통합
  • N : N
    • 여러 Publisher ↔ 여러 Subscriber
    • 복잡한 로봇 시스템에서 흔히 사용

 

이러한 구조 덕분에 ROS 2는 시스템 확장성과 모듈화를 매우 효율적으로 지원합니다.

 

 

3. 비동기 통신의 특징

토픽 기반 통신의 핵심은 비동기(Asynchronous) 방식이라는 점입니다.

  • Publisher와 Subscriber는 서로의 존재를 직접 알 필요가 없습니다.
  • 메시지는 일정한 주기 또는 이벤트 기반으로 계속 발행됩니다.
  • Subscriber는 필요한 시점에 메시지를 수신하여 처리합니다.

이로 인해 다음과 같은 장점이 있습니다.

  • 시스템 간 결합도가 낮아짐 (Loose Coupling)
  • 노드 추가/삭제 시 영향 최소화
  • 실시간 스트리밍 데이터 처리에 유리

 

 

4. 지속적 데이터 흐름 (Streaming)

토픽은 연속적인 데이터 전송에 매우 적합합니다.

대표적인 사용 예시는 다음과 같습니다.

  • 센서 데이터
    • LiDAR, 카메라, IMU, GPS
  • 상태 정보
    • 로봇 위치, 속도, 배터리 상태
  • 제어 입력
    • 속도 명령 (cmd_vel)
  • 환경 인식 데이터
    • 객체 인식 결과, 맵 정보

즉, "계속 흘러가는 데이터"는 거의 대부분 토픽으로 처리된다고 보시면 됩니다.

 

 

5. 하나의 노드에서 다중 역할 수행

하나의 노드는 단순히 Publisher 또는 Subscriber 하나만 수행하지 않습니다.

  • 하나의 노드가 여러 개의 토픽을 발행 가능
  • 동시에 여러 토픽을 구독 가능
  • Publisher + Subscriber 역할을 동시에 수행 가능

예를 들어,

  • 드론 제어 노드
    • 센서 데이터 구독 (IMU, GPS)
    • 제어 명령 발행 (모터 속도)
    • 상태 정보 발행 (현재 위치)

또한 필요에 따라 자기 자신이 발행한 토픽을 다시 구독하는 구조(Loopback)도 구성할 수 있습니다.

 

 

6. QoS (Quality of Service) 설정 (ROS 2 핵심 차별점)

ROS 2에서는 DDS 기반 통신을 사용하기 때문에 QoS 설정이 매우 중요합니다.

주요 옵션은 다음과 같습니다.

  • Reliability
    • Reliable (신뢰성 보장)
    • Best Effort (속도 우선)
  • Durability
    • Volatile (실시간 데이터만)
    • Transient Local (이전 데이터 유지)
  • History
    • Keep Last (최근 N개 유지)
    • Keep All (전체 유지)

예시:

  • 카메라 영상 → Best Effort
  • 로봇 상태 → Reliable

즉, 데이터 특성에 따라 통신 전략을 최적화할 수 있습니다.

 

 

7. 토픽 목록 확인(ros2 topic list)

 

 

먼저 2개의 터미널을 실행하고 하나에는 turtlesim 노드를 실행하고 다른 터미널에서는 turtle_teleop_key를 실행합니다.

 

ros2 run turtlesim turtlesim_node

 

 

 

ros2 run turtlesim turtle_teleop_key

 

 

 

 

현재 실행 중인 ROS2 시스템에서 사용 가능한 토픽 목록을 확인하는 명령입니다.

 

ros2 topic list

 

 

 

위의 그림처럼 현재 실행 중인 토픽의 리스트가 출력됩니다. /rosout은 기본적으로 실행되는 토픽입니다.

 

node info 명령을 사용하여 노드의 토픽 정보를 확인할 수 있습니다.

turtlesim_node 노드는 turtlesim이라는 노드 이름으로 실행됩니다.

여기서 알 수 있는 것은 turtlesim 노드는 geometry_msgs/msg/Twist 형태의 메시지인 cmd_vel을 구독하고 있다는 것과 turtlesim/msg/Color 형태의 color_sensor 메시지 형태인 color_sensor, 그리고 turtlesim/msg/Pose 형태의 pose 메시지를 발행하고 있다는 것입니다.

 

ros2 node info /turtlesim

 

 

 

좀 더 간단하게 메시지들을 확인하고 싶을 때에는 `ros2 topic list -t`를 이용할 수 있습니다.

이 명령어는 현재 개발 환경에서 동작 중인 모든 노드들의 토픽 정보를 출력합니다. 현재는 turtlesim 노드만이 실행된 상태이기에 turtlesim 노드가 발행, 구독하는 메시지만 표시됩니다.

여기서 `-t` 옵션은 부가적인 것으로 각 메시지의 형태(type)를 함께 표시해 줍니다.

 

ros2 topic list -t

 

 

 

8. rqt_graph 실행

 

토픽 흐름을 직관적으로 확인하려면 rqt_graph GUI 도구를 활용해야 합니다. 

 

rqt_graph

 

 

 

 

 

위의 그림은 turtle_teleop_key을 종료한 상태에서 rqt_graph 실행결과입니다. 여기서는 토픽을 주고받지 않기 때문에 어떤 토픽 흐름도 볼 수 없습니다.

 

turtle_teleop_key를 다시 실행한 후에 rqt_graph GUI 프로그램의 좌측상단의 'Refresh ROS graph' 버튼을 클릭하면 최신 상태로 갱신됩니다. eleop_turtle 노드에서 발행한 cmd_vel 토픽을 turtlesim에서 구독하고 있는 모습을 볼 수 있습니다.

 

 

 

위의 그림에서는 color_sensor 및 pose 토픽이 표시되지 않습니다. 분명히 turtlesim 노드는 이 두 개의 토픽을 발행하고 있지만 화면에 출력되지 않는 이유는 이를 구독하는 노드가 없기 때문이다. 만약에 발행하는 노드, 구독하는 노드와 상관없이 모든 토픽을 보고 싶으면 rqt_graph 화면에서 `Dead sinks`와 `Leaf topics`를 해제하면 모든 토픽이 출력됩니다.

 

 

 

아래의 그림은 debug 체크를 해제한 경우에 출력된 결과입니다.

 

 

 

9. 토픽 정보 확인(ros2 topic info)

ros2 topic info는 특정 토픽의 타입, Publisher 수, Subscriber 수를 확인합니다.

 

ros2 topic info /turtle1/cmd_vel

 

ros2 topic info /turtle1/pose

 

 

 

자세한 토픽 정보를 한 번에 보려면 다음 명령도 사용할 수 있습니다.

 

ros2 topic list -v

 

 

10. 토픽 타입 확인(ros2 topic type)

 

특정 토픽이 사용하는 메시지 타입을 확인하는 명령입니다.

 

ros2 topic type /turtle1/pose

 

 

11. 메시지 타입 구조 확인하기

 

a. 데이터 타입 구조 (중요)

 

ROS 메시지는 단순한 구조가 아니라 계층형 구조다.

 

(1)  단순 자료형

  기본 타입

  • int32, int64
  • float32, float64
  • bool
  • string

https://github.com/ros2/common_interfaces/tree/humble/std_msgs

 

common_interfaces/std_msgs at humble · ros2/common_interfaces

A set of packages which contain common interface files (.msg and .srv). - ros2/common_interfaces

github.com

 

(2) 메시지 안에 메시지 (중첩 구조)

대표 예:
geometry_msgs의 Twist

 

https://github.com/ros2/common_interfaces/blob/humble/geometry_msgs/msg/Twist.msg

 

common_interfaces/geometry_msgs/msg/Twist.msg at humble · ros2/common_interfaces

A set of packages which contain common interface files (.msg and .srv). - ros2/common_interfaces

github.com

 

 

구조:

Vector3 linear
Vector3 angular
 

Vector3 내부:

float64 x
float64 y
float64 z

 

linear.x
linear.y
linear.z
angular.x
angular.y
angular.z
 

위와 같이 총 6개 값으로 속도를 표현합니다.

 

 

(3) 배열 구조

대표 예:
sensor_msgs의 LaserScan

의미:

  • 여러 개의 거리 데이터 배열
  • LiDAR 데이터 표현

 

b. ROS 2 메시지 인터페이스 이해하기: geometry_msgs/msg/Twist 구조 분석

 

ROS 2에서 노드 간 데이터를 주고받을 때 가장 기본이 되는 개념 중 하나가 인터페이스(interface)입니다. 인터페이스는 노드가 어떤 형태의 데이터를 보내고 받을 것인지를 정의한 규격입니다. 쉽게 말해, ROS 2에서 사용하는 데이터 구조의 약속이라고 볼 수 있습니다.

토픽 통신에서는 주로 msg 인터페이스가 사용됩니다. 서비스에서는 srv, 액션에서는 action 인터페이스가 사용됩니다. 이 중에서 토픽 기반 통신을 이해하기 위해서는 먼저 메시지 인터페이스인 msg 구조를 정확히 이해해야 합니다.

 

(1) /turtle1/cmd_vel 토픽과 Twist 메시지

turtlesim 예제에서 거북이를 움직일 때 사용하는 대표적인 토픽이 있습니다.

 
/turtle1/cmd_vel
 

 

이 토픽은 거북이에게 속도 명령을 전달하는 역할을 합니다. 여기서 사용되는 메시지 타입은 다음과 같습니다.

 
geometry_msgs/msg/Twist
 

이 이름은 세 부분으로 나누어 이해할 수 있습니다.

geometry_msgs / msg / Twist
 
구분의미
geometry_msgs 기하학 관련 메시지를 모아둔 패키지
msg 메시지 인터페이스 분류
Twist 속도 정보를 표현하는 메시지 타입

 

즉, geometry_msgs/msg/Twist는 기하학적 운동 정보를 표현하기 위한 Twist 메시지 구조입니다.

 

(2) Twist 메시지의 기본 구조

Twist 메시지는 로봇의 속도를 표현하기 위해 사용됩니다. 구조는 다음과 같습니다.

 
ros2 interface show geometry_msgs/msg/Twist
 

 

 

출력 결과는 다음과 같습니다.

Vector3 linear
Vector3 angular
 

 

여기서 중요한 점은 Twist 메시지가 단순히 숫자 하나로 구성된 것이 아니라는 점입니다. Twist 안에는 다시 두 개의 Vector3 메시지가 포함되어 있습니다.

                       필드  이름                                              타입                                                                 의미
linear Vector3 병진 속도
angular Vector3 회전 속도

 

즉, Twist는 선형 이동 속도와 회전 속도를 함께 표현하는 메시지입니다.

 

(3) Vector3 메시지 구조

Twist 내부에서 사용되는 Vector3 메시지도 직접 확인할 수 있습니다.

 
ros2 interface show geometry_msgs/msg/Vector3
 

 

 

위의 출력결과를 보면

 

  이 메시지는 자유 공간에서의 벡터를 나타냅니다.

  Point(위치) 와는 의미적으로 다릅니다.

  벡터는 항상 원점(0,0,0) 기준으로 정의됩니다.

  변환(TF)을 적용할 때 회전만 적용되고 이동(translation)은 적용되지 않습니다.

라고 주석으로 설명하고 있습니다.

 

 

출력 결과는 다음과 같습니다.

float64 x
float64 y
float64 z
 

 

Vector3는 3차원 공간의 벡터 값을 표현합니다. 각 축은 다음과 같은 의미를 가집니다.

                  필드                                                         의미
x X축 방향 값
y Y축 방향 값
z Z축 방향 값

 

따라서 Twist 메시지는 최종적으로 다음과 같은 6개의 실수 값으로 구성됩니다.

linear.x
linear.y
linear.z
angular.x
angular.y
angular.z

 

 

(4) Twist 메시지의 실제 의미

 

Twist 메시지는 로봇의 이동 속도와 회전 속도를 동시에 표현합니다.

                              항목                                                                                  의미
linear.x 전진 또는 후진 속도
linear.y 좌우 이동 속도
linear.z 상하 이동 속도
angular.x X축 기준 회전 속도
angular.y Y축 기준 회전 속도
angular.z Z축 기준 회전 속도

 

turtlesim에서는 2차원 평면에서 거북이가 움직이기 때문에 주로 다음 두 값만 사용됩니다.

linear.x
angular.z
 

 

위의 이미지는 표윤석 박사님의 ROS2 강좌 중에 발췌한 것입니다(https://cafe.naver.com/openrt/24101)

 

아래의 명령은 turtlesim/msg/Pose 메시지 구조를 확인하는 명령입니다.

 

ros2 interface show turtlesim/msg/Pose

 

위의 결과를 분석하면 아래와 같습니다.
  • x: 거북이의 x 위치
  • y: 거북이의 y 위치
  • theta: 거북이의 방향 각도
  • linear_velocity: 직선 방향 속도
  • angular_velocity: 회전 방향 속도

 

11. 토픽 내용 확인(ros2 topic echo)

 

특정 토픽의 데이터가 실시간으로 전달되는 것을 터미널에서 직접 확인하는 명령입니다.

 

ros2 topic echo /turtle1/pose

 

 

 

 

 

12. 토픽 대역폭 확인(ros2 topic bw)

 

ROS 2는 퍼블리셔(Publisher)와 서브스크라이버(Subscriber) 간의 메시지 교환을 기반으로 동작합니다. 이때 다음과 같은 요소들이 시스템 성능에 영향을 줍니다.

  • 메시지 크기 (Message Size)
  • 퍼블리시 주기 (Publish Rate)
  • 네트워크 상태 (특히 DDS 통신 환경)

대역폭을 측정하면 다음과 같은 문제를 사전에 확인할 수 있습니다.

  • 네트워크 과부하 여부
  • 불필요하게 큰 메시지 전송 여부
  • 주기 설정의 적절성

ROS 2에서는 특정 토픽의 대역폭을 측정하기 위해 ros2 topic bw 명령어를 제공합니다.

 

ros2 topic bw <topic_name>

 

아래의 명령을 실행하여 토픽의 대역폭을 확인합니다.

 

ros2 topic bw /turtle1/cmd_vel

 

 

 

 

더보기

출력 예:

Subscribed to [/turtle1/cmd_vel]
113 B/s from 3 messages
    Message size mean: 52 B min: 52 B max: 52 B
 

뜻은:

/turtle1/cmd_vel 토픽을 구독해서 데이터 전송량을 측정 중이다.
최근 3개의 메시지를 기준으로 초당 약 113 Byte가 들어오고 있다.
메시지 1개의 크기는 평균 52 Byte이다.
최소도 52 Byte, 최대도 52 Byte이다.

 

13. 토픽 주기 확인(ros2 topic hz)

ROS 2 기반 시스템에서 토픽의 “전송 주기”는 제어 성능과 시스템 안정성에 직접적인 영향을 주는 핵심 요소입니다. 특히 로봇 제어, 센서 데이터 처리, 자율주행 알고리즘에서는 메시지가 얼마나 빠르고 일정하게 전달되는지가 매우 중요합니다.

 

토픽 전송 주기(Publish Rate)는 퍼블리셔 노드가 메시지를 얼마나 자주 발행하는지를 나타내는 지표입니다. 일반적으로 Hz(헤르츠) 단위를 사용하며, 이는 “초당 메시지 전송 횟수”를 의미합니다.

예를 들어:

  • 10 Hz → 1초에 10번 메시지 전송
  • 50 Hz → 1초에 50번 메시지 전송

또한 Hz 값은 시간 간격으로도 표현할 수 있습니다.

  • 33.3 Hz ≈ 0.03초 간격 (30 ms)

특정 토픽의 발행 주기를 확인하기 위해 ROS 2에서는 다음 명령어를 제공합니다.

 

ros2 topic hz <topic_name>

 

아래의 명령을 실행하여 cmd_vel의 주기를 확인합니다.

 

ros2 topic hz /turtle1/cmd_vel

 

 

 

이 명령어는 해당 토픽을 구독하여 메시지 도착 간격을 측정하고, 이를 기반으로 평균 주기를 계산합니다.

 

측정 결과는 다음과 같이 해석할 수 있습니다.

  • average rate: 1.688 Hz
    → 초당 약 2회 메시지 발행
    → 약 0.5초 간격으로 메시지 전송
  • min / max
    → 메시지 간격의 최소/최대 값
    → 시스템 부하나 입력 이벤트에 따라 변동 발생
  • std dev (표준편차)
    → 주기의 안정성(지터, jitter)을 나타냄
    → 값이 작을수록 일정한 주기 유지
  • window
    → 평균 계산에 사용된 샘플 개수

 

 

14. 토픽 지연 시간 확인(ros2 topic delay)

 

ROS 2 시스템에서 메시지는 단순히 발행되는 것만으로 끝나지 않고, 다양한 계층을 거쳐 전달됩니다. 이 과정에서 필연적으로 “지연 시간(latency)”이 발생하며, 이는 실시간 제어 및 데이터 동기화에 중요한 영향을 미칩니다.

 

지연 시간은 퍼블리셔가 메시지를 생성한 시점과 서브스크라이버가 해당 메시지를 수신한 시점 사이의 시간 차이를 의미합니다.

즉,

  • Publish Time → 메시지 생성 시점
  • Receive Time → 메시지 수신 시점

이 두 시점의 차이가 바로 latency입니다.

ROS 2에서 메시지는 다음과 같은 경로를 거칩니다.

  • 사용자 노드 → RMW (ROS Middleware)
  • DDS 통신 계층
  • 네트워크 스택 (TCP/UDP)
  • 수신 노드

이 과정에서 다음 요소들이 지연을 유발합니다.

  • 직렬화 / 역직렬화 비용
  • 네트워크 전송 지연
  • OS 스케줄링 지연
  • DDS 큐 및 버퍼링

ROS 2에서는 메시지의 timestamp를 활용하여 지연 시간을 자동으로 계산할 수 있습니다.

 

ros2 topic delay <topic_name>

 

ros2 topic delay /camera/image_raw

 

ros2 topic delay 명령어는 메시지 내부에 timestamp 정보가 있어야 정상적으로 동작합니다.

일반적으로 다음 구조를 사용합니다.

 
std_msgs/Header header
 

이 안에는 다음 필드가 포함됩니다.

  • stamp.sec
  • stamp.nanosec

즉, 메시지에 Header가 포함되어 있어야 지연 시간 계산이 가능합니다.

대표적인 메시지 타입:

  • sensor_msgs/Image
  • sensor_msgs/LaserScan
  • geometry_msgs/PoseStamped
 
아래는 측정결과 예를 나타낸 것입니다.

 

 

average delay: 12.5 ms
min: 10.2 ms
max: 18.7 ms
std dev: 2.1 ms
window: 100

 

각 항목은 다음과 같은 의미를 가집니다.

  • average delay
    → 평균 지연 시간
    → 시스템 전체 통신 지연의 대표 값
  • min / max
    → 최소 및 최대 지연
    → 네트워크 상태 또는 시스템 부하에 따른 변동
  • std dev (표준편차)
    → 지연 시간의 안정성
    → 값이 클수록 지연이 불규칙함 (지터 발생)
  • window
    → 통계 계산에 사용된 샘플 수
 
 

15. 토픽 발행(ros2 topic pub)

 

ROS 2에서는 일반적으로 노드 내부 코드에서 publisher를 생성하여 토픽을 발행합니다. 그러나 초기 학습 단계나 시스템 점검, 디버깅 상황에서는 별도의 코드 작성 없이 CLI(Command Line Interface)를 통해 직접 토픽을 발행하는 방법이 매우 유용합니다.

ros2 topic pub 명령어는 ROS 2 네트워크 상에서 특정 토픽에 메시지를 발행(publish)하는 CLI 도구입니다.

 

a. 기본 형식

 
ros2 topic pub <topic_name> <msg_type> "<args>"
 
  • <topic_name>: 발행할 토픽 이름
  • <msg_type>: 메시지 타입 (패키지/메시지명 형식)
  • <args>: YAML 형식의 메시지 데이터

 

b. 메시지 타입 이해: geometry_msgs/msg/Twist

 

속도 제어에서 가장 많이 사용하는 메시지 타입 중 하나가 Twist입니다.

 

구성은 다음과 같습니다:

  • linear: 병진 속도 (x, y, z)
  • angular: 회전 속도 (x, y, z)

즉, 로봇 또는 시뮬레이터의 이동은 이 두 가지 요소로 정의됩니다.

 

c. 단일 메시지 발행 (--once 옵션)

 

아래 명령어는 단 한 번만 메시지를 발행합니다.

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

동작 해석

  • /turtle1/cmd_vel: 거북이 속도 제어 토픽
  • linear.x = 2.0: 전진 속도 2.0 m/s
  • angular.z = 1.8: 반시계 방향 회전 1.8 rad/s
  • --once: 메시지를 1회만 발행

활용 목적

  • 특정 동작을 "트리거"할 때
  • 시스템 연결 확인
  • 노드 응답 테스트

 

 

 

 

d. 주기적 메시지 발행 (--rate 옵션)

 

연속적인 동작을 유도하려면 주기적으로 메시지를 발행해야 합니다.

 
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
 

 

 

동작 해석

  • --rate 1: 1Hz (1초에 1번 발행)
  • 지속적으로 동일한 속도 명령 전달

중요 포인트

ROS 시스템에서 속도 명령은 지속적으로 공급되지 않으면 멈추는 경우가 많습니다.
따라서 실제 제어에서는 주기적 발행이 필수입니다.

 

 

 

e. 다양한 패턴 실험

속도 값을 변경하면서 다양한 궤적을 만들 수 있습니다.

 

예시:

 
# 직진
linear.x = 2.0, angular.z = 0.0

# 제자리 회전
linear.x = 0.0, angular.z = 2.0

# 곡선 이동
linear.x = 1.0, angular.z = 1.0
 

 

이와 같이 조합하면 원형, 나선형 등 다양한 경로를 생성할 수 있습니다.

 

 

16. bag 기록(ros2 bag record)

 

ROS2를 제대로 활용하려면 단순히 노드와 토픽을 다루는 수준을 넘어서, 데이터를 기록하고 재현하는 능력이 반드시 필요합니다. 이때 사용하는 핵심 도구가 바로 rosbag입니다.

 

 

a. rosbag의 본질: “데이터를 코드처럼 다루는 도구”

rosbag은 단순한 기록 도구가 아닙니다.
ROS 시스템에서 흐르는 실시간 토픽 데이터를 파일로 저장하고, 이후 동일한 데이터 흐름을 그대로 재현할 수 있는 기능입니다.

즉, 다음과 같은 구조로 이해하시면 됩니다.

실시간 ROS 시스템 → 토픽 데이터 → rosbag 저장 → 파일 → rosbag 재생 → 동일한 토픽 흐름 재현
 

 

이 기능을 활용하면 실제 로봇 없이도 동일한 조건을 반복적으로 만들 수 있습니다.

 

 

b. 왜 rosbag이 필수인가

ROS2를 사용하는 대부분의 시스템은 다음 특징을 가집니다.

  • 센서 데이터는 항상 변동됩니다.
  • 환경 조건은 동일하게 유지하기 어렵습니다.
  • 동일 테스트를 반복하기 어렵습니다.

이 상태에서 알고리즘을 개발하면 다음 문제가 발생합니다.

결과가 좋아졌다 → 알고리즘 개선 때문인지, 운이 좋은 데이터 때문인지 판단 불가
 

 

이 문제를 해결하는 방법이 rosbag입니다.

 

 

c. rosbag이 해결하는 문제

rosbag을 사용하면 다음과 같은 환경을 만들 수 있습니다.

 

1) 입력 데이터 고정

  • 동일한 센서 데이터 사용 가능
  • 동일한 오도메트리 데이터 재사용 가능

 

2) 반복 테스트 가능

같은 입력 → 다른 알고리즘 → 결과 비교 가능
 

 

3) 디버깅 환경 구축

  • 특정 상황 (예: 센서 오류, 급회전, 충돌 직전 상황) 재현 가능
  • 로그 분석보다 훨씬 직관적인 디버깅 가능

 

d. ros2 bag record: 토픽 기록하기

ROS2에서 토픽을 기록하는 기본 명령어는 다음과 같습니다.

 
ros2 bag record <topic_name1> <topic_name2> ...

 

 

ros2 bag record /turtle1/cmd_vel

 

실행하면 다음과 같은 메시지가 출력됩니다.

 
[INFO]: Opened database 'rosbag2_2026_05_04-22_46_24'.
[INFO]: Listening for topics...
[INFO]: Subscribed to topic '/turtle1/cmd_vel'
 

이 상태에서 해당 토픽이 발행되면 자동으로 데이터가 저장됩니다.

 

 

 

 

e. 기록 종료 방법

기록 종료는 매우 간단합니다.

 
Ctrl + C
 

종료 후에는 자동으로 폴더가 생성됩니다.

 
rosbag2_2026_05_04-22_46_24
 

이 폴더 안에는 다음이 포함됩니다.

  • 데이터베이스 파일 (SQLite3)
  • 메타데이터 파일 (metadata.yaml)

 

 

f. 저장 이름 지정하기

기본 이름은 자동 생성되지만, 실무에서는 반드시 이름을 지정하는 것이 좋습니다.

 
ros2 bag record -o <이름> <topic>

 

 

ros2 bag record -o cmd_vel_test /turtle1/cmd_vel

 

 

 

 

 

g. 여러 토픽 동시에 기록하기

실제 로봇에서는 하나의 토픽만 사용하는 경우는 거의 없습니다.

 
ros2 bag record /scan /odom /tf
 

SLAM 개발 예시:

 
ros2 bag record /scan /odom
 

 

이렇게 하면 라이다 데이터와 오도메트리 데이터를 동시에 기록할 수 있습니다.

 

 

h. 모든 토픽 기록하기

전체 시스템을 통째로 저장하고 싶을 경우 다음 명령을 사용합니다.

 
ros2 bag record -a
 

주의사항:

  • 데이터 용량이 매우 커질 수 있습니다.
  • 필요 없는 토픽까지 저장됩니다.

 

 

17. rosbag 재생 (핵심 기능)

기록된 데이터를 다시 실행하려면 다음 명령을 사용합니다.

 

 

ros2 bag play <폴더명>

 

ros2 bag play cmd_vel_test

 

이 명령을 실행하면 과거에 기록된 토픽이 동일한 타이밍으로 재생됩니다.

 

 

 

rosbag 재생은 단순히 데이터를 출력하는 것이 아닙니다.

특징 1: 시간까지 그대로 재현

기록 당시의 시간 간격 그대로 재생
 

특징 2: 실제 토픽처럼 동작

  • Subscriber는 실제 센서처럼 인식
  • 알고리즘은 실제 환경처럼 동작
728x90
728x90

'강좌 > ROS2' 카테고리의 다른 글

ROS2 파라미터  (0) 2026.05.06
ROS2 Action  (0) 2026.05.05
ROS2 Service  (0) 2026.05.04
ROS2 Humble에서 Turtlesim 설치 및 실행하기  (0) 2026.05.03
ROS2 Run Commands 설정  (0) 2026.05.03