[ROS2-002] 메시지 통신(message communication)

4 minutes to read



본 글은 오로카(오픈 로보틱스 커뮤니티)의 표윤석님께서 작성하신 로봇 운영체제 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)

img

  • 노드의 역할
    • Publisher : msg를 발간 (동작 트리거)
    • Subscriber : msg를 구독
  • 메시지 형태 : 메시지 (message)
  • 메시지 인터페이스 : msg 인터페이스
  • 특징
    • 연속성, 단방향, 비동기성
    • 1:1 (default), 1:N, N:1 N:N 통신 가능 + 셀프 구독도 가능!
    • ROS 메시지 통신에서 가장 널리 사용되는 통신 방법 (대략 70%를 차지)
  • 사용 예시
    • 센서 데이터, 로봇 상태, 로봇 좌표, 로봇 속도 명령 등


CLI 명령어

ros2 node

  • ros2 node info : 노드 정보 확인

    image-20220108164818176


ros2 topic

  • ros2 topic list : 현재 개발환경에서 동작중인 모든 노드의 토픽 정보 확인 가능

    image-20220108164913375

  • ros2 topic info : 토픽 메시지 형태, 토픽의 발행 및 구독 정보 확인

    image-20220108164932672

  • ros2 topic echo : 특정 토픽의 메시지 내용을 실시간으로 출력

    image-20220108165002143

  • ros2 topic bw : 메시지의 대역폭(송수신받는 토픽 메시지의 크기) 확인

    image-20220108165018275

  • ros2 topic hz : 토픽의 주기 확인

    image-20220108165044827

  • ros2 topic delay : 토픽의 지연시간 확인

    image-20220108165200344

  • ros2 topic pub : 토픽 발행

    image-20220108165343632


ros2 bag

  • rosbag : 토픽을 파일 형태로 저장/불러오는 ROS의 기능으로 디버깅시 유용
  • ros2 bag record : rosbag 파일로 기록

    image-20220108165539103

  • ros2 bag info : rosbag 파일의 정보를 확인

    image-20220108165710159

  • ros2 bag play : rosbag 파일을 재생

    image-20220108165745815


ros2 interface

  • ros2 interface show : 인터페이스 정보를 출력

    image-20220108170245213

  • ros2 interface list : 인터페이스 목록을 출력

    image-20220108170320690

  • ros2 interface packages

    image-20220108170342190

  • ros2 interface package

    image-20220108170402419

  • ros2 interface proto

    image-20220108170429071


msg 인터페이스

image-20220108170127476



서비스 (service)

img

  • 노드의 역할
    • Service Client : 서비스를 요청(Request) (동작 트리거)
    • Service Server : 서비스를 응답(Response)
  • 메시지 형태 : 서비스(*service*)
  • 메시지 인터페이스 : srv 인터페이스
  • 특징
    • 일회성, 양방향, 동기성
    • 1:1 통신
  • 사용 예시
    • LED제어, 모터 토크 On/Off, IK/FK 계산, 이동 경로 계산 등


CLI 명령어

ros2 service

  • ros2 service list : 서비스 목록 출력

    image-20220108170515864

  • ros2 service type : 서비스의 형태 확인

    image-20220108170555519

  • ros2 service find : 특정 형태의 서비스를 사용하는 서비스명 찾기

    image-20220108170631206

  • ros2 service call : 서비스 요청

    • /clear

      image-20220108170725671

    • /kill

      image-20220108170754584

    • /reset

      image-20220108170843846

    • /set_pen

      image-20220108170859188

    • /spawn

      image-20220108170914337


ros2 interface


srv 인터페이스

ros2 interface show 명령어를 통해 서비스 인터페이스의 정보를 출력할 수 있다.

image-20220108171014551

srv 인터페이스는 구분자로 나눠지는 다음의 구성 요소로 구성되어있음을 알 수 있다.

  • 서비스 요청(Request) : e.g., float32 x, float32 y, float32 theta, string name
  • 서비스 응답(Response) : e.g., string name

위 예시에서는 srv 인터페이스를 사용하여 service client와 service server가 각각 다음과 같이 서비스를 요청하고 서비스를 응답한다.

image-20220108171245503



액션 (action)

img

  • 노드의 역할

    • 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 인터페이스

  • 특징

    • 복합(토픽+서비스), 양방향, 동기+비동기

    • 1:1 통신

    • 동기·비동기 방식의 혼합을 원활하게 구현하기위해 상태머신(state machine)을 사용

      img

  • 사용 예시

    • 목적지로 이동, 물건 파지, 복합 태스크 등


CLI 명령어

ros2 node

  • ros2 node info : 노드의 정보를 출력

    image-20220108171501830


ros2 action

  • ros2 action list : 액션 목록을 출력

    image-20220108171543074

  • ros2 action info : 특정 액션의 정보를 출력

    image-20220108171610120

  • ros2 action send_goal : 액션목표(action goal)를 전달

    image-20220108171652141

    ※ 실시간으로 피드백을 표시하고싶다면 --feedback 옵션을 추가할 것 ※


ros2 interface

  • ros2 interface show : 인터페이스 정보를 출력

    image-20220108171744941


action 인터페이스

ros2 interface show 명령어를 통해 액션 인터페이스의 정보를 출력할 수 있다.

image-20220108171744941

action 인터페이스는 구분자로 나눠지는 다음의 구성 요소로 구성되어있음을 알 수 있다.

  • 액션 목표(action goal) : e.g., float32 theta
  • 액션 결과(action result) : e.g., float32 delta
  • 액션 피드백(action feedback) : e.g., float32 remaining


파라미터 (parameter)

img

  • 노드의 역할
    • Parameter Client : 서버로부터 파라미터 정보를 가져오거나 서버의 파라미터 정보를 세팅
    • Parameter Server : 클라이언트의 요청을 수행
  • 특징
    • 서비스의 목적은 서비스 요청과 응답이라는 RPC(Remote Procedure Call)인 반면 파라미터의 목적은 노드 내 매개변수를 서비스 데이터 통신 방법을 사용하여 쉽게 지정(set), 변경, 가져오는(get) 것이다.


CLI 명령어

ros2 param

  • ros2 param list : 파라미터 목록을 출력

    image-20220109011906048

  • ros2 param describe : 파라미터 내용 확인

    image-20220109011936507

  • ros2 param get : 파라미터 읽기

    image-20220109012007087

  • ros2 param set : 파라미터 쓰기

    image-20220109012037633

    image-20220109012050495

  • ros2 param dump : 파라미터 저장

    아래와 같이 현재 폴더에 노드 이름으로 .yaml 파일 형태로 저장됨

    image-20220109012132735

    ’./turtlesim.yaml’ 파일의 내용을 확인하면 다음과 같이 파라미터의 현재 값이 저장되어 있음

    image-20220109012309510

    이후 노드 실행시 --ros-args --params-file 옵션과 함께 적어주면 노드 실행시 초기 파라미터값을 지정해줄 수 있음

    image-20220109012356483

  • ros2 param delete : 파라미터 삭제

    image-20220109012424108

    아래와 같이 삭제되었음을 확인할 수 있다.

    image-20220109012438104



References