[ROS2-002] 메시지 통신(message communication)
본 글은 오로카(오픈 로보틱스 커뮤니티)의 표윤석님께서 작성하신 로봇 운영체제 ROS2 강좌를 공부한 뒤 정리한 내용으로, 내용의 생략과 수정이 있습니다. 원문을 참고하고싶으신 분들은 본 글의 References 파트를 참고해주시길 바랍니다.
메시지 통신(message communication)
- 노드(node) : 최소 단위의 실행가능한 프로세스
- 메시지(message) : integer, floating point, boolean 등과 같은 변수 형태의 데이터
ROS2에서 노드(node)끼리 데이터를 주고받는 것을 메시지 통신(message communication)이라고 한다. 이때 메시지 통신은 방법에 따라 다음과 같이 세 가지로 나누어진다.
- 토픽 (topic)
- 서비스 (service)
- 액션 (action)
- 파라미터 (parameter)
간단 비교 : 토픽 vs. 서비스 vs. 액션
인터페이스(interface) : 데이터 통신에서 사용되는 데이터의 형태
다음의 세 가지 종류가 있음
- msg 인터페이스
- srv 인터페이스
- action 인터페이스
비교대상 | 토픽(topic) | 서비스(service) | 액션(action) |
---|---|---|---|
연속성 | 연속성 | 일회성 | 복합(토픽+서비스) |
방향성 | 단방향 | 양방향 | 양방향 |
동기성 | 비동기 | 동기 | 동기+비동기 |
다자간 연결 | 1:1, 1:N, N:1, N:N (publisher:subscriber) |
1:1 (server:client) |
1:1 (server:client) |
노드 역할 | 발행자 (publisher) 구독자 (subscriber) |
서버 (server) 클라이언트 (client) |
서버 (server) 클라이언트 (client) |
동작 트리거 | 발행자 | 클라이언트 | 클라이언트 |
인터페이스 | msg 인터페이스 | srv 인터페이스 | action 인터페이스 |
CLI 명령어 | ros2 topic ros2 interface |
ros2 service ros2 interface |
ros2 action ros2 interface |
사용 예 | 센서 데이터, 로봇 상태, 로봇 좌표, 로봇 속도 명령 등 | LED 제어, 모터 토크 On/Off, IK/FK 계산, 이동 경로 계산 등 | 목적지로 이동, 물건 파지, 복합 테스크 등 |
토픽 (topic)
- 노드의 역할
- Publisher : msg를 발간 (동작 트리거)
- Subscriber : msg를 구독
- 메시지 형태 : 메시지 (message)
- 메시지 인터페이스 : msg 인터페이스
- 특징
- 연속성, 단방향, 비동기성
- 1:1 (default), 1:N, N:1 N:N 통신 가능 + 셀프 구독도 가능!
- ROS 메시지 통신에서 가장 널리 사용되는 통신 방법 (대략 70%를 차지)
- 사용 예시
- 센서 데이터, 로봇 상태, 로봇 좌표, 로봇 속도 명령 등
CLI 명령어
ros2 node
-
ros2 node info
: 노드 정보 확인
ros2 topic
-
ros2 topic list
: 현재 개발환경에서 동작중인 모든 노드의 토픽 정보 확인 가능 -
ros2 topic info
: 토픽 메시지 형태, 토픽의 발행 및 구독 정보 확인 -
ros2 topic echo
: 특정 토픽의 메시지 내용을 실시간으로 출력 -
ros2 topic bw
: 메시지의 대역폭(송수신받는 토픽 메시지의 크기) 확인 -
ros2 topic hz
: 토픽의 주기 확인 -
ros2 topic delay
: 토픽의 지연시간 확인 -
ros2 topic pub
: 토픽 발행
ros2 bag
- rosbag : 토픽을 파일 형태로 저장/불러오는 ROS의 기능으로 디버깅시 유용
-
ros2 bag record
: rosbag 파일로 기록 -
ros2 bag info
: rosbag 파일의 정보를 확인 -
ros2 bag play
: rosbag 파일을 재생
ros2 interface
-
ros2 interface show
: 인터페이스 정보를 출력 -
ros2 interface list
: 인터페이스 목록을 출력 -
ros2 interface packages
-
ros2 interface package
-
ros2 interface proto
msg 인터페이스
서비스 (service)
- 노드의 역할
- Service Client : 서비스를 요청(Request) (동작 트리거)
- Service Server : 서비스를 응답(Response)
- 메시지 형태 : 서비스(*service*)
- 메시지 인터페이스 : srv 인터페이스
- 특징
- 일회성, 양방향, 동기성
- 1:1 통신
- 사용 예시
- LED제어, 모터 토크 On/Off, IK/FK 계산, 이동 경로 계산 등
CLI 명령어
ros2 service
-
ros2 service list
: 서비스 목록 출력 -
ros2 service type
: 서비스의 형태 확인 -
ros2 service find
: 특정 형태의 서비스를 사용하는 서비스명 찾기 -
ros2 service call
: 서비스 요청-
/clear
-
/kill
-
/reset
-
/set_pen
-
/spawn
-
ros2 interface
srv 인터페이스
ros2 interface show
명령어를 통해 서비스 인터페이스의 정보를 출력할 수 있다.
srv 인터페이스는 구분자로 나눠지는 다음의 구성 요소로 구성되어있음을 알 수 있다.
- 서비스 요청(Request) : e.g., float32 x, float32 y, float32 theta, string name
- 서비스 응답(Response) : e.g., string name
위 예시에서는 srv 인터페이스를 사용하여 service client와 service server가 각각 다음과 같이 서비스를 요청하고 서비스를 응답한다.
액션 (action)
-
노드의 역할
- Action Client : 액션 목표(goal)를 지정 (동작 트리거)
- Action Server : 액션 목표를 받아 특정 태스크를 수행 & 중간 결과값인 액션 피드백(feedback)과 최종 결과값인 액션 결과(result)를 전송
-
메시지 형태 : 액션 (*action*) : 토픽과 서비스의 혼합
- 액션 목표(action goal), 액션 결과(action result) : 서비스 (service) ⇒ 일회성·비동기
- 목표 전달(send_goal), 목표 취소(cancel_goal), 결과 받기(get_result)
- 액션 피드백(action feedback) : 토픽 (topic) ⇒ 연속성·동기
- 목표 상태(goal_state), 피드백(feedback)
- 액션 목표(action goal), 액션 결과(action result) : 서비스 (service) ⇒ 일회성·비동기
-
메시지 인터페이스 : action 인터페이스
-
특징
-
복합(토픽+서비스), 양방향, 동기+비동기
-
1:1 통신
-
동기·비동기 방식의 혼합을 원활하게 구현하기위해 상태머신(state machine)을 사용
-
-
사용 예시
- 목적지로 이동, 물건 파지, 복합 태스크 등
CLI 명령어
ros2 node
-
ros2 node info
: 노드의 정보를 출력
ros2 action
-
ros2 action list
: 액션 목록을 출력 -
ros2 action info
: 특정 액션의 정보를 출력 -
ros2 action send_goal
: 액션목표(action goal)를 전달※ 실시간으로 피드백을 표시하고싶다면
--feedback
옵션을 추가할 것 ※
ros2 interface
-
ros2 interface show
: 인터페이스 정보를 출력
action 인터페이스
ros2 interface show
명령어를 통해 액션 인터페이스의 정보를 출력할 수 있다.
action 인터페이스는 구분자로 나눠지는 다음의 구성 요소로 구성되어있음을 알 수 있다.
- 액션 목표(action goal) : e.g., float32 theta
- 액션 결과(action result) : e.g., float32 delta
- 액션 피드백(action feedback) : e.g., float32 remaining
파라미터 (parameter)
- 노드의 역할
- Parameter Client : 서버로부터 파라미터 정보를 가져오거나 서버의 파라미터 정보를 세팅
- Parameter Server : 클라이언트의 요청을 수행
- 특징
- 서비스의 목적은 서비스 요청과 응답이라는 RPC(Remote Procedure Call)인 반면 파라미터의 목적은 노드 내 매개변수를 서비스 데이터 통신 방법을 사용하여 쉽게 지정(set), 변경, 가져오는(get) 것이다.
CLI 명령어
ros2 param
-
ros2 param list
: 파라미터 목록을 출력 -
ros2 param describe
: 파라미터 내용 확인 -
ros2 param get
: 파라미터 읽기 -
ros2 param set
: 파라미터 쓰기 -
ros2 param dump
: 파라미터 저장아래와 같이 현재 폴더에 노드 이름으로 .yaml 파일 형태로 저장됨
’./turtlesim.yaml’ 파일의 내용을 확인하면 다음과 같이 파라미터의 현재 값이 저장되어 있음
이후 노드 실행시
--ros-args --params-file
옵션과 함께 적어주면 노드 실행시 초기 파라미터값을 지정해줄 수 있음 -
ros2 param delete
: 파라미터 삭제아래와 같이 삭제되었음을 확인할 수 있다.
References
- “008 ROS 2 노드와 데이터 통신,” 오로카, 2020년 09월 10일 수정, 2022년 01월 08일 접속, https://cafe.naver.com/openrt/24086.
- “009 ROS 2 토픽 (topic),” 오로카, 2020년 09월 04일 수정, 2022년 01월 08일 접속, https://cafe.naver.com/openrt/24101.
- “010 ROS 2 서비스 (service),” 오로카, 2021년 02월 08일 수정, 2022년 01월 08일 접속, https://cafe.naver.com/openrt/24128.
- “011 ROS 2 액션 (action),” 오로카, 2020년 09월 10일 수정, 2022년 01월 08일 접속, https://cafe.naver.com/openrt/24142.
- “012 ROS 2 토픽/서비스/액션 정리 및 비교,” 오로카, 2021년 03월 17일 수정, 2022년 01월 08일 접속, https://cafe.naver.com/openrt/24154.
- “013 ROS 2 파라미터 (parameter),” 오로카, 2020년 09월 11일 수정, 2022년 01월 08일 접속, https://cafe.naver.com/openrt/24165.