[ROS] Python์œผ๋กœ ๊ฐ„๋‹จํ•œ Publisher & Subscriber ๋งŒ๋“ค๊ธฐ

2022. 7. 4. 17:12ยท๐Ÿ’ป Language/ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ
728x90
728x90

ROS์—์„œ๋Š” Publisher์™€ Subscriber๊ฐ€ Topic์„ ์†ก์ˆ˜์‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค.

Publisher์™€ Subscriber๋ฅผ ๋งŒ๋“ค๊ณ  rosrun ๋ช…๋ น์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€ ์‚ดํŽด๋ณด์ž.

 

Package ์ƒ์„ฑ

๋จผ์ € ์‹ค์Šต์„ ์ง„ํ–‰ํ•  ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ practice_1์ด๋ฉฐ, C++/Python์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€์ด๋ฏ€๋กœ roscpp rospy ์˜ต์…˜์„, ํ‘œ์ค€ ๋ฉ”์‹œ์ง€ ํ˜•์‹์ธ std_msgs ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

$ cd ~/catkin_ws/src
$ catkin_create_pkg practice_1 roscpp rospy std_msgs

 

Publisher ์ƒ์„ฑ

Publisher๋Š” ROS์˜ Node๋กœ, ๋ฐœํ–‰์ž(์„œ๋ฒ„) ์—ญํ• ์„ ํ•˜๋Š” ๋…ธ๋“œ์ด๋‹ค.

$ roscd practice_1
$ mkdir scripts
$ cd scripts
$ touch publisher_py_node.py # ํŒŒ์ผ ์ƒ์„ฑ
$ chmod +x publisher_py_node.py # ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ (rosrun์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ)
$ gedit publisher_py_node.py # ํŒŒ์ผ ์ˆ˜์ • (gedit = ํŒŒ์ผ ํŽธ์ง‘๊ธฐ)

publisher_py_node.py ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

# publisher_py_node.py

#!/usr/bin/env python
# license removed for brevity
import rospy # rospy ๋ชจ๋“ˆ (ROS ๊ด€๋ จ)
from std_msgs.msg import Int32 # Message ๊ด€๋ จ

def talker(): # main์—์„œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜
	pub = rospy.Publisher('/helloros_topic', Int32, queue_size=10) # Publisher ์ƒ์„ฑ
	rospy.init_node('dyros_publisher_node', anonymous=True) # node ์ดˆ๊ธฐํ™”, anonymous๊ฐ€ True์ด๋ฉด node์˜ ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ๋œปํ•จ
	rate = rospy.Rate(1) # 1hz ๋ฐ˜๋ณต์„ ์œ„ํ•œ rate ์ƒ์„ฑ
	i = 1
	while not rospy.is_shutdown(): # ROS์˜ ์ข…๋ฃŒ signal์„ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต
		pub.publish(i) # ์ˆซ์ž i๋ฅผ publish
		i = i + 1
		rate.sleep() # ์ผ์ •ํ•œ ์ฃผ๊ธฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•˜์—ฌ ๋ชฉํ‘œ ์ฃผ๊ธฐ๋งŒํผ sleep

if __name__ == '__main__':
	try:
		talker() # 8 line์—์„œ ์ •์˜ํ•œ talker funtion ํ˜ธ์ถœ
	except rospy.ROSInterruptException: # ์ข…๋ฃŒ ์‹ ํ˜ธ ๋“ฑ ๋ฐœ์ƒ์‹œ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
		pass

 

 

Subscriber ์ƒ์„ฑ

Subscriber๋Š” ROS์˜ Node๋กœ, ๊ตฌ๋…์ž(ํด๋ผ์ด์–ธํŠธ) ์—ญํ• ์„ ํ•˜๋Š” ๋…ธ๋“œ์ด๋‹ค.

$ roscd practice_1/scripts
$ touch subscriber_py_node.py # ํŒŒ์ผ ์ƒ์„ฑ
$ chmod +x subscriber_py_node.py # ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ (rosrun์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ)
$ gedit subscriber_py_node.py # ํŒŒ์ผ ์ˆ˜์ • (gedit = ํŒŒ์ผ ํŽธ์ง‘๊ธฐ)

subscriber_py_node.py ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

# subscriber_py_node.py

#!/usr/bin/env python
import rospy # rospy ๋ชจ๋“ˆ (ROS ๊ด€๋ จ)
from std_msgs.msg import Int32 # Message ๊ด€๋ จ

