๋ ธ๋๋ค๊ฐ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋๊ฒ์ด ROS ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฃผ๊ณ ๋ฐ๋์ง์ ๋ํด ์ด์ ์ฑํฐ์์ ๋ฐํ์( Publisher ) ์ ์์ ์ ( Subscriber ) ๋ผ๋๊ฒ์ ์ธ๊ธํ์ฌ ์๊ณ ์๋ค.
1. Publisher
publisher ๋ ๋ง ๊ทธ๋๋ก ๋ฐํํ๋ ์ญํ ์ ํ๋ค. ์ด๋ ์๊ณ ์์ด์ผ ํ ์ ์ Publisher ๊ฐ ๋ฐํํ๋ ๋ฉ์์ง๋ ์์ ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด Publisher ํผ์ ์๋ค๋ฉด ์๋ฌด๋ ๋ฃ๊ณ ์์ง ์์ง๋ง ํผ์ ๋ ๋ค๊ณ ์๋ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง๋๊ฒ์ด๋ค.
2. Subscriber
Publisher ์ ๋ฉ์์ง๋ฅผ ๋ค์ด์ฃผ๋๊ฒ์ด ๋ฐ๋ก Subscriber ์ด๋ค. Subscriber ๋ ๊ฐ์ ROS ๋คํธ์ํฌ ์์ ์กด์ฌํ๋ ํน์ *ํ ํฝ ๋ช ์ ๊ฐ์ง ๋ฉ์์ง๊ฐ ๋ฐํ๋๋๊ฒ์ ๋ณด๊ณ ์๊ณ Subscriber ๊ฐ ์ฃผ์ํ๊ณ ์๋ ๋ฉ์์ง๊ฐ ๋ฐํ๋ ๊ฒฝ์ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์์ ํ๋ค .
์ด๋ป๊ฒ ๋ง๋๋์ง ํ์ธํด๋ณด์.
3. Make Publisher and Subscriber
atkin_ws
โโโ build
โโโ devel
โโโ src
โโโ CMakeLists.txt
workspace ๋ ์์ ๊ฐ๋ค.
$ cd ~/catkin_ws/src/
$ roscreate-pkg pns_test
$ cd ../
$ catkin_make
Workspace/src ์์ pns_test ๋ผ๋ ํจํค์ง๋ฅผ ์์ฑํฉ๋๋ค.
3-1. Publisher
๊ฐ๋จํ Publisher ๋ฅผ ๋ง๋ค์ด ๋ณผ ์ ์๋ค. Publisher ํด๋์ค๋ rospy ์ ์ด๋ฏธ ์ ์๋์ด์๋ค.
from rospy import Publisher, Rate, init_node
Rate ํด๋์ค๋ ๋ ธ๋์ ์คํ ์ฃผ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ ์ํ ํด๋์ค์ด๊ณ , init_node ํจ์๋ rospy ์์ ๋ ธ๋๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
if __name__ == '__main__':
init_node("publisher_test")
publisher = Publisher()
์ฐ๋ฆฌ๋ ์ง๊ธ ๋น์ฅ์ ์ฐ์ std_msg ๋ฅผ ์ฌ์ฉํ์.
from std_msgs.msg import Int64
publsher = Publisher(name = "simple_pub", data_class=Int64, queue_size =1 )
์ด๊ฑธ๋ก publisher_test ๋ฅผ ๊ฐ์ง ๋ ธ๋์ ๊ทธ ๋ ธ๋์์ ๋ฐํํ๋ 64bit Int ์ queue size 1 ์ ๊ฐ์ง๋ simple_pub topic ์ publisher ๋ฅผ ์์ฑํ๊ฒ์ด๋ค.
ํด๋น ๋ ธ๋๊ฐ ๊ณ์ ํด์ ๋ฉ์์ง๋ฅผ ๋ฐํํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ค์ผ ํ๋ค.
import rospy
rospy.spin() ## ๋ฌดํ๋ฃจํ๋ผ๋ ๋ป.
$ roscore && rosrun pns_test app.py
## rosrun <pkg_name> <node_name>
Roscoe ๋ ROS Master Node ๋ก ํ๋ฒ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ์ Node ๋ฅผ ์คํ์ํค๋ ๋ช ๋ น์ด์.
๋
ธ๋๋ฅผ ํ์ธํ๊ธฐ ์ํด
rqt_graph
๋ฅผ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๋
ธ๋์ ํ ํฝ๊ฐ์ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ์๊ฐํํด์ ๋ณด์ฌ์ค๋ค.
๋ํ rostopic ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ROS ๋คํธ์ํฌ์์ ์กด์ฌํ๋ ๋ชจ๋ ๋ฉ์์ง ํ ํฝ์ ํ์ธํ ์์์.
$ rostopic list -v
Published topics:
* /rosout [rosgraph_msgs/Log] 1 publisher
* /simple_pub [std_msgs/Int64] 1 publisher
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
Subscribed topics:
* /rosout [rosgraph_msgs/Log] 1 subscriber
์ฑ๊ณต์ ์ผ๋ก, std_msgs.msg.Int64 ํ์ ์ผ๋ก, simple_pub์ด๋ผ๋ ํ ํฝ๋ช ์ Publisher๊ฐ ๋ฑ๋ก๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก, ์ ์ํ Publisher๋ฅผ ์ด์ฉํ์ฌ, ์ค์ ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ฐํํด๋ด ์๋ค. ๋ฉ์ธ์ง๋ Publisher ๊ฐ์ฒด์ publish ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ฐํํ ์ ์์ต๋๋ค.
random ํจ์๋ฅผ ์ด์ฉํ์ฌ, 0๋ถํฐ 255๊น์ง์ ๋๋คํ ๊ฐ์ 1์ด ์ฃผ๊ธฐ๋ก ๋ฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, ์๋์ ๊ฐ์ต๋๋ค.
#!/usr/bin/python
import rospy
from random import randint
from std_msgs.msg import Int64
if __name__ == '__main__':
rospy.init_node("publisher_test")
publisher = rospy.Publisher(
name="simple_pub", data_class=Int64, queue_size=1)
r = rospy.Rate(1)
while not rospy.is_shutdown():
msg = Int64()
msg.data = randint(0, 255)
rospy.loginfo(msg)
publisher.publish(msg)
r.sleep()
์์ ๊ฐ์ ๋ ธ๋์ ์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
$ rosrun pns_test app.py
[INFO] [1651948710.958126]: data: 186
[INFO] [1651948711.959265]: data: 174
[INFO] [1651948712.959405]: data: 8
[INFO] [1651948713.959293]: data: 106
[INFO] [1651948714.959313]: data: 56
[INFO] [1651948715.959301]: data: 188
[INFO] [1651948716.959352]: data: 167
[INFO] [1651948717.959304]: data: 27
[INFO] [1651948718.959255]: data: 139
[INFO] [1651948719.959348]: data: 11
[INFO] [1651948720.959383]: data: 46
[INFO] [1651948721.959318]: data: 71
[INFO] [1651948722.959257]: data: 87
...
๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฒฐ๊ณผ๋ฅผ rostopic์ ์ด์ฉํ์ฌ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
$ rostopic echo /simple_pub
data: 174
---
data: 8
---
data: 106
---
data: 56
---
data: 188
---
data: 167
---
data: 27
---
data: 139
---
data: 11
---
data: 46
---
data: 71
---
data: 87
---
...
์ ์์ ์ผ๋ก ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ Publisher๊ฐ ์์ฑ๋์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ๊น์ง์ ๊ฒฐ๊ณผ๋ฅผ rqt๋ก ํ์ธํด๋ณด๋ฉด, ์๋์ ๊ฐ์ต๋๋ค.
publisher_test๋ผ๋ ๋ ธ๋์์, simple_pub์ด๋ผ๋ ํ ํฝ์ด ๋ฐํ๋์ด, rostopic_... ๋ผ๋ ๋ ธ๋์์ ์ด๋ฅผ ๊ตฌ๋ ํ๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ rostopic_... ๋ ธ๋๋ rostopic echo์ ๋๋ค.
3-1. Subscriber
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ฑ๊ณตํ์๊ณ , ๋ค์์ผ๋ก ์ด๋ป๊ฒ ํ๋ฉด ๋ฐํ๋ ๋ฉ์ธ์ง๋ฅผ ๊ตฌ๋ ํ ์ ์๋์ง ์์๋ด ๋๋ค.
์ฐ์ , ๊ธฐ์กด์ ์์ฑํ ํ์ผ์ ์ด๋ฆ์ pub.py๋ก ๋ณ๊ฒฝํ๊ณ , ์๋ก sub.py ํ์ผ์ ์์ฑํด์ค๋๋ค.
/home/***/catkin_ws/src/pns_test/
โโโ CMakeLists.txt
โโโ Makefile
โโโ mainpage.dox
โโโ manifest.xml
โโโ src
โโโ pub.py
โโโ sub.py
sub.py ํ์ผ์๋ pub.py๊ณผ ๊ฐ์ ๋ผ๋๋ฅผ ๊ณต์ ํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ค๋๋ค.
#!/usr/bin/python
import rospy
from std_msgs.msg import Int64
if __name__ == '__main__':
rospy.init_node("sublisher_test")
r = rospy.Rate(1)
while not rospy.is_shutdown():
r.sleep()
์ดํ, ๋ฉ์ธ ํจ์์ Subscriber ๊ฐ์ฒด๋ฅผ ์ ์ธํด์ค๋๋ค.
subscriber = rospy.Subscriber()
Subscriber ํด๋์ค๋ ์์ฑ์๋ก ์๋์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ต๋๋ค.
name, data_class, callback, callback_args, queue_size, buff_size, tcp_nodelay
Publisher์ ์ ์ฌํ๊ฒ, name์ ๊ตฌ๋ ํ ํ ํฝ๋ช , data_class๋ ํด๋น ํ ํฝ์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , Publisher์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋ณด์ด๋ ๋ถ๋ถ์ ๋ฐ๋ก callback์ ๋๋ค. callback ๋ณ์๋, ํ ํฝ์ด ๋ฐํ๋๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ๋, ์๋ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ํจ์๋ฅผ ์ฝ๋ฐฑ ํจ์์ ํํ๋ก ์๊ตฌํฉ๋๋ค. ์ฝ๋ฐฑ ํจ์์ ๊ธฐ๋ณธ argument๋ ๊ตฌ๋ ํ ๋ฉ์ธ์ง ๊ฐ์ฒด์ ๋๋ค.
data = None
def callbackFunction(msg):
global data
data = msg
rospy.loginfo(data)
Subscriber ๊ฐ์ฒด๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ๊ณ ์คํ์ํจ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
subscriber = rospy.Subscriber(
name="simple_pub", data_class=Int64, callback=callbackFunction)
$ roscore && rosrun pns_test pub.py && rosrun pns_test sub.py
[INFO] [1651949917.660658]: data: 7
[INFO] [1651949918.663203]: data: 27
[INFO] [1651949919.663436]: data: 68
[INFO] [1651949920.658246]: data: 30
[INFO] [1651949921.658043]: data: 172
[INFO] [1651949922.658009]: data: 193
[INFO] [1651949923.658300]: data: 166
...
์ฑ๊ณต์ ์ผ๋ก Subscriber๊ฐ ๋์ํจ์ ํ์ธํ ์ ์์ต๋๋ค. ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก, ์ํ๋ callback ํจ์๋ฅผ ์ ์ํ์ฌ ๋ฐ์ดํฐ ํ์ฒ๋ฆฌ ๋ฑ์ ์งํํ ์ ์์ต๋๋ค.
4. ๋.
์์ ๊ฐ์ ๊ณผ์ ์ ํตํ์ฌ, python์ ์ด์ฉํ์ฌ, ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ Publisher์ Subscriber์ ์ ์, ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๊ณ , ๊ตฌ๋ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ์์๋ณด์์ต๋๋ค.
ROS๋ฅผ ์ด์ฉํ ๋ก๋ด ํ๋ก๊ทธ๋๋ฐ์ด๋ผ ํ๋ ๊ฒ์, ๊ฒฐ๊ตญ ์ด๋ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ๊ณ ๊ตฌ๋ ํ๋ ๋ ธ๋๋ฅผ ์ต์ ๋จ์๋ณ๋ก ๋๋ ์ ํ๋์ ๊ฑฐ๋ํ ํ๋ก๊ทธ๋จ์ ์ด๋ฃจ๋๋ก ์์ฑํ๋ ๊ฒ์ ๋๋ค.
[๋ฐ์ท]
https://h17.notion.site/ROS-2-Publisher-Subscriber-b99a13eb14d34dea8f25b604f541d540
'Develop > ROS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ค ROS Custom Message (0) | 2024.10.05 |
---|---|
๐ค ROS package ์์กด์ฑ ์ถ๊ฐ (0) | 2024.10.05 |
๐ฅ์์จ์ฃผํ์ ์ํ ROS ์ ๋ฌธ(3) : Transform, TF (1) | 2024.10.05 |
๐ฅ ์์จ์ฃผํ์ ์ํ ROS ์ ๋ฌธ(1) : ROS ๋ ? (1) (5) | 2024.10.05 |