1 분 소요

ROS의 메시지 통신

  • 노드 : 최소 단위의 실행 가능한 프로세서
  • 패키지 : 하나 이상의 노드
  • 메타 패키지 : 패키지의 묶음

노드와 노드 사이에는 메시지를 주고 받는다. 메시지는 (int, float, bool, strint)과 같은 형태

  • 메시지 : 노드와 노드 사이에는 메시지를 주고 받는다. 메시지는 (int, float, bool, strint)과 같은 형태를 띄고 메시지를 주고 받는 방법에 따라 다음과 같이 구분된다.
    • 토픽
    • 서비스
    • 액션
    • 파라미터

DDS

기본적으로는 ROS1과 같게 퍼블리시, 서브스크라이브형으로 메시지를 전달한다.

실시간으로 데이터를 전송하고 보안이 ROS1에 비해 강화가 되었다.

ROS1과는 다르게 ROS MASTER가 없어도 DDS프로그램 간 동적 검색이 가능하여 통신할 수 있다.

매개변수를 설정하여 TCP처럼 신뢰도를 높이거나 UDP처럼 속도를 높여 사용할 수도 있다.

DDS란 ?

데이터 분산 시스템이라는 단어이고 데이터를 중심으로 연결성을 갖는 미들웨어의 프로토콜이다. UDP 기반의 방식으로 멀티캐스트, 브로드캐스트를 하는데 이 멀티캐스트의 방식 도입으로 ROS2에서는 전역 공간이라 불리는 DDS Global Space라는 공간에 있는 토픽들에 대해 구독 및 발행을 할 수 있다.

ROS에서의 사용



Publisher, Subscriber

$ ros2 run demo_nodes_cpp listener
$ ros2 run demo_nodes_cpp talker
$ rqt_graph

subscriber : listener node, publisher : talker node


RMW 변경 방법

용도에 맞게 RMW(ROS Middleware)를 변경할 수 있다. (서로 다른 RMW의 노드끼리도 통신이 가능하다.)

$ export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
$ ros2 run demo_nodes_cpp listener
$ export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
$ ros2 run demo_nodes_cpp talker

’ 변경됨 주의’

- rmw_connext_cpp

- rmw_cyclonedds_cpp

- rmw_fastrtps_cpp

- rmw_gurumdds_cpp

- rmw_opensplice_cpp


Domain 변경 방법

UDP 기반의 멀티캐스트 방식으로 통신이 이루어지기 때문에 같은 네트워크의 모든 노드가 연결이 된다. 이를 방지하기 위해 Domian을 변경한다. 환변수인 ROS_DOMAIN_ID를 맞춘 노드간에만 통신할 수 있다. 기본적으로 0~232의 정수를 사용

$ export ROS_DOMAIN_ID=11
$ ros2 run demo_nodes_cpp talker
$ export ROS_DOMAIN_ID=12
$ ros2 run demo_nodes_cpp listener //도메인이 다르므로 아무런 반응X


Reliability 설정

기본적으로 demo_nodes_cpp패키지의 listener노드는 RELIABLE로 설정이 돼있기 때문에


$ sudo tc qdisc add dev lo root netem loss 10%
$ sudo tc qdisc delete dev lo root netem loss 10% // 해제

다음과 같이 loss가 10프로 있어도 TCP처럼 loss가 생길 때마다 ack로 확인하여 재전송을 하게 되어 손실을 없앤다.

반면에 demo_nodes_cpp패키지의 listner_best_effort노드는 BEST_EFFORT로 설정이 돼있어 UDP와 같이 속도 중심이다. 즉, 손실이 있을 수 있다.

$ ros2 run demo_nodes_cpp listner_best_effort

댓글남기기