def callback(data): # helloros_topic ์ˆ˜์‹ ์‹œ ํ˜ธ์ถœ๋˜๋Š” function
	rospy.loginfo("Hello ROS %d", data.data)

def listener(): # main์—์„œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜
	rospy.init_node('dyros_subscriber_node', anonymous=True) # node ์ดˆ๊ธฐํ™”, anonymous๊ฐ€ True์ด๋ฉด node์˜ ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ๋œปํ•จ
	rospy.Subscriber("/helloros_topic", Int32, callback) # Subscriber ์ƒ์„ฑ
	rospy.spin() # ROS์˜ ์ข…๋ฃŒ signal์„ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต

if __name__ == '__main__':
	listener() # 10 line์—์„œ ์ •์˜ํ•œ listener funtion ํ˜ธ์ถœ

 

 

Publisher & Subscriber ์‹คํ–‰

3๊ฐœ์˜ ํ„ฐ๋ฏธ๋„์—์„œ ๊ฐ๊ฐ ์•„๋ž˜์˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ƒ์„ฑํ•œ ๊ตฌ๋…์ž, ๋ฐœํ–‰์ž ๋…ธ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ๋‘ ๋…ธ๋“œ๊ฐ€ Topic์„ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.

$ roscore # 1๋ฒˆ ํ„ฐ๋ฏธ๋„
$ rosrun practice_1 subscriber_py_node.py # 2๋ฒˆ ํ„ฐ๋ฏธ๋„
$ rosrun practice_1 publisher_py_node.py # 3๋ฒˆ ํ„ฐ๋ฏธ๋„

๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ Topic์„ Publish, Subscribeํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ชจ์Šต

728x90
320x100
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ’ป Language > ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Ubuntu+ROS2] LG CLOiSim Simulator ์„ค์น˜ ๋ฐ ๊ตฌ๋™  (0) 2022.07.26
[ROS2] Ubuntu 20.04 Focal - ROS2 Foxy ์„ค์น˜ ๋ฐ ๊ตฌ๋™  (0) 2022.07.25
[ROS] Gazebo ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.  (0) 2022.07.08
[ROS] ๋กœ๋ด‡ ๋ชจ๋ธ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ XML, URDF์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.  (0) 2022.07.06
[ROS] ROS๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (Robotics)  (0) 2022.07.04
'๐Ÿ’ป Language/ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [ROS2] Ubuntu 20.04 Focal - ROS2 Foxy ์„ค์น˜ ๋ฐ ๊ตฌ๋™
  • [ROS] Gazebo ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.
  • [ROS] ๋กœ๋ด‡ ๋ชจ๋ธ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ XML, URDF์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.
  • [ROS] ROS๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (Robotics)
mxnxeonx
mxnxeonx
"์•„, ์ด๊ฑฐ ๋ญ์˜€๋”๋ผ"๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ์œ„ํ•œ ์ผ๊ธฐ์žฅ.
  • mxnxeonx
    MJ's Development Diary
    mxnxeonx
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (154)
      • ๐Ÿ’ป Language (43)
        • Java : ์ž๋ฐ” (18)
        • Python : ํŒŒ์ด์ฌ (9)
        • ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ (9)
        • Android : ์•ˆ๋“œ๋กœ์ด๋“œ (4)
        • JavaScript : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ (2)
      • ๐ŸŒ Environment (19)
        • IDE : ํ†ตํ•ฉ๊ฐœ๋ฐœํ™˜๊ฒฝ (9)
        • Virtual : ๊ฐ€์ƒํ™˜๊ฒฝ (10)
      • โš™ Framework (12)
        • Vue-๋ทฐ (3)
        • Spring-์Šคํ”„๋ง (7)
      • ๐Ÿ’พ DataBase (18)
      • ๐ŸŒŒ OS (36)
        • Linux-๋ฆฌ๋ˆ…์Šค (36)
      • ๐Ÿ’ฌ CI · CD (7)
        • Git : ๊นƒ (7)
      • ๐Ÿ“ƒ ETC (3)
      • ๐Ÿค– AI (4)
  • ๋งํฌ

    • GitHub
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
mxnxeonx
[ROS] Python์œผ๋กœ ๊ฐ„๋‹จํ•œ Publisher & Subscriber ๋งŒ๋“ค๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”