[2023-03-28] 2. ROS 노드 통신 프로그래밍
ROS 노드 통신 프로그래밍
간단한 노드 통신 실습
- 노드2개를 만들어 한쪽에서는 Topic을 발행하고 한쪽에서는 Topic을 받는 예제 코드를 구현
- 디렉터리 구조
-
$ catkin_create_pkg msg_send std_msgs rospy
를 입력하여 std_msgs, rospy를 의존하는 msg_send 패키지 만들기 -
패키지 안으로 이동해서
$ mkdir launch
를 입력하여 launch 디렉터리 만들기 -
$ cm
으로 새로 만든 패키지 빌드 -
패키지의 src 디렉터리로 이동하여 teacher.py와 student.py 생성 (이전 포스트 참고)
-
패키지의 launch 디렉터리로 이동하여 아래 코드로 입력된 launch 파일 작성
-
$ cm
를 입력하여 패키지를 빌드 -
$ chmod +x teacher.py student.py
를 입력하여 실행권한 부여 -
$ 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 통신 방법이 있음
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>
- 실행결과
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>
- 실행결과
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>
- 실행결과