เขียน Node ภาษา Python แบบ OOP

การเขียนโปรแกรมเชิงวัตถุ OOP (Object Oriented Programming) เป็นวิธีการเขียนโปรแกรมที่นำแนวคิดในโลกของความเป็นจริงมาใช้กับในโลกของการเขียนโปรแกรมในการที่ โปรแกรมเมอร์ สร้างซอฟต์แวร์ขึ้นมาเพื่อแก้ไขปัญหาต่างๆ OOP เป็นวิธีการเขียนโปรแกรมรูปแบบหนึ่ง โดยมองสิ่งต่างๆในระบบเป็นวัตถุ (Object) ชิ้นหนึ่งที่มีหน้าที่และความหมายในตัว โดยวัตถุๆนั้น ก็มี คุณสมบัติ (Attributes) และ พฤติกรรม (Method,Behavior) หรือการกระทำของมัน เป็นการมองบนพื้นฐานความเป็นจริงมากขึ้น

คำศัพท์ที่จำเป็นต้องทราบสำหรับการเขียนโปรแกรมเชิงวัตถุในภาษา Python

  • คลาส คือประเภทข้อมูลที่สร้างโดยผู้ใช้ โดยจะนำไปใช้สร้างออบเจ็ค กล่าวอีกนัยหนึ่ง คลาสคือประเภทข้อมูลของออบเจ็ค
  • ออบเจ็ค คือสิ่งที่สร้างมาจากคลาสหรือ class instances
  • แอตทริบิวต์ (instance attributes) คือข้อมูลที่เป็นสมาชิกของแต่ละออบเจ็ค โดยมักจะกำหนดไว้ในเมธอด init() ของคลาส
  • เมธอด คือฟังก์ชันการทำงานที่กำหนดไว้ในคลาส
  • คลาสแอตทริบิวต์ (class attributes) คือตัวแปรที่ประกาศไว้ในคลาส ซึ่งจะแชร์กับออบเจ็คทั้งหมดที่สร้างจากคลาสนั้นๆ


1 : เขียน Node ภาษา Python เบื้องต้น


เขียน Node ภาษา Python เบื้องต้น ตามขั้นตอนลิงค์ด้านล่าง


2 : เขียน Node ภาษา Python แบบ OOP

ใช้ Visual Studio Code เปิดไฟล์ my_first_node.py เขียนโค้ด + Save ตามโค้ดด้านล่าง

 
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node

class MyNode(Node):

    def __init__(self):  
        super().__init__("py_test")
        self.get_logger().info("Hello ROS2")
  
def main(args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    rclpy.shutdown()
  
if __name__ == "__main__":
    main() 

เริ่มการทำงานโดย เปิด Terminator


เข้าไปใน โฟลเดอร์ ros2_ws

cd ros2_ws/

Build แพ็คเกจ my_py_pkg

colcon build --packages-select my_py_pkg


เรียกใช้งานด้วยคำสั่งของ ros2 จะได้ผลลัพธ์ การทำงาน เหมือนกับ การเขียน Node ภาษา Python เบื้องต้น

ros2 run my_py_pkg py_node


กด Ctrl + c เพื่อหยุดการทำงาน


3 : เพิ่ม ฟังก์ชั่น timer_callback


ใช้ Visual Studio Code เปิดไฟล์ my_first_node.py เขียนโค้ด + Save ตามโค้ดด้านล่าง

 
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node

class MyNode(Node):

    def __init__(self):  
        super().__init__("py_test")
        self.counter_ = 0
        self.get_logger().info("Hello ROS2")
        self.create_timer(0.5, self.timer_callback)

    def timer_callback(self):
        self.counter_ += 1
        self.get_logger().info("Hello" + str(self.counter_))
  
def main(args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    rclpy.shutdown()
  
if __name__ == "__main__":
    main() 


เปิด Terminator เข้าไปใน โฟลเดอร์ ros2_ws

cd ros2_ws/


Build แพ็คเกจ my_py_pkg

colcon build --packages-select my_py_pkg


เปิด Terminator หน้าต่างที่ 2



เรียกใช้งานด้วยคำสั่งของ ros2

ros2 run my_py_pkg py_node


จะได้ผลลัพธ์ การทำงานตามรูปด้านล่าง