# โครงสร้าง 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 อย่างถูกต้อง เริ่มจากการทำความเข้าใจกับ องค์ประกอบหลัก ของระบบ ## ROS2 Workspace คืออะไร? ROS 2 Workspace คือพื้นที่ทำงานที่ใช้สำหรับพัฒนา Node และ Package ใน ROS2 โดยรองรับการคอมไพล์โค้ด, ติดตั้งแพ็กเกจ และจัดการโปรเจกต์ต่างๆ ```{image} images/c6/6.1.png :width: 80% :align: center ``` **โครงสร้างพื้นฐานของ ROS 2 Workspace** ```{code-block} bash my_ros2_ws/ # Workspace หลัก ├── src/ # โฟลเดอร์สำหรับเก็บแพ็กเกจที่พัฒนา │ ├── my_package/ # ตัวอย่างแพ็กเกจ │ ├── another_pkg/ # แพ็กเกจอื่นๆ ที่เพิ่มเข้ามา │ └── ... # อาจมีแพ็กเกจเพิ่มเติม ├── build/ # โฟลเดอร์ที่ใช้เก็บไฟล์คอมไพล์ ├── install/ # โฟลเดอร์ที่ใช้เก็บไฟล์ติดตั้ง └── log/ # โฟลเดอร์ที่ใช้เก็บ Log ของการทำงาน ``` ## ROS2 Package คืออะไร? Package ใน ROS 2 เป็นหน่วยเก็บข้อมูลหลักของโค้ดที่ใช้พัฒนาหุ่นยนต์ โดยแต่ละแพ็กเกจสามารถประกอบไปด้วย * ไฟล์ Node (Python หรือ C++) * ไฟล์ Message & Service * ไฟล์ Launch File * ไฟล์การตั้งค่า Parameter ```{image} images/c6/6.2.png :width: 80% :align: center ``` **โครงสร้างของ ROS 2 Package** ```{code-block} bash 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 # คำอธิบายแพ็กเกจ ``` ## Node คืออะไร Node เป็นหน่วยประมวลผลพื้นฐานใน ROS 2 โดยแต่ละ Node ทำงานอิสระและสามารถสื่อสารกันผ่าน Topic, Service หรือ Action โดยเขียนเป็นรูปแบบภาษา c++ หรือ python ```{image} images/c6/6.3.png :width: 80% :align: center ``` จากภาพแสดงให้เห็นว่า Node (พื้นที่แรเงา) เป็น ไฟล์โค้ดหรือคำสั่งที่ใช้ในการประมวลผล ซึ่งถูกพัฒนาในรูปแบบของภาษา Python หรือ C++ และทำงานภายใน Package ที่อยู่ใน Workspace ## Topic คืออะไร? Topic เป็นช่องทางที่ Node ใช้ในการแลกเปลี่ยนข้อมูลกันตามรูปแบบ Publisher-Subscriber Model โดยมี Node ที่ส่งข้อมูล (Publisher) และ Node ที่รับข้อมูล (Subscriber) ```{image} images/c6/6.4.png :width: 80% :align: center ``` ```{list-table} :widths: 25 25 :header-rows: 1 * - **หัวข้อ** - **หลักการทำงาน** * - Publisher - ส่งข้อมูลไปยัง Topic * - Topic - ทำหน้าที่เป็น ช่องทางกลางสำหรับรับและกระจายข้อมูล * - Subscribers - รับข้อมูลจาก Topic ``` ## Service คืออะไร? Service ใช้สำหรับการสื่อสารแบบ Client-Server ซึ่งต่างจาก Topic ที่ไม่มีการตอบกลับ ```{image} images/c6/6.5.png :width: 80% :align: center ``` ```{list-table} :widths: 25 25 :header-rows: 1 * - **หัวข้อ** - **หลักการทำงาน** * - Service Server - ทำหน้าที่ให้บริการ เมื่อได้รับคำขอจาก Client * - Service Client - ส่งคำขอไปยัง Server และรอรับผลลัพธ์ * - Service Request & Response - ใช้ส่งข้อมูลระหว่าง Client และ Server ``` ## Action คืออะไร? Action ใช้สำหรับงานที่ต้องใช้เวลานาน เช่น การนำทางหุ่นยนต์ โดยรองรับ Feedback ระหว่างทำงาน ```{image} images/c6/6.6.png :width: 80% :align: center ``` ```{list-table} :widths: 25 25 :header-rows: 1 * - **หัวข้อ** - **หลักการทำงาน** * - Action Client - ส่งคำขอ (Goal) ไปยัง Action Server * - Action Server - ดำเนินการตามคำขอและส่ง Feedback & Result กลับมา * - Feedback Topic - ใช้ส่งข้อมูลสถานะระหว่างทำงาน * - Goal Service, Result Service - ใช้สำหรับส่งคำสั่งและรับค่าผลลัพธ์ ``` ## Parameter คืออะไร? Parameter ใน ROS 2 คือ ค่าตั้งค่าของ Node ที่สามารถเปลี่ยนแปลงได้โดย ไม่ต้องแก้ไขโค้ด หรือ คอมไพล์ใหม่ ### ทำไมต้องใช้ Parameter? * ช่วย ตั้งค่าการทำงานของ Node ได้สะดวก * สามารถ เปลี่ยนค่าได้แบบเรียลไทม์ * ลดการแก้ไขโค้ด ทำให้โปรแกรมยืดหยุ่นมากขึ้น ### ตัวอย่าง การใช้คำสั่ง Parameter เปลี่ยน สีพื้นหลังของ Turtlesim โดยใช้ Parameter background_r, background_g, background_b ```{code-block} bash ros2 param set /turtlesim background_r 255 ros2 param set /turtlesim background_g 255 ros2 param set /turtlesim background_b 0 clear # ใช้ในการเคลียหน้าterminal ให้โล่ง ``` ## Launch File คืออะไร? Launch File เป็นไฟล์ที่ใช้ เปิดหลาย Node พร้อมกัน โดยไม่ต้องรันคำสั่งทีละตัวใน Terminal ### ทำไมต้องใช้ Launch File? * ลดความยุ่งยาก → สามารถเปิดหลาย Node พร้อมกันได้ * ตั้งค่าพารามิเตอร์ → กำหนดค่าของ Node ได้ง่ายขึ้น ### ตัวอย่าง Launch File (นามสกุล .launch.py เพิ่มเติมในบท 10) ```{code-block} python นำเข้าโมดูลที่ใช้สร้าง 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) ) ]) ```