노드 통신을 위한 패키지 만들기

노드간 통신 개요

  • 노드토픽을 주고 받는 주체
    • Publisher토픽을 발행
    • Subscriber토픽을 받음
  • 토픽→ 전달되는 메시지, 데이터 등등…

패키지 만들기

cd ~/xycar_ws/src

catkin_create_pkg msg_send std_msgs rospy

cd msg_send
mkdir launch

cm

토픽을 발행하고 구독하는 코드 작성

  • 토픽 이름 → my_topic
  • 위치 → ~/xycar_ws/src/msg_send/src
  • Publisher → teacher.py
#!/usr/bin/env python

import rospy
from std_msgs.msg import String
rospy.init_node('teacher')

pub = rospy.Publisher('my_topic', String)
rate = rospy.Rate(2)

while not rospy.is_shutdown():
	pub.publish('call me please')
	rate.sleep()
  • Subscriber → student.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(msg): 
	print msg.data

rospy.init_node('student')

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

rospy.spin()
  • launch 파일 → m_send.launch
#위치
~/xycar_ws/src/msg_send/launch

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

# 빌드
cm
  • launch 파일 실행
# 파일 권한 설정
chmod +x teacher.py student.py

# launch 파일 실행
roslaunch msg_send m_send.launch

1:N, N:1, N:N 통신

  • 이번에는 int32타입 메시지를 주고받는 코드
  • Publisher → 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()
  • Subscriber → 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()
  • launch 파일 → m_send_1n.launch
# launch파일에서 자동으로 여러 노드를 생성할 수 있다.
<launch>
	<node pkg="msg_send" type="teacher_int.py" name="teacher"/>
	<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>

나만의 메시지 만들기

  • string, int32등 자료형이 아닌 고유한 형식의 메시지를 보내 보자
  • Custom Message
# msg_send 패키지 폴더 아래 msg폴더를 만들자.
mkdir msg
cd msg

# my_msg.msg 파일을 작성
gedit my_msg.msg
====================
string first_name
string last_name
int32 age
int32 score
string phone_number
int32 id_number
===================
  • package.xml 수정
cd ~/xycar_ws/src/msg_send
gedit package.xml

# <export>위에 2줄 추가
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • CMakeLists.txt 수정
gedit CMakeLists.txt

=====================
find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
  # message_generation
)
#...
# #코멘트 지우고, my_msg.msg 추가
add_message_files(
   FILES
   # my_msg.msg
 )
#...
# #코멘트 지우기
generate_messages(
  DEPENDENCIES
  std_msgs
)
# ...
# CATKIN... 추가
catkin_package(
  CATKIN_DEPENDS message_runtime
#  INCLUDE_DIRS include
#  LIBRARIES msg_send
#  CATKIN_DEPENDS rospy std_msgs
#  DEPENDS system_lib
)
=====================
  • 빌드 및 확인
cm

rosmsg show my_msg
profile
올해로 26세

0개의 댓글