이번 포스팅에서는 ROS2의 토픽, 서비스, 액션을 알아보고, 관련한 명령어들을 공부해보도록 하자.
💡 토픽
출처링크: https://cafe.naver.com/openrt/24101
위 그림처럼, 비동기식 단방향 메시지 송수신 방식을 토픽이라고 한다. msg 인터페이스 형태의 메시지를 퍼블리시 하는 퍼블리셔(publisher) 와 메시지를 서브스크라이브 하는 서브스크라이버(subscriber) 간의 통신이다.
노드들은 하나 이상의 토픽을 퍼블리시 할 수도 있고, 서브스크라이브 할 수도 있다.
$ ros2 topic list
// 현재 개발 중인 모든 노드들의 토픽 정보 확인
$ ros2 topic list -t
// 토픽들의 각 메시지 형태(type)도 같이 표기해줌
// 예를 들어서, [geometry_msgs/msg/Twist] 이런 식으로
토픽을 퍼블리시 하고, 서브스크라이브 하는 것은 다음과 같이 확인 가능하다.
$ rqt_graph

해당 이미지는 rqt_graph로 확인하여, Dead sinks와 Leaf topics를 해제하여 모든 토픽을 출력하게 만든 이미지이다.
$ ros2 topic info <topic_name>
// 토픽 메시지 형태, 퍼블리셔 및 서브스크라이 출력
$ ros2 topic echo <topic_name>
// 토픽 내용 출력
// 모든 메시지는 SI 단위계를 기준
$ ros2 topic bw <topic_name>
// 메시지의 대역폭, 즉 토픽 메시지의 크기를 알 수 있음
$ ros2 topic hz <topic_name>
$ ros2 topic delay <topic_name>
// latency(지연시간) 확인이 가능하다
$ ros2 topic pub <topic_name> <msg_type> "<args>"
// --once 옵션시 1번만 발행, topic_name 앞에 작성
$ ros2 topic pub --once ~
// --rate 옵션으로 주기를 Hz 단위로 지정 가능
$ ros2 topic pub --rate 1 ~
// 1Hz로 지정
💡 ros2 bag이란?
퍼블리시 되는 토픽을 파일 형태로 저장하고, 필요할 때 불러들여서 다시 재생할 수 있는 기능을 rosbag이라고 한다. 이는 복잡한 알고리즘을 검증할 때 유용하게 사용할 수 있다.
$ ros2 bag record <topic_name1> <topic_name2> ..
// 원하는 이름이 있을 경우 -o 옵션을 통해 지정 가능
$ ros2 bag info <bag_name>
bag 파일에 대한 타임 스탬프, 토픽 이름/메시지 형태/메시지 별 개수와 총 메시지 개수 등이 정보가 출력된다.
$ ros2 bag play <bag_name>
💡 서비스란?
출처링크: 상동
동기식 양방향 메시지 송수신 방식을 서비스(service)라고 하며, 서비스 요청(request)을 하는 서비스 클라이언트(service client), 서비스 요청을 받아 서비스를 수행한 후 응답(response)하는 서비스 서버(service server)가 있다. 토픽이 msg 인터페이스를 사용하는 것처럼 서비스도 srv 인터페이스를 사용한다.
동일한 서비스 서버에 대해 복수의 서비스 클라이언트가 가질 수 있도록 설계되었다.
$ ros2 service list
// -t 옵션시 서비스 인터페이스도 같이 출력
$ ros2 service type <service_name>
// 여기서 형태라함은 srv 인터페이스를 의미한다.
$ ros2 service find <service_interface>
// 해당 인터페이스를 사용하는 서비스 탐색이 가능하다
$ ros2 service call <service_name> <service_type> "<args>"
서비스 서버에게 서비스 요청을 줄 수 있는 명령어이다. 서비스명, 서비스 형태, 서비스 요청 내용을 기술하여 서비스 요청을 하면 된다.
💡 액션이란?
출처링크: https://cafe.naver.com/openrt/24142
액션(action)은 비동기식, 동기식 양방향 메시지 송수신 방식 으로, 액션 목표(goal)를 지정하는 액션 클라이언트(action client)와 액션 목표를 받아 특정 태스크를 수행하며 중간결과를 전송하는 액션 피드백(action feedback) 그리고 최종 결과를 담은 액션 결과(action result)을 전송하는 액션 서버(action server)의 조합으로 이루어져 있다. 마치 토픽과 서비스가 적절히 융합되어 있다고 볼 수 있는 메시지 통신이다. 액션은 action 인터페이스를 사용한다.
💡 ROS1과 ROS2의 액션의 차이
ROS1에서는 목표, 피드백, 결과를 토픽으로만 사용하였으나, ROS2에서는 목표 전달/목표 취소/결과 받기를 서비스 통신을 사용한다. 동기식 통신을 통해 원하는 타이밍에 적절한 액션을 수행하기 위해서이다. 목표 상태는 목표값을 전달한 후 상태 머신(state machine)을 구동하여 액션 프로세스를 추종하는 것이다.
$ ros2 action list -t
// 현재 실행 중인 액션 목록 확인
$ ros2 action info <action_name>
액션 이름과 액션 서버, 클라이언트 노드 이름 및 개수를 확인 가능하다.
$ ros2 action send_goal <action_name> <action_type> "<value>"
액션 이름, 형태, 목푯값을 전달하면 된다.
만약 피드백을 포함해서 화면에 출력하고 싶드면, 마지막에 --feedback 옵션을 추가해주면 된다.

출처링크:https://cafe.naver.com/openrt/24154
그리고 뒤에서 다룰 내용이지만,
이 3가지를 비교하면 다음과 같다.

출처링크: https://cafe.naver.com/openrt/24154
인터페이스에 대해서는 바로 다음 게시글에 다룰 것이다.