[ROS/Python] ๊ฐ๋จํ Publisher
์์ฃผ ๊ฐ๋จํ ros publisher๋ฅผ ๋ง๋ค์ด๋ณด์!
rospy ์ค๋ช
rospy๋ ๋ค๋ฅธ C++๋ก๋ ํจํค์ง์๋ ๋ฌ๋ฆฌ CMakeList.txt
๋ package.xml
์ ์์ฑํ์ง ์์๋ ์ด๋ ๊ฒฝ๋ก์์๋ ROS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ include ํ ์ ์๊ณ , ์ฌ์ฉํ ์ ์๋ค
์ฌ์ฉํ๊ธฐ ์ ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํด์ฃผ์
bashํ์ผ ์์
gedit์ผ๋ก bashํ์ผ์ ์คํํด์ค๋ค
$ gedit ~/.bashrc
์๋ ์ค์ ์ ๊ณ ์ ์ฅ ํ ์ฐฝ์ ๋ซ๋๋ค
source /opt/ros/melodic/setup.bash
์๋ ๋ช
๋ น์ด๋ก ์์ ๋ bashํ์ผ์ ์ ์ฉํด์ค๋ค
$ source ~/.bashrc
Simple ROS Publisher
1. ํด๋ ์์ฑ
ํ์ผ์ ๋ง๋ค ํด๋๋ฅผ ํ๋ ๋ง๋ค๊ณ ๊ทธ ๊ฒฝ๋ก๋ก ์ด๋ํ์
$ mkdir ~/rospy_tutorial
$ cd ~/rospy_tutorial
2. Publisher.py ํ์ผ ์์ฑ
publisher๋ฅผ ๋ง๋ค๊ธฐ ์ํ์ฌ ์๋์ ๊ฐ์ด ํ์ผ์ ๋ง๋ค์ด์ค๋ค
$ gedit pub.py
3. ์ ์ฒด์ ์ธ ์ฝ๋
์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ๋ณด๊ณ ํ๋ํ๋ ๋๋ ์ ๋ณด์
In pub.py
,
#! /usr/bin/env python
import rospy
from std_msgs.msg import String
rospy.init_node('topic_pub_node')
pub = rospy.Publisher('bigbigpark', String, queue_size=1)
msg = String()
r = rospy.Rate(1)
if __name__ == '__main__':
msg = 'Hi! My name is bigbigpark'
while not rospy.is_shutdown():
pub.publish(msg)
r.sleep()
์ฌ๊ธฐ๊น์ง๋ง ๋ณด๊ณ ๋ ์ฝ๋์ ๊ตฌ์กฐ๊ฐ ์ดํด๋๋ ์ฌ๋์ ๋ฐ๋ก 5๋ฒ์ผ๋ก ๋์ด๊ฐ์
4. ์ฝ๋ ๋๋ ์ ๋ณด๊ธฐ
์ ๋ฌธ์ฅ์ ์
๋ฑ
์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ์์ธํ ์ค๋ช
์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์
#! /usr/bin/env python
rospy
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์จ๋ค
std_msgs
๋ผ๋ ๋ฉ์ธ์ง ํจํค์ง์์ String
์ด๋ผ๋ ํค๋ ํ์ผ์ ๋ถ๋ฌ์จ๋ค
import rospy
from std_msgs.msg import String
rospy์ ๊ดํ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ ์ผ ๋จผ์ ์ํ๋์ด์ผํ๋ init_node
์ด๋ค
์ด๋ ๊ฒ ์ ์ธํ๋ฉด topic_pub_node
๋ผ๋ ์ด๋ฆ์ ๋
ธ๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป์ด๋ค
rospy.init_node('topic_pub_node')
Publisher๋ฅผ ์ ์ธํด์ค๋ค
์์ ๋ค์ด๊ฐ๋ ์ธ์๋ ์๋์ชฝ์ ๋์์๋ ์์๋๋ก ํ ํฝ๋ช
, ํ์
, ํ ์ฌ์ด์ฆ ์ด๋ค
๋ค์ ๋งํด์ bigbigpark
์ด๋ผ๋ ์ด๋ฆ์ String ํ์
์ ํ ํฝ์ publishํ๊ฒ ๋ค๋ ๊ฒ์ด๊ณ , ๊ทธ ๋ ํ ์ฌ์ด์ฆ๋ 1๋ก ํ๊ฒ ๋ค๋ ๋ป์ด๋ค
์ด ๊ธ์์๋ queue_size์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค๋ฃจ์ง ์๊ฒ ๋ค
pub = rospy.Publisher('bigbigpark', String, queue_size=1)
Publisher๋ฅผ ์ ์ธํ์ผ๋ฉด ๊ฑฐ๊ธฐ ์์ ๋ด์์ค ๋ฉ์ธ์ง๋ฅผ ์ ์ธํด์ค์ผ ํ๋ค
์ด๋ฒ ์์ ์์๋ String
๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋์ชฝ๊ณผ ๊ฐ์ด ์ ์ธํด์ค๋ค
์ฐธ๊ณ ๋ก String ๊ฐ์ฒด์ ์ด๋ค ์ ๋ณด๊ฐ ๋ด๊ฒจ ์๋๋๋ std_msgs/String Message ์ฌ๊ธฐ์๋ ํ์ธํ ์ ์๊ณ , ํฐ๋ฏธ๋ ์ฐฝ์์ rosmsg info std_msgs/String
์ผ๋ก๋ ํ์ธ ๊ฐ๋ฅํ๋ค
์ถ๊ฐ๋ก ๋ฉ์ธ์ง ๋ฐํ ์ฃผ๊ธฐ๋ฅผ ์ค์ ํ ์ ์๋๋ฐ 1 Hz
๋ก ์ค์ ํด์ค๋ค
msg = String()
r = rospy.Rate(1)
main๋ฌธ์ ๊ฐ๋จํ๊ฒ ์์ฑ์ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค
- msg์ ์์์ ๋ฌธ์์ด์ ์ ์ฅ
- msg๋ฅผ publish
- 1 Hz ๋ง๋ค ๋ฃจํ๊ฐ ๋์
rospy.is_shutdown()
์ ๋
ธ๋ ๋ด๋ถ์์ ์์ธ๊ฐ ๋ ์ ๋น์ ์์ ์ผ๋ก ์ข
๋ฃ๊ฐ ๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ Ctrl+C
๋ฅผ ๋๋ฌ์ ์ข
๋ฃํ ์ ์์์ ์๋ฏธํ๋ค
if __name__ == '__main__':
msg = 'Hi! My name is bigbigpark'
while not rospy.is_shutdown():
pub.publish(msg)
r.sleep()
5. ์คํํ๊ธฐ
ํ์ผ์ ์ ์ฅํ๊ณ ํฐ๋ฏธ๋ ์ฐฝ์์ ๋ค์๊ณผ ๊ฐ์ด ์คํํด๋ณด์
$ roscore
$ python pub.py
6. ๊ฒฐ๊ณผ
์๋ ๋ช
๋ น์ด๋ก ํ์ฌ ๋ฐํ์ค์ธ topic์ ๋ณผ ์ ์๋ค
$ rostopic list
์๋์ชฝ๊ณผ ๊ฐ์ด /bigbigpark
์ด๋ผ๋ ํ ํฝ๋ช
์ด ์ถ๋ ฅ๋๋ค
/bigbigpark
/rosout
/rosout_agg
echo
๋ช
๋ น์ด๋ก ๋ณผ ๋๋ ์ ๋จ์ ํ์ธํ ์ ์๋ค
$ rostopic echo /bigbigpark
Leave a comment