6. โครงสร้าง ROS 2
ROS 2 (Robot Operating System 2) ถูกออกแบบให้มี โครงสร้างที่ยืดหยุ่น และรองรับ Multi-Robot System, Distributed Computing และ Real-time Processing ได้อย่างมีประสิทธิภาพ โดยมี องค์ประกอบหลัก ที่ทำงานร่วมกัน ได้แก่ Node, Topic, Service, Action, Parameter, Package, Launch File และ Workspace
ในบทนี้จะอธิบาย ความหมายและโครงสร้าง ของแต่ละองค์ประกอบ เพื่อให้เข้าใจการทำงานของ ROS 2 อย่างถูกต้อง เริ่มจากการทำความเข้าใจกับ องค์ประกอบหลัก ของระบบ
6.1. ROS2 Workspace คืออะไร?
ROS 2 Workspace คือพื้นที่ทำงานที่ใช้สำหรับพัฒนา Node และ Package ใน ROS2 โดยรองรับการคอมไพล์โค้ด, ติดตั้งแพ็กเกจ และจัดการโปรเจกต์ต่างๆ
โครงสร้างพื้นฐานของ ROS 2 Workspace
my_ros2_ws/ # Workspace หลัก
├── src/ # โฟลเดอร์สำหรับเก็บแพ็กเกจที่พัฒนา
│ ├── my_package/ # ตัวอย่างแพ็กเกจ
│ ├── another_pkg/ # แพ็กเกจอื่นๆ ที่เพิ่มเข้ามา
│ └── ... # อาจมีแพ็กเกจเพิ่มเติม
├── build/ # โฟลเดอร์ที่ใช้เก็บไฟล์คอมไพล์
├── install/ # โฟลเดอร์ที่ใช้เก็บไฟล์ติดตั้ง
└── log/ # โฟลเดอร์ที่ใช้เก็บ Log ของการทำงาน
6.2. ROS2 Package คืออะไร?
Package ใน ROS 2 เป็นหน่วยเก็บข้อมูลหลักของโค้ดที่ใช้พัฒนาหุ่นยนต์ โดยแต่ละแพ็กเกจสามารถประกอบไปด้วย
ไฟล์ Node (Python หรือ C++)
ไฟล์ Message & Service
ไฟล์ Launch File
ไฟล์การตั้งค่า Parameter
โครงสร้างของ ROS 2 Package
my_package/ # แพ็กเกจของ ROS2
├── package.xml # ไฟล์กำหนดข้อมูลแพ็กเกจ
├── CMakeLists.txt # ใช้สำหรับ C++ (หากเป็น Python ไม่ต้องใช้)
├── setup.py # ใช้สำหรับแพ็กเกจ Python
├── src/ # เก็บไฟล์โค้ดของ Node
│ ├── my_node.py # ตัวอย่างไฟล์ Node (Python)
│ ├── my_node.cpp # ตัวอย่างไฟล์ Node (C++)
├── launch/ # เก็บไฟล์ Launch ที่ใช้รันหลาย Node พร้อมกัน
│ ├── my_launch.py
├── config/ # เก็บไฟล์กำหนดค่า (Parameter)
│ ├── param.yaml
├── README.md # คำอธิบายแพ็กเกจ
6.3. Node คืออะไร
Node เป็นหน่วยประมวลผลพื้นฐานใน ROS 2 โดยแต่ละ Node ทำงานอิสระและสามารถสื่อสารกันผ่าน Topic, Service หรือ Action โดยเขียนเป็นรูปแบบภาษา c++ หรือ python
จากภาพแสดงให้เห็นว่า Node (พื้นที่แรเงา) เป็น ไฟล์โค้ดหรือคำสั่งที่ใช้ในการประมวลผล ซึ่งถูกพัฒนาในรูปแบบของภาษา Python หรือ C++ และทำงานภายใน Package ที่อยู่ใน Workspace
6.4. Topic คืออะไร?
Topic เป็นช่องทางที่ Node ใช้ในการแลกเปลี่ยนข้อมูลกันตามรูปแบบ Publisher-Subscriber Model โดยมี Node ที่ส่งข้อมูล (Publisher) และ Node ที่รับข้อมูล (Subscriber)
หัวข้อ |
หลักการทำงาน |
|---|---|
Publisher |
ส่งข้อมูลไปยัง Topic |
Topic |
ทำหน้าที่เป็น ช่องทางกลางสำหรับรับและกระจายข้อมูล |
Subscribers |
รับข้อมูลจาก Topic |
6.5. Service คืออะไร?
Service ใช้สำหรับการสื่อสารแบบ Client-Server ซึ่งต่างจาก Topic ที่ไม่มีการตอบกลับ
หัวข้อ |
หลักการทำงาน |
|---|---|
Service Server |
ทำหน้าที่ให้บริการ เมื่อได้รับคำขอจาก Client |
Service Client |
ส่งคำขอไปยัง Server และรอรับผลลัพธ์ |
Service Request & Response |
ใช้ส่งข้อมูลระหว่าง Client และ Server |
6.6. Action คืออะไร?
Action ใช้สำหรับงานที่ต้องใช้เวลานาน เช่น การนำทางหุ่นยนต์ โดยรองรับ Feedback ระหว่างทำงาน
หัวข้อ |
หลักการทำงาน |
|---|---|
Action Client |
ส่งคำขอ (Goal) ไปยัง Action Server |
Action Server |
ดำเนินการตามคำขอและส่ง Feedback & Result กลับมา |
Feedback Topic |
ใช้ส่งข้อมูลสถานะระหว่างทำงาน |
Goal Service, Result Service |
ใช้สำหรับส่งคำสั่งและรับค่าผลลัพธ์ |
6.7. Parameter คืออะไร?
Parameter ใน ROS 2 คือ ค่าตั้งค่าของ Node ที่สามารถเปลี่ยนแปลงได้โดย ไม่ต้องแก้ไขโค้ด หรือ คอมไพล์ใหม่
6.7.1. ทำไมต้องใช้ Parameter?
ช่วย ตั้งค่าการทำงานของ Node ได้สะดวก
สามารถ เปลี่ยนค่าได้แบบเรียลไทม์
ลดการแก้ไขโค้ด ทำให้โปรแกรมยืดหยุ่นมากขึ้น
6.7.2. ตัวอย่าง การใช้คำสั่ง Parameter
เปลี่ยน สีพื้นหลังของ Turtlesim โดยใช้ Parameter background_r, background_g, background_b
ros2 param set /turtlesim background_r 255
ros2 param set /turtlesim background_g 255
ros2 param set /turtlesim background_b 0
clear # ใช้ในการเคลียหน้าterminal ให้โล่ง
6.8. Launch File คืออะไร?
Launch File เป็นไฟล์ที่ใช้ เปิดหลาย Node พร้อมกัน โดยไม่ต้องรันคำสั่งทีละตัวใน Terminal
6.8.1. ทำไมต้องใช้ Launch File?
ลดความยุ่งยาก → สามารถเปิดหลาย Node พร้อมกันได้
ตั้งค่าพารามิเตอร์ → กำหนดค่าของ Node ได้ง่ายขึ้น
6.8.2. ตัวอย่าง Launch File (นามสกุล .launch.py เพิ่มเติมในบท 10)
นำเข้าโมดูลที่ใช้สร้าง Launch File ใน ROS2
import launch
import launch_ros.actions # ใช้สำหรับเรียกใช้งาน Node ของ ROS2
# ฟังก์ชันหลักที่ใช้สร้าง Launch Description
def generate_launch_description():
return launch.LaunchDescription([ # กำหนดรายการ Node ที่จะเปิด
# เปิด Node แรก: turtlesim_node
launch_ros.actions.Node(
package='turtlesim', # ระบุแพ็กเกจที่มี Node นี้
executable='turtlesim_node', # กำหนด Executable ที่จะรัน
name='simulated_turtle' # ตั้งชื่อให้ Node นี้ (Alias)
),
# เปิด Node ที่สอง: turtle_teleop_key (ใช้ควบคุมเต่าผ่านแป้นพิมพ์)
launch_ros.actions.Node(
package='turtlesim', # ระบุแพ็กเกจที่มี Node นี้
executable='turtle_teleop_key', # กำหนด Executable ที่จะรัน
name='teleop_turtle' # ตั้งชื่อให้ Node นี้ (Alias)
)
])