**토픽(Topic)**은 ROS 2의 세 가지 주요 통신 방식 중 하나다. 연속적인 데이터 스트림—센서 데이터, 로봇 상태 등—에 사용한다.
ROS 2는 **강타입(strongly-typed)**이고 **익명(anonymous)**인 발행/구독(publish/subscribe) 시스템이다. 아래에서 이 특성을 정리한다.
Publish/Subscribe
데이터를 **만드는 쪽(Publisher)**과 **받는 쪽(Subscriber)**가 있다. 서로 **토픽(topic)**이라는 공통 이름으로 연결된다. 퍼블리셔를 만들 때 토픽 이름을 지정하고, 같은 토픽 이름으로 구독하는 서브스크라이버와 자동으로 통신한다.
- 한 토픽에 퍼블리셔 0개 이상, 서브스크라이버 0개 이상 존재할 수 있다.
- 어떤 퍼블리셔가 토픽에 데이터를 보내면 그 토픽을 구독하는 모든 서브스크라이버가 그 데이터를 받는다.
- 이 구조를 **버스(bus)**에 비유한다. 퍼블리셔와 서브스크라이버가 필요에 따라 붙었다 떨어졌다 해도 되고, 그래서 디버깅·관측이 자연스럽다. 예:
ros2 bag record는 지정한 토픽에 새 서브스크라이버를 하나 더 만드는 것일 뿐이라, 다른 노드들의 데이터 흐름을 끊지 않는다.
Anonymous (익명)
익명이란, 서브스크라이버가 데이터를 받을 때 어느 퍼블리셔가 보냈는지 보통은 모르고 알 필요도 없다는 뜻이다(필요하면 조회는 가능). 그래서 퍼블리셔나 서브스크라이버를 바꿔 끼워도 시스템 나머지에 영향을 주지 않는다.
Strongly-typed (강타입)
강타입은 두 가지 의미가 있다.
- 필드 타입이 정해져 있고 검사된다. 메시지에
uint32 field1,string field2가 있으면,field1은 항상 부호 없는 정수,field2는 항상 문자열로 다뤄진다. - 필드의 의미(시맨틱)가 정의되어 있다. 자동으로 강제되지는 않지만, 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