ROS 노드 통신 프로그래밍

간단한 노드 통신 실습

  • 노드2개를 만들어 한쪽에서는 Topic을 발행하고 한쪽에서는 Topic을 받는 예제 코드를 구현

image

  • 디렉터리 구조

image

  1. $ catkin_create_pkg msg_send std_msgs rospy 를 입력하여 std_msgs, rospy를 의존하는 msg_send 패키지 만들기

  2. 패키지 안으로 이동해서 $ mkdir launch 를 입력하여 launch 디렉터리 만들기

  3. $ cm 으로 새로 만든 패키지 빌드

  4. 패키지의 src 디렉터리로 이동하여 teacher.py와 student.py 생성 (이전 포스트 참고)

  5. 패키지의 launch 디렉터리로 이동하여 아래 코드로 입력된 launch 파일 작성

  6. $ cm 를 입력하여 패키지를 빌드

  7. $ chmod +x teacher.py student.py를 입력하여 실행권한 부여

  8. $ roslaunch msg_send m_send.launch를 입력하여 launch 파일 실행

    <launch>
    	<node pkg="msg_send" type="teacher.py" name="teacher"/>
    	<node pkg="msg_send" type="student.py" name="student" output = "screen"/>
    </launch>
    

노드를 여러개 띄울 때

  • 하나의 코드로 여러 개의 노드를 연결하려면 각 노드의 이름을 달리해야 함

    • 노드의 init 함수에서 anonymous = True 값을 넣어주면 노드 이름이 자동을 달리 설정됨

    e.g. rospy.init_node(‘student’, anonymous = True)

  • Launch 파일을 이용해서 roslaunch 명령으로 여러 노드를 띄울 수 있음

    • 노드 설정에서 name = “” 부분을 다르게 설정

    e.g.

다양한 통신 시나리오

  • 1 : N, N :1, N: N 통신 방법이 있음

image

1 : N 통신
  • 기존 코드에서 string 대신 int32를 사용하려고 함

  • teacher_int.py

#!/usr/bin/env python

import rospy
from std_msgs.msg import Int32

rospy.init_node('teacher')

pub = rospy.Publisher('my_topic', Int32)

rate = rospy.Rate(2)
count = 1

while not rospy.is_shutdown():

    pub.publish(count)
	count = count + 1
    rate.sleep()
  • student_int.py
#!/usr/bin/env python

import rospy
from std_msgs.msg import Int32

def callback(msg):
    print msg.data
    
rospy.init_node('student')

sub = rospy.Subscriber('my_topic', Int32, callback)

rospy.spin()
  • m_send_1n.launch
<launch>
	<node pkg="msg_send" type="teacher.py" name="teacher"/>
	<node pkg="msg_send" type="student.py" name="student1" output = "screen"/>
	<node pkg="msg_send" type="student.py" name="student2" output = "screen"/>
	<node pkg="msg_send" type="student.py" name="student3" output = "screen"/>
</launch>
  • 실행결과

image

N : 1 통신
  • m_send_1n.launch
<launch>
	<node pkg="msg_send" type="teacher_int.py" name="teacher1"/>
	<node pkg="msg_send" type="teacher_int.py" name="teacher2"/>
	<node pkg="msg_send" type="teacher_int.py" name="teacher3"/>
	<node pkg="msg_send" type="student_int.py" name="student" output = "screen"/>
</launch>
  • 실행결과

image

N : N 통신
  • m_send_nn.launch
<launch>
	<node pkg="msg_send" type="teacher_int.py" name="teacher1"/>
	<node pkg="msg_send" type="teacher_int.py" name="teacher2"/>
	<node pkg="msg_send" type="teacher_int.py" name="teacher3"/>
	<node pkg="msg_send" type="student_int.py" name="student1" output = "screen"/>
	<node pkg="msg_send" type="student_int.py" name="student2" output = "screen"/>
	<node pkg="msg_send" type="student_int.py" name="student3" output = "screen"/>
</launch>
  • 실행결과

image