[ROS] Node 간의 메시지 통신

Sinaenjuni·2023년 3월 28일
0

ROS

목록 보기
3/12

통신 시나리오

ROS에서의 node는 메시지를 통한 데이터 통신이 가능한 최소 단위로 하나의 로봇 또는 센서와 같은 하드웨어 장치가 될 수 있다. 메시지를 기반으로 하는 통신 방법들과 유사한 장단점을 가지고 있다.
ROS의 메시지 통신 방법은 roscore가 브로커가 되어 시스템상에 등록된 모든 토픽과 실행중인 노드들의 정보를 알 고 있어 이들간의 통신이 이루어 질 수 있도록 도와주는 매개체 역할을 수행한다. 특히 노드들 간의 연결만 도와줄 뿐 실질적인 데이터 전송은 노드간에 이루어진다.
메시지를 기반으로 하는 통신 방법이기 때문에 1:1은 물론 1:N 그리고 N:N의 통신이 가능한 장점이 있다. 당연하게도 메시지를 기반으로 하기 때문에 구독전에 발행된 데이터의 유실 문제, 메시지 순서 동기화 등의 문제점 등이 있으며 이는 구현을 통해 어느정도 개선이 가능하다.

node 간의 데이터 통신

ROS의 node간의 통신은 다음과 같은 방법으로 이루어진다. pub.py의 경우 topic_name이라는 이름의 토픽을 발행시키는 노드를 정의하는 부분이고, sub.py의 경우 topic_name이라는 이름의 토픽을 구독하고 있다가 메시지가 발생하면 callback 함수를 통해 구독 중이던 토픽의 메시지를 가져온다.

# pub.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import String

ros.init_node("pub_node")
pub = rospy.Publisher("topic_name", String, queue_size=1)
pub.publish("pub data")
...
# sub.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import String

ros.init_node("sub_node")
def callback(msg):
	print(msg.data)
pub.subscribe("pub data", String, callback, queue_size=1)
...

같은 이름의 노드를 여러개 실행시키는 경우

$ rosrun package_name code1.py
$ rosrun package_name code2.py
$ rosrun package_name code3.py

ROS 시스템에서 실행중인 node의 이름은 중복될 수 없다. 위의 예시처럼 동일한 기능의 여러개의 node를 실행시키기 위해서는 파일의 여러개 만들어서 실행시켜야 한다.

첫 번째 방법

rospy.init_node('node_name', auonymous=True)

파이썬 코드를 통해 노드를 생성하는 경우 anonymous 매개변수를 True로 지정해주면 하나의 파일을 실행시키면 고유의 아이디를 붙여서 노드를 실행시킬 수 있다.

두 번째 방법

<lanuch>
	<node pkg="package_name" type="code1.py" name="node1"/>
	<node pkg="package_name" type="code1.py" name="node2"/>
	<node pkg="package_name" type="code1.py" name="node3"/>
</launch>

또, launch 파일에 매개변수 name을 바꾸는 방법으로도 같은 노드를 동시에 여러개 실행시킬 수 있다.

확인

rqt_graph를 통해 노드 간의 통신 상태를 확인할 수 있다.

0개의 댓글