[ROS2] 메시지 통신
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
댓글남기기