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๋ฒ ํฐ๋ฏธ๋
'๐ป 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 |