Robot Operating System (ROS) คืออะไร
ROS คืออะไร
Robot Operating System(ROS) เป็นระบบที่สร้างขึ้นเพื่อทำให้เกิดความยืดหยุ่นในการเขียนซอฟต์แวร์ควบคุมหุ่นยนต์ ซึ่งใน ROS จะรวบรวมชุดเครื่องมือและชุดคำสั่งต่างๆที่จำเป็นในการพัฒนาหุ่นยนต์เอาไว้ ซึ่งสิ่งต่างๆเหล่านี้จะลดความยุ่งยากในการสร้างในการพัฒนาหุ่นยนต์ที่มีความซับซ้อน และทำให้มีประสิทธิภาพในการพัฒนาหุ่นยนต์หลากหลายรูปแบบ
TALOS Schunk SVH Fanuc-Manipulator
เนื่องจากการสร้างซอฟต์แวร์หุ่นยนต์ให้มีความเป็นอเนกประสงค์ และมีประสิทธิภาพอย่างแท้จริงนั้นเป็นเรื่องที่ยาก ยกตัวอย่างเช่นเมื่อเราพัฒนาหุ่นยนต์ขึ้นมาตัวหนึ่ง เมื่อนำหุ่นยนต์ตัวนั้นไปใช้งานก็มักเกิดปัญหาต่างๆนาๆตามสภาพแวดล้อมหรือสถานที่ๆนำไปใช้งาน ซึ่งการจัดการกับปัญหาต่างๆเหล่านั้นเป็นเรื่องที่ยากหากต้องแก้ปัญหาทั้งหมดนั้นด้วยตัวคนเดียว
การพัฒนาหุ่นยนต์ในสมัยก่อนจะเป็นการพัฒนาแบบตัวใครตัวมัน ทำให้ความรู้หรือข้อมูลต่างๆถูกเก็บไว้ที่คนๆเดียวหรือเก็บเป็นความลับอยู่ในองค์กรนั้นๆ ซึ่งการพัฒนารูปแบบนี้ทำให้ยากต่อการพัฒนาหุ่นยนต์เพราะเนื่องจากผู้พัฒนาจำเป็นจะต้องพัฒนาหุ่นยนต์เองในทุกๆส่วนไม่ว่าจะเป็นระบบรับรู้ของหุ่นยนต์ ระบบขับเคลื่อนของหุ่นยนต์ รวมไปถึงกระบวนการทำงานต่างๆที่มีความซับซ้อน ส่งผลให้ ROS ถูกนำมาใช้งานเพื่อให้การพัฒนาหุ่นยนต์ที่มีความซับซ้อนเป็นไปได้อย่างรวดเร็ว ROS ถูกสร้างบนพื้นฐานของการสนับสนุนให้พัฒนาซอฟต์แวร์ของหุ่นยนต์ที่สามารถทำงานร่วมกันได้ ตัวอย่างเช่นห้องปฏิบัติการหนึ่งอาจมีผู้เชี่ยวชาญในการทำแผนที่สภาพแวดล้อมในร่ม และสามารถให้การสนับสนุนการสร้างแผนที่ให้กับองค์กรอื่นๆได้ บางกลุ่มอาจมีผู้เชี่ยวชาญในการใช้แผนที่เพื่อนำทาง บางกลุ่มอาจค้นพบวิธีการมองเห็นด้วยคอมพิวเตอร์ที่ทำงานได้ดีสำหรับการรับรู้วัตถุขนาดเล็กในพื้นที่ที่มีความยุ่งเหยิง ROS ได้รับการออกแบบมาเพื่อการทำงานร่วมกันและต่อยอดซึ่งกันและกันโดยเฉพาะ
ความเป็นมาของ ROS
ROS เป็นโครงการขนาดใหญ่ที่มีผู้ก่อตั้งและผู้มีส่วนร่วมมากมาย เนื่องจากเป็นระบบที่ต้องการพื้นฐานการทำงานร่วมกันแบบวงกว้าง จากหลากหลายผู้คนในสังคมของผู้วิจัยหุ่นยนต์ ที่ต้องการให้โครงการการพัฒนาหุ่นยนต์ต่างๆของตนเองบรรลุเป้าหมาย
ด้วยความพยายามอย่างมากของมหาวิทยาลัยสแตนฟอร์ดในช่วงกลางทศวรรษ 2000 ในการศึกษาเกี่ยวกับระบบ AI มาประยุกต์ใช้อย่างจริงจัง ไม่ว่าจะเป็นการตั้งหน่วยงานวิจัย STanford AI Robot (STAIR) และการพัฒนาโปรแกรมสำหรับหุ่นยนต์ Personal Robots (PR) เพื่อสร้างต้นแบบของระบบซอฟต์แวร์แบบไดนามิกที่ยืดหยุ่นสำหรับการพัฒนาหุ่นยนต์ ในปี ค. ศ. 2007 Willow Garage ศูนย์วิจัยหุ่นยนต์ที่มีวิสัยทัศน์กว้างไกล ได้จัดหาทรัพยากรที่สำคัญในการขยายแนวคิดเหล่านี้ให้ไปไกลกว่าเดิมและสร้างซอฟแวร์เพื่อการใช้งานที่ผ่านการทดสอบมาเป็นอย่างดี ทำให้ความพยายามดังกล่าวได้รับการสนับสนุนจากนักวิจัยนับไม่ถ้วนที่ทุ่มเทเวลาและความเชี่ยวชาญของพวกเขาให้กับทั้งแนวคิดหลักของ ROS และชุดซอฟต์แวร์พื้นฐาน ตลอดจนการพัฒนาซอฟต์แวร์ที่เป็นโอเพนซอร์สตั้งแต่ปี ค. ศ. 2013 และค่อยๆกลายเป็นแพลตฟอร์มที่ใช้กันอย่างแพร่หลายในชุมชนของผู้วิจัยหุ่นยนต์
ROS ได้รับการพัฒนาจากหลากหลายหน่วยงาน สำหรับการพัฒนาหุ่นยนต์หลากหลายรูปแบบ แม้ว่าข้อมูลทั้งหมดจะอยู่บนเซิร์ฟเวอร์เดียวกันเพื่อให้ผู้คนที่สนใจเข้าถึงได้ง่ายในช่วงหลายปีที่ผ่านมา แต่ไม่นานรูปแบบของการเก็บข้อมูลบนเซิฟเว่อแยกได้ถูกนำมาใช้เป็นจุดแข็งสำหรับกลุ่มคนที่ใช้ ROS โดยพวกเขาสามารถที่จะเป็นเก็บซอส์ซโค๊ด ของตัวเองบนเซิร์ฟเวอร์ของตัวเองได้ และยังรักษาความเป็นเจ้าของและการควบคุมการเข้าถึงซอส์ซโค๊ดได้เต็มรูปแบบ โดยไม่ต้องขออนุญาตจากใคร ถ้าหากพวกเขาต้องการเผยแพร่ข้อมูลเหล่านั้นต่อสาธารณะพวกเขาสามารถทำได้และเป็นที่ยอมรับในหมู่คนที่ใช้ ROS ด้วยกัน พวกเขาอาจได้รับค่าตอบแทนที่พวกเขาสมควรได้รับสำหรับความสำเร็จของพวกเขา และได้ประโยชน์จากข้อเสนอแนะทางเทคนิคเพื่อการปรับปรุงซอฟต์แวร์ของพวกเขาให้ดีขึ้น เช่นเดียวกับโครงการซอฟต์แวร์โอเพนซอร์สต่างๆ
ในขณะนี้ชุมชนของผู้ใช้ ROS ประกอบด้วยผู้ใช้นับหมื่นทั่วโลก ตั้งแต่โครงการงานอดิเรกเล็กๆ ไปจนถึงระบบอัตโนมัติอุตสาหกรรมขนาดใหญ่ ล้วนแล้วแต่ใช้ ROS ในการสร้างระบบของหุ่นยนต์
ROS Concept
ระบบ ROS จะแบ่ง Concept ของระบบออกเป็น 3 ส่วน คือ
1. ROS Computation Graph Level
คอนเซ็ปของระบบ ROS ก็คือการแบ่งโมดูลการทำงานของหุ่นยนต์ออกเป็นส่วนๆ แล้วให้แต่ละส่วนส่งข้อความคุยกันผ่านทาง Topic ต่างๆในรูปแบบของ Peer-to-Peer กับส่วนอื่นๆ โดยจะมี ROS Master เป็นตัวบริหารจัดการทำงานของระบบทั้งหมด ดังนั้นจะมีคำศัพท์ที่ควรจะรู้ไว้ก็คือ nodes, Master, Parameter Server, messages, services, topics, และ bags
- Node :เป็นกระบวนการที่ใช้ในการดำเนินการโปรแกรมต่าง ซึ่ง ROS ได้รับการออกแบบให้เป็นระบบแบบแยกส่วนในระดับที่ละเอียด ระบบควบคุมหุ่นยนต์มักจะประกอบด้วยหลายโหนด ตัวอย่างเช่นหนึ่งโหนดควบคุม laser range-finder, หนึ่งโหนดควบคุมมอเตอร์ล้อ, หนึ่งโหนดทำการแปลงค่าต่างๆ, หนึ่งโหนดทำการวางแผนเส้นทาง, หนึ่งโหนดให้มุมมองกราฟิกของระบบและอื่น ๆ โหนด ROS ถูกเขียนด้วยการใช้ไลบรารีของ ROS เช่น roscpp หรือ rospy
- Master : ROS Master จัดเตรียมการลงทะเบียนชื่อและค้นหาองค์ประกอบต่างๆใน ROS หากไม่มี Master โหนดจะไม่สามารถค้นหาซึ่งกันและกันเพื่อแลกเปลี่ยนข้อความหรือเรียกใช้บริการได้
- Parameter Server : พารามิเตอร์เซิร์ฟเวอร์จะอนุญาตให้จัดเก็บข้อมูลในตำแหน่งส่วนกลาง ซึ่งเป็นส่วนหนึ่งของ Master
- Message : โหนดสื่อสารกันโดยส่งข้อความ โดยอาจจะคุยในรูปแบบของข้อความ ค่ามาตรฐาน (จำนวนเต็ม, จุดลอย, บูลีน, ฯลฯ ) ข้อมูลอาร์เรย์ทั่วๆไป รวมไปถึงข้อมูลอาร์เรย์ที่มีความซับซ้อน
- Topics : ข้อความจะถูกส่งผ่านระบบการขนส่งที่มีการ publish / subscribe โหนดที่ส่งข้อความจะเรียกว่า publishing ชื่อที่ระบุใน Topic จะใช้เพื่อระบุเนื้อหาของข้อความ โหนดที่สนใจในข้อมูลบางประเภทจะทำการ subscribe หัวข้อที่ต้องการ อาจมีการ publish / subscribe หลายรายพร้อมกันสำหรับหัวข้อเดียวและโหนดเดียวอาจ publish / subscribe ได้หลาย Topics โดยทั่วไป publish / subscribe จะไม่ได้ตระหนักถึงการมีอยู่ของกันและกัน กล่าวอีกนัยคือการแยกกันผลิตข้อมูลตามหน้าที่ของตนเอง
- Services : รูปแบบการ publish / subscribe เป็นแนวคิดในการสื่อสารที่ยืดหยุ่นมาก แต่การขนส่งทางเดียวอย่างต่อเนื่องนั้นไม่เหมาะสม บางครั้งจึงมีการใช้บริการ Request / reply กำหนดการส่งข้อความ โดยสร้างข้อความหนึ่งสำหรับการร้องขอและอีกหนึ่งสำหรับการตอบกลับ เพื่อส่งข้อความที่ร้องขอไปยังโหนดที่ร้องขอ
- Bags : เป็นรูปแบบสำหรับการบันทึกและเล่นข้อมูล ข้อความใน ROS Bags เป็นกลไกสำคัญในการจัดเก็บข้อมูลเช่นข้อมูลเซ็นเซอร์ที่อาจรวบรวมได้ยาก แต่จำเป็นสำหรับการพัฒนาและทดสอบอัลกอริทึม
2. ROS Filesystem Level
ระบบจัดเก็บไฟล์เป็นคอนเซ็ปหลักอีกอย่างหนึ่งของระบบ ROS ซึ่งจะเป็นแหล่งทรัพยากรในการเรียกใช้งานของแต่ละโหนดแต่ละโมดูล โดยจะมีส่วนที่สำคัญดังต่อไปนี้
- Packages : เป็นโปรแกรมหลักที่ใช้ในการบริหาร บริการ จัดการซอฟต์แวร์ต่างๆใน ROS ซึ่งอาจจะประกอบไปด้วย ROS runtime processes (nodes), a ROS-dependent library, datasets, configuration files, และโปรแกรมอื่นๆที่จำเป็นสำหรับการจัดการและการใช้งาน สำหรับนักพัฒนาที่ออกแบบและสร้าง Packages เมื่อสร้างเสร็จแล้วก็สามารถปล่อย Packages นี้ให้แก่บุคคลที่สนใจอื่นๆได้
- Metapackages : เป็น Packages แบบพิเศษที่จะแสดงถึงความเกี่ยวข้องเชื่อมโยงกันกับ Packages อื่นๆที่เกี่ยวข้อง
- Package Manifests :เป็นตัวที่จะบอกว่า Package นี้ มีรายละเอียดยังไง ต้องการไปพึ่งพิง Code คนอื่นไหม
- Repositories : แหล่งรวบรวม Packages และ Tools ต่างๆเอาไว้ให้ผู้ที่สนใจได้ดาวน์โหลดมาทดลองใช้งาน
- Message (msg) types : คำอธิบายข้อความที่บรรจุอยู่ใน my_package/msg/MyMessageType.msg, เป็นการอธิบายรูปแบบโครงสร้างของข้อความที่ใช้สื่อสารกัน
- Service (srv) types : คำอธิบายการบริการที่บรรจุอยู่ใน my_package/srv/MyServiceType.srv, เป็นการอธิบายรูปแบบโครงสร้างในการร้องขอและการตอบรับข้อความใน ROS
ภาพองค์ประกอบโครงสร้าง(Layout) ของ Package ใน ROS ใน 1 Package จะมีโหนดการทำงานกี่โหนดก็ได้ขึ้นอยู่กับโปรแกรมที่เราเขียนลงไปโดยสำหรับ ROS จะรองรับอยู่ 2 ภาษาคือ C++ และ Python
ภาพองค์ประกอบโครงสร้าง(Layout) ของ Workspace ใน ROS ใน 1 Workspace จะมี package ก็ได้ขึ้นอยู่กับโปรแกรมที่เราเขียนลงไปโดยสำหรับ ROS แต่จะรองรับอยู่ 2 ภาษาคือ C++ และ Python
ภาพคอนเซ็ปของระบบ ROS File System level
3. ROS Community Level
ในส่วนคอนเซ็ปของระบบชุมชนผู้ใช้ ROS จะเป็นแหล่งที่ใช้ในการศึกษา แลกเปลี่ยนความรู้ ดาวน์โหลด packages ต่างๆมาใช้งาน อีกทั้งยังใช้เป็นแหล่งเผยแพร่ packages ที่เราออกแบบ
- Distributions : คือเวอชั่นต่างๆของ ROS ซึ่งโดยปกติแล้วเวอร์ชั่นของ ROS จะอ้างอิงจากเวอร์ชั่นของ Ubuntu Linux สรุปก็คือผู้ใช้งานจะต้องเลือก Distributions ของ ROS ให้ตรงกับเวอร์ชั่นของ Ubuntu Linux ตัวอย่างเช่น ถ้าหากเราใช้ Ubuntu 18.04 เราก็ต้องติดตั้ง ROS-Melodic
- Repositories : ROS อาศัยเครือข่ายชุมชนผู้ใช้ ROS เป็นเสมือนแหล่งเก็บข้อมูลหรือซอร์สโค๊ดต่างๆเอาไว้ ซึ่งจะเก็บไว้ตามที่ต่างๆไม่ว่าจะเป็นมหาวิทยาลัย องค์กรเอกชน ที่ซึ่งพวกเขาพัฒนาและเผยแพร่ซอฟต์แวร์หุ่นยนต์ของพวกเขา
- The ROS Wiki : แหล่งรวบรวมของมูลหลักพวก การประชาสัมพันธ์ต่างๆ เอกสารต่างๆ ที่เกี่ยวข้องกับ ROS ทุกคนสามารถเข้าร่วมและเผยแพร่เอกสารที่ตนเองสร้างขึ้นได้ไม่ว่าจะเป็นการอัพเดทต่างๆ การเขียนบทความเกี่ยวกับการสอนการใช้ ROS เป็นต้น
ทำไมต้องใช้ ROS
ลองจินตนาการสมมุติว่าถ้าหากต้องการสร้างหุ่นยนต์ที่มีรูปแบบการทำงานดังนี้
- มีกล้องเชื่อมต่ออยู่ที่หุ่นยนต์
- หุ่นยนต์อ่านค่าข้อมูลที่ส่งมาจากกล้องแล้วนำไปทำ Image Processing ง่ายๆ
- มีรีโมทแล็ปท็อปเชื่อมต่อระยะไกลเพื่อดูวีดีโอที่ส่งมาจากตัวหุ่นยนต์
จะเห็นว่าความต้องการหุ่นยนต์มีเพียงแค่ 3 ข้อ แต่ถ้าหากเรามาทำหุ่นยนต์จริงๆแล้วจะมีความซับซ้อนอย่างมากเช่น ถ้าหากเชื่อมต่อกล้องให้กับหุ่นยนต์แล้วจะอ่านค่าข้อมูลที่ส่งมายังไง แล้วถ้าหากได้ข้อมูลมาแล้วจะนำไปประมวลผลด้วยวิธีการใด สุดท้ายจะดูวีดีโอที่ส่งมาจากกล้องที่อยู่บนตัวหุ่นยนต์บนคอมพิวเตอร์เครื่องอื่นๆอย่างไร แน่นอนว่าถ้าหากเขียนโปรแกรมบนซอต์สโค๊ดเดียวจะต้องมีจำนวนบรรทัดมหาศาลแน่นอน
แต่ถ้าหากใช้ระบบ ROS มาจัดการระบบดังกล่าวจะสามารถอธิบายการทำงานได้ดังต่อไปนี้
- เริ่มต้นการทำงานของ ROS Master ซึ่งเป็นโหนดหลักในการลงทะเบียนของทุกโหนด
- เริ่มต้นการทำงานของ Camera Node , Image Processing Node , Image Display Node
- การวนลูปทำงานซ้ำไปซ้ำมา
– Camera Node อ่านค่ารูปภาพที่มาจากกล้องบนตัวหุ่นยนต์จากนั้น Publish ค่าข้อมูลนั้นใน Topic ที่มีชื่อว่า /image_data
– Image Processing Node และ Image Display Node ทำการ Subscribe ข้อมูลจาก Topic ที่มีชื่อว่า /image_data เพื่อนำค่าข้อมูลที่ส่งมาไปใช้งาน
จะเห็นว่าจากที่ต้องเขียนโค๊ดทั้งหมดอยู่บนหน้าๆเดียวเปลี่ยนมาเป็นเขียนแยกเป็นโหนดๆ แล้วให้แต่ละโหนดส่งข้อความถึงกัน ทำให้มีความยืดหยุดในการพัฒนาหุ่นยนต์มากขึ้น ถ้าหากเราเปลี่ยนกล้องแบบใหม่มาใส่แทนตัวเดิมก็แก้เพียงแค่ Camera Node เท่านั้น แล้วให้ Publish ค่าข้อมูลนั้นใน Topic ให้เหมือนเดิม
ว๊าว! หาอ่านมาตั้งนานพึ่งจะมาเข้าใจในบล็อคนี้นี่แหละ สุดยอดเลยครับ