
สรุปแก่น ROS — Framework ในการพัฒนาหุ่นยนต์แบบกระชับ
ROS (Robot Operating System) เป็น Framework ที่นักพัฒนาหุ่นยนต์นิยมใช้กันมากที่สุดตัวหนึ่งในปัจจุบัน แต่ด้วยความที่ Ecosystem ของ ROS ค่อนข้างกว้าง เลยอาจทำให้ผู้เริ่มต้นใช้งานใหม่รู้สึกสับสนและมองภาพไม่ออกพอสมควร
บทความนี้เลยจะมาอธิบายแก่นของ ROS ให้เข้าใจแบบกระชับๆกันครับ เพื่อให้ทุกคนเข้าใจและเห็นภาพรวมของ ROS ได้มากขึ้น
หลักการทำงานของ ROS
ลักษณะของ Software ใน ROS จะมีความเป็น micro service มากๆ นั่นคือ เราจะทำการเขียนโปรแกรมในรูปแบบของ Node โปรแกรมเล็กๆ ทำหน้าที่เฉพาะอย่าง
ซึ่งเราจะนำ Node ที่เราเขียนขึ้นมา หรือ ที่มีให้อยู่แล้วมาเชื่อมต่อกันเป็นโครงข่ายเพื่อสร้างระบบการทำงานรวมของหุ่นยนต์ โดยแต่ละ Node จะทำงานขนานกันไปเลย เป็นคนละ process กัน
เหตุผลหลักที่ ROS มีลักษณะเป็น micro service แบบนี้ เนื่องจากถ้า Node ใดเกิดพังขึ้นมา ส่วนที่เหลือ ก็ยังสามารถทำงานกันได้อยู่ ทำให้หุ่นยนต์มีเสถียรภาพมากขึ้น อีกเหตุผล คือ ทำให้สามารถแชร์ code ให้คนอื่นใช้ได้ง่าย และสะดวกในการนำกลับมาใช้ใหม่
ภาษาที่ใช้ในการเขียน ROS มีอยู่ 2 ภาษา คือ C++ และ Python เราสามารถเลือกใช้ตามความถนัดเลย C++ จะได้เรื่องความเร็วในการทำงาน แต่แลกมาด้วย syntax ที่เขียนยากขึ้น
ปัจจุบัน ROS จะมีอยู่ 2 version คือ ROS1 และ ROS2 ในโพสนี้ถ้าพูดถึง ROS จะหมายถึง ROS2 ที่เป็นเวอร์ชั่นใหม่กว่า ใครที่กำลังเริ่มใช้งาน ROS แนะนำให้ใช้ ROS2 ไปเลย เนื่องจากเสถียรกว่า และมีมาตรฐานในการส่งข้อมูลที่ดีกว่า
ROS สามารถใช้ได้ทั้งใน Linux, Window และ Mac แต่ในทางปฏิบัติแล้ว การใช้งานใน Linux จะดีที่สุด โดยเฉพาะ Ubuntu
ต่อไป เรามาดู 4 องค์ประกอบสำคัญของ ROS กันครับ คือ Building blocks, Tools, Packages และ Community
Building blocks
Building blocks เป็นส่วนประกอบพื้นฐานในการเขียนโปรแกรมหุ่นยนต์ใน ROS ซึ่งจะมี API ในการพัฒนาหุ่นยนต์ให้ใช้มากมาย เช่น คำสั่งในการสร้าง Node, utility functions ที่ช่วยในการเขียนโปรแกรมหุ่นยนต์, driver ของ sensor/actuator รวมถึง communication mechanism ที่เป็นกลไกลในการส่งข้อมูล หรือที่เรียกว่า message ระหว่าง Node และตัว message พื้นฐานประเภทต่างๆ ที่มักจะใช้ในงานด้าน robotics
กลไกการรับส่งข้อมูลระหว่าง Node ใน ROS จะมีอยู่ 3 รูปแบบหลัก คือ
1. Topic
เป็นการรับส่งข้อมูลแบบ publisher / subscriber หลักการทำงานคือ เมื่อ Node ไหนส่งข้อมูลไปยัง Topic สมมุติว่าชื่อ TopicA, Node อื่นทั้งหมดที่เชื่อมต่อกับ TopicA จะได้รับข้อมูลนั้นทั้งหมด เป็นการส่งแบบกระจายข้อมูล
2. Service
เป็นการรับส่งข้อมูลแบบ client / server ซึ่งเป็น concept เดียวกับ web server เลย หลักการคือ Client Node จะส่งข้อมูล request message ไปให้ Service Server Node ทำงาน เมื่อทำงานเสร็จแล้ว Service Server Node จะส่ง response message ผลลัพธ์กลับมาให้ Client Node
3. Action
เป็นการรับส่งข้อมูลแบบ long running process ลักษณะจะคล้ายกับ Service มีการส่ง request ไป และได้รับ response ผลลัพธ์กลับมา แตกต่างกันที่ Action Server Node จะมีการส่ง feedback การทำงานกลับมาเป็นระยะๆ จนกว่าจะเสร็จงาน มักใช้ใน algorithm ที่ต้องใช้เวลานานในการทำงานกว่าจะเสร็จ เช่น การนำทางหุ่นยนต์ไปยังตำแหน่งปลายทาง ซึ่งกว่าหุ่นยนต์จะไปถึง เราจำเป็นต้องได้รับ feedback ของตำแหน่งหุ่นยนต์ปัจจุบันและรายงานสิ่งกีดขวางที่หุ่นยนต์เจออยู่ตลอด
Tools
นอกจาก Building blocks แล้ว ROS ยังมีเครื่องมือมากมาย ที่ช่วยระหว่างพัฒนาโปรแกรมหุ่นยนต์ด้วย ตัวอย่างเช่น
- RQT = เครื่องมือที่ช่วย debug การทำงานในระบบหุ่นยนต์เรา
- Rviz = เครื่องมือไว้แสดงข้อมูลสามมิติ ช่วยแสดงโลกภายในที่หุ่นยนต์รับรู้
- Gazebo = โปรแกรม Simulation สร้างโลกเสมือน เพื่อจำลองการทำงานของหุ่นยนต์และสภาพแวดล้อม พัฒนาโดยทีมงานของ ROS เอง
- Rosbag = เครื่องมือไว้บันทึกข้อมูลระหว่างการทำงานของหุ่นยนต์ ที่เราสามารถนำกลับมาย้อนดู หรือ รันเพื่อตรวจสอบการทำงานได้
Packages
ROS คือศูนย์รวม open-source algorithms, driver และ module ต่างๆของหุ่นยนต์ ที่เรียกว่า package เราสามารถเลือกใช้หรือนำมาปรับปรุงให้เข้ากับลักษณะงานของเราได้ โดยไม่ต้องเขียนโปรแกรมหุ่นยนต์ใหม่ทุกส่วนตั้งแต่แรก ช่วยให้เราลดเวลาในการพัฒนาหุ่นยนต์ได้เยอะ
Community
นอกจากส่วนของ software (Building blocks, Tools, Packages) ที่ได้อธิบายไปแล้ว ความเป็น ROS ยังครอบคลุมถึงชุมชนที่พัฒนาหุ่นยนต์ด้วย เราสามารถเข้าไปสอบถาม, พูดคุย และอัพเดทโปรเจคกับนักพัฒนาหุ่นยนต์ที่ใช้ ROS ทั่วทุกมุมโลก ทุกคนสามารถเข้าไปดูได้ในลิงค์ด้านล่างนี้นะครับ https://discourse.ros.org/