14 ตุลาคม 2561

สร้าง Packages ของ ROS ด้วยภาษา Python



การสร้าง Package ด้วยภาษา Python



อ้างอิง : http://wiki.ros.org/rospy_tutorials/Tutorials/WritingPublisherSubscriber

เริ่มแรก เรามาออกแบบกันก่อน เรากำลังจะทำ Node 2 อัน ที่ทำหน้าที่พูดคนนึง และ รับฟังคนนึง

Package ชื่อ : beginner_tutorials

โดยใช้ Dependencies ดังนี้:

1. catkin (build system)
2. rospy (ROS ภาษา Python)
3. std_msgs (Package ข้อความพื้นฐานใน ROS)

อยากจะสร้าง Node ที่ทำหน้าที่เป็น
Publisher 1 Node ทำหน้าที่ส่งข้อความ
Subscriber 1 Node ทำหน้าที่รับข้อความแล้วหาคำตอบ — แล้วแสดง



สร้าง Package ของ ROS ขึ้นมา ซึ่ง Package จะต้องอยู่ใน src ของ Workspace

เปิด Terminal ของ Ubuntu

catkin_create_pkg ชื่อ วรรค ตามด้วย dependency หลายๆตัว ที่เว้นวรรค 1 ที

cd catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy

เราจะได้ โฟลเดอร์ ที่มีชื่อว่า beginner_tutorials ขึ้นมา พอเป็นเข้าไปด้านใน จะพบว่ามี โฟลเดอร์ และไฟล์มารอดังนี้


แล้วสร้างโฟลเดอร์ ที่มีชื่อว่า  scripts ให้อยู่ภายใต้ โฟลเดอร์ beginner_tutorials

mkdir catkin_ws/src/beginner_tutorials/scripts


เขียนโค้ดภาษา Python

เปิดโปรแกรม Geany IDE ด้วยคำสั่ง geany

geany


คลิกสร้างไฟล์ใหม่ Save เก็บไฟล์ไว้ที่ โฟลเดอร์ beginner_tutorials/scripts


1. สร้าง Node ตัวส่งข้อความ “Publisher”

ไฟล์ : talker.py

#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass


ต้องการให้เป็นไฟล์ที่ ROS  เรียกใช้งานได้ โดยคำสั่ง:

cd catkin_ws/src/beginner_tutorials/scripts
chmod u+x talker.py

2. สร้าง Node ตัวรับข้อความ “Subscriber”

ไฟล์ : listener.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

def listener():

    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('chatter', String, callback)

    rospy.spin()

if __name__ == '__main__':
    listener()


ต้องการให้เป็นไฟล์ที่ ROS  เรียกใช้งานได้ โดยคำสั่ง:

cd catkin_ws/src/beginner_tutorials/scripts
chmod u+x listener.py

ส่วนข้อมูลใน ไฟล์ CMakeLists.txt  ไม่ต้องแก้ไขอะไร

หลังจากเขียนโค้ดเสร็จแล้ว ให้ทำการ Build


cd catkin_ws
catkin_make

หน้าต่างที่1 เราจะ RUN ระบบ ROS จะต้องมี Core ที่ทำหน้าที่เป็นหัวใจของระบบ

roscore


หลังจากนั้นจึง Run Node ของเราได้

หน้าต่างที่ 2 เปิด Publisher (ตัวส่งข้อมูล)


rosrun beginner_tutorials talker.py


หน้าต่างที่ 3 เปิด Subscriber (ตัวฟัง/รับข้อมูล)
rosrun beginner_tutorials listener.py



หมายเหตุ : เรียบเรียงและแก้ไขดัดแปลงจากบทความต้นฉบับด้านล่าง