16 ตุลาคม 2561

สร้าง Packages ภาษา Python ให้กับ Raspberry Pi



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



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

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

Package ชื่อ : test_python

โดยใช้ 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 test_python std_msgs rospy

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


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

เปิด Terminal  ใหม่

mkdir catkin_ws/src/test_python/scripts



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


เปิดโปรแกรม IDLE (using Python-2.7)



คลิก New File เพื่อสร้างไฟล์ใหม่ เขียนโค้ดเสร็จแล้ว Save As.. เก็บไฟล์ไว้ที่ โฟลเดอร์ test_python/scripts




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

ไฟล์ : random_number.py

#!/usr/bin/env python
import rospy

from std_msgs.msg import Int32
from random import randint

def random_number_publisher():
    rospy.init_node('random_number')
    pub=rospy.Publisher('rand_no', Int32, queue_size=10)
    rate= rospy.Rate(2)

    while not rospy.is_shutdown():
        random_msg=randint(0,5000)
        rospy.loginfo(random_msg)
        pub.publish(random_msg)
        rate.sleep()

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


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

cd catkin_ws/src/test_python/scripts
chmod u+x random_number.py

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

ไฟล์ : random_subscriber.py

#!/usr/bin/env python

import rospy

from std_msgs.msg import Int32

def callback(data):
    rospy.loginfo("I receive %s", data.data)

def random_subscriber():
    rospy.init_node('random_subscriber')
    rospy.Subscriber('rand_no',Int32, callback)
    rospy.spin()

if __name__=='__main__':
    random_subscriber()


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

cd catkin_ws/src/test_python/scripts
chmod u+x random_subscriber.py

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

cd catkin_ws
catkin_make
ทดสอบการทำงาน

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


roscore


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


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


rosrun test_python random_number.py



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


กด Ctrl + C ถ้าต้องการหยุดการทำงาน

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