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