basic - topics

**토픽(Topic)**은 ROS 2의 세 가지 주요 통신 방식 중 하나다. 연속적인 데이터 스트림—센서 데이터, 로봇 상태 등—에 사용한다.

ROS 2는 **강타입(strongly-typed)**이고 **익명(anonymous)**인 발행/구독(publish/subscribe) 시스템이다. 아래에서 이 특성을 정리한다.

Publish/Subscribe

데이터를 **만드는 쪽(Publisher)**과 **받는 쪽(Subscriber)**가 있다. 서로 **토픽(topic)**이라는 공통 이름으로 연결된다. 퍼블리셔를 만들 때 토픽 이름을 지정하고, 같은 토픽 이름으로 구독하는 서브스크라이버와 자동으로 통신한다.

  • 한 토픽에 퍼블리셔 0개 이상, 서브스크라이버 0개 이상 존재할 수 있다.
  • 어떤 퍼블리셔가 토픽에 데이터를 보내면 그 토픽을 구독하는 모든 서브스크라이버가 그 데이터를 받는다.
  • 이 구조를 **버스(bus)**에 비유한다. 퍼블리셔와 서브스크라이버가 필요에 따라 붙었다 떨어졌다 해도 되고, 그래서 디버깅·관측이 자연스럽다. 예: ros2 bag record는 지정한 토픽에 새 서브스크라이버를 하나 더 만드는 것일 뿐이라, 다른 노드들의 데이터 흐름을 끊지 않는다.

Anonymous (익명)

익명이란, 서브스크라이버가 데이터를 받을 때 어느 퍼블리셔가 보냈는지 보통은 모르고 알 필요도 없다는 뜻이다(필요하면 조회는 가능). 그래서 퍼블리셔나 서브스크라이버를 바꿔 끼워도 시스템 나머지에 영향을 주지 않는다.

Strongly-typed (강타입)

강타입은 두 가지 의미가 있다.

  1. 필드 타입이 정해져 있고 검사된다. 메시지에 uint32 field1, string field2가 있으면, field1은 항상 부호 없는 정수, field2는 항상 문자열로 다뤄진다.
  2. 필드의 의미(시맨틱)가 정의되어 있다. 자동으로 강제되지는 않지만, ROS 표준 메시지들은 의미가 명시되어 있다. 예: IMU 메시지의 각속도는 3차원 벡터이고, 단위는 rad/s로 정해져 있다.

Topic 명령어

# 토픽 목록 및 메시지 타입 확인 (-t: with type)
ros2 topic list -t

# 토픽 상세 정보 (퍼블리셔/서브스크라이버 수 등)
ros2 topic list -v

# 토픽 메시지 인터페이스(필드) 확인
ros2 interface show turtlesim/msg/Pose
# float32 x
# float32 y
# float32 theta
# ...
# float32 linear_velocity
# float32 angular_velocity

# 토픽 데이터 실시간 구독·출력
ros2 topic echo /turtle1/pose

참고: Topics — ROS 2 Jazzy