ตอนที่ 6: โครงสร้างไฟล์ระบบ (ROS File System) และ Workspaces

1. 🎯 ตอนที่ 6: จัดระเบียบโค้ดหุ่นยนต์ด้วย ROS File System และ Workspaces
สวัสดีครับน้องๆ นักพัฒนาหุ่นยนต์ทุกคน! หลังจากที่เราได้เรียนรู้กลไกการสื่อสารสุดเทพของ ROS 2 ทั้ง Topics, Services และ Actions กันไปแล้ว วันนี้พี่จะพามาดูเรื่องพื้นฐานที่เป็นเสมือน “กระดุมเม็ดแรก” ของการเขียนโปรแกรมหุ่นยนต์กันบ้างครับ
เคยไหมครับ… เวลาทำโปรเจกต์หุ่นยนต์แล้วเซฟไฟล์โค้ดกระจัดกระจายเต็มหน้า Desktop ไปหมด ไฟล์ไดรเวอร์กล้องอยู่โฟลเดอร์นึง ไฟล์ควบคุมมอเตอร์อยู่อีกโฟลเดอร์นึง พอจะรันทีก็หาไม่เจอ! ในโลกของ ROS 2 เรามีระบบระเบียบที่ชัดเจนมากในการจัดการไฟล์เหล่านี้ ซึ่งเราเรียกมันว่า Workspace และ Package วันนี้เราจะมาเจาะลึกโครงสร้างไฟล์เหล่านี้ และลงมือสร้าง Package แรกไปด้วยกันครับ!
2. 📖 เปิดฉาก (The Hook)
สมมติว่าน้องๆ กำลังสร้างหุ่นยนต์เคลื่อนที่อัตโนมัติ (Autonomous Mobile Robot) ซึ่งประกอบไปด้วยระบบย่อยเยอะมาก เช่น ระบบอ่านค่าเซ็นเซอร์ LIDAR, ระบบประมวลผลภาพจากกล้อง, ระบบคำนวณ Path Planning และระบบควบคุมล้อมอเตอร์
ถ้าน้องเอาโค้ดทั้งหมดนี้ยัดรวมไว้ในโฟลเดอร์เดียวกัน หรือแย่กว่านั้นคือเขียนทุกอย่างไว้ในไฟล์เดียว… วันที่น้องต้องอัปเดตโค้ด หรือต้องเอาโค้ดระบบกล้องไปใช้กับหุ่นยนต์ตัวอื่น น้องจะปวดหัวจนอยากลาออกจากการเป็นวิศวกรเลยล่ะครับ!
นี่คือเหตุผลที่ ROS 2 บังคับให้เราทำงานอยู่ภายใต้ Workspace (พื้นที่ทำงาน) และแบ่งโค้ดออกเป็นส่วนๆ ลงใน Package (กล่องฟังก์ชัน) เพื่อให้โค้ดของเราเป็นระเบียบ นำกลับมาใช้ใหม่ได้ง่าย (Reusability) และทำงานร่วมกับนักพัฒนาคนอื่นๆ ในทีมได้อย่างราบรื่นครับ
3. 🧠 แก่นวิชา (Core Concepts)
เรามาดูกันครับว่า โครงสร้างของระบบไฟล์ใน ROS 2 นั้นถูกออกแบบมาอย่างไร พี่ขอเปรียบเทียบง่ายๆ แบบนี้ครับ:
1. Workspace (โรงงานผลิตหุ่นยนต์):
Workspace คือโฟลเดอร์หลักที่ครอบคลุมทุกอย่างของโปรเจกต์เราไว้ ในยุค ROS 1 เรามักจะใช้ catkin_ws แต่ในยุค ROS 2 เราเปลี่ยนมาใช้ระบบบิลด์ที่ชื่อว่า Colcon เราจึงมักตั้งชื่อโฟลเดอร์ว่า ros2_ws (หรือ colcon_ws) โดยภายใน Workspace จะประกอบไปด้วย 4 โฟลเดอร์ศักดิ์สิทธิ์ ดังนี้ครับ:
src(Source Space): ห้องทำงานวิศวกร! นี่คือที่เดียวที่เราจะเอาไฟล์โค้ด (Source code) ของเราไปวางไว้build(Build Space): โรงงานประกอบชิ้นส่วน! เป็นที่เก็บไฟล์ชั่วคราวระหว่างที่ Colcon กำลังทำการคอมไพล์โค้ดinstall(Install Space): โชว์รูมพร้อมใช้งาน! หลังจากคอมไพล์เสร็จ ไฟล์ที่พร้อมรัน (Executables, Libraries, Launch files) จะถูกนำมาจัดแสดงไว้ที่นี่ (หมายเหตุ: ใน ROS 1 จะมีโฟลเดอร์ที่ชื่อว่าdevelไว้เก็บไฟล์ก่อนติดตั้ง แต่ใน ROS 2 ถูกแทนที่ด้วยinstallครับ)log(Log Space): ห้องเก็บกล้องวงจรปิด! เก็บไฟล์ Log บันทึกประวัติการคอมไพล์ เผื่อเวลาบิลด์พังเราจะได้มาตามสืบได้
2. Package (แผนกย่อยในโรงงาน): Package คือหน่วยย่อยที่สุดในการสร้างซอฟต์แวร์ของ ROS โค้ดของ Node ทุกตัวต้องอาศัยอยู่ภายใน Package เสมอ โดยแต่ละ Package จำเป็นต้องมี 2 ไฟล์สำคัญนี้เพื่อบอกให้ระบบรู้ว่ามันคือ Package:
package.xml: ใบปะหน้ากล่อง (Manifest) ที่บอกว่า Package นี้ชื่ออะไร ใครเป็นคนเขียน ใช้ License อะไร และที่สำคัญคือ “ต้องพึ่งพา Package อื่นๆ (Dependencies) อะไรบ้าง”CMakeLists.txt(สำหรับ C++) หรือsetup.py(สำหรับ Python): คู่มือการประกอบ! เป็นไฟล์ที่บอกระบบ Colcon ว่าจะต้องคอมไพล์โค้ดใน Package นี้อย่างไร

4. 💻 ร่ายมนต์โค้ดและคำสั่ง (Show me the Code)
ทฤษฎีแน่นแล้ว เรามาลงมือสร้าง Workspace และ Package ของจริงกันเลยครับ เปิด Terminal ขึ้นมาแล้วทำตามพี่ได้เลย!
1. การสร้างและคอมไพล์ Workspace:
# สร้างโฟลเดอร์ ros2_ws และสร้างโฟลเดอร์ src ซ้อนไว้ข้างใน (-p คือสร้างโฟลเดอร์ซ้อนกัน)
mkdir -p ~/ros2_ws/src
# เข้าไปที่โฟลเดอร์ราก (Root) ของ Workspace
cd ~/ros2_ws
# ร่ายมนต์ให้ Colcon สร้างโฟลเดอร์ build, install, log ให้เรา (ถึงจะยังไม่มีโค้ดก็รันได้!)
colcon build2. การสร้าง Package ภาษา Python เบื้องต้น:
# ก่อนสร้าง Package ต้องเข้าไปที่โฟลเดอร์ src ก่อนเสมอ!
cd ~/ros2_ws/src
# สร้าง Package ชื่อ my_py_pkg ด้วยภาษา Python และประกาศว่าเราต้องใช้ไลบรารี rclpy
ros2 pkg create my_py_pkg --build-type ament_python --dependencies rclpy3. การสร้าง Package ภาษา C++ เบื้องต้น:
# ถ้าอยากเขียน C++ ก็ทำคล้ายกันครับ แค่เปลี่ยน build-type เป็น ament_cmake และใช้ rclcpp
ros2 pkg create my_cpp_pkg --build-type ament_cmake --dependencies rclcpp4. การคอมไพล์และการนำไปใช้ (Build and Source):
# กลับมาที่โฟลเดอร์รากของ Workspace เสมอเวลาจะคอมไพล์
cd ~/ros2_ws
# สั่งคอมไพล์เฉพาะ Package ที่เราเพิ่งสร้าง (เพื่อความรวดเร็ว)
colcon build --packages-select my_py_pkg
# "การ Source" คือการประกาศให้ระบบปฏิบัติการ (Linux) รู้จักกับ Package ใหม่ของเรา
# ถ้าไม่ทำขั้นตอนนี้ น้องจะใช้คำสั่ง ros2 run หา Package ของตัวเองไม่เจอครับ!
source install/setup.bash5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ในฐานะที่พี่เห็นน้องๆ หลายคนตกม้าตายเรื่อง Workspace มาเยอะ นี่คือข้อควรระวังระดับ Pro-Tips ครับ:
- รัน
colcon buildผิดที่ ชีวิตเปลี่ยน! ห้าม รันคำสั่งcolcon buildในโฟลเดอร์srcหรือโฟลเดอร์ของ Package เด็ดขาด! น้องต้องถอยกลับมาที่ Root ของ Workspace (~/ros2_ws) ก่อนเสมอ ถ้าเผลอรันผิดที่ มันจะสร้างโฟลเดอร์build,install,logเลอะเทอะไปหมด วิธีแก้คือให้ลบ 3 โฟลเดอร์ที่ผิดที่นั้นทิ้งซะ แล้วกลับไปรันใหม่ให้ถูกที่ครับ - ไม่ต้อง Source ใหม่ทุกรอบด้วย
.bashrcการต้องมาพิมพ์source install/setup.bashทุกครั้งที่เปิด Terminal ใหม่มันน่าหงุดหงิดใช่ไหมครับ? น้องสามารถนำคำสั่งนี้ไปใส่ไว้ในไฟล์~/.bashrcเพื่อให้ Linux ทำการ Source ให้เราอัตโนมัติทุกครั้งที่เปิดหน้าต่างใหม่ได้เลยครับ (แต่ข้อควรระวังคือ ถ้าคอมไพล์ Node ตัวใหม่ครั้งแรก ก็ต้องเปิด Terminal ใหม่หรือ source มือไปก่อนหนึ่งรอบนะครับ) - สูตรลับ Python:
--symlink-installถ้าเราเขียน Node ด้วย Python ปกติแล้วเราไม่ต้องรอคอมไพล์โค้ดใช่ไหมครับ? แต่ถ้าใช้คำสั่งcolcon buildธรรมดา ระบบจะก๊อปปี้ไฟล์ Python ของเราไปไว้ในโฟลเดอร์installถ้าน้องแก้โค้ด น้องก็ต้องสั่งบิลด์ใหม่ทุกรอบ! พี่แนะนำให้ใช้คำสั่งนี้ครับ:colcon build --symlink-installคำสั่งนี้จะสร้างเป็น “Shortcut (Symlink)” ชี้จากโฟลเดอร์installกลับมาที่โค้ดในโฟลเดอร์srcของเรา คราวนี้พอน้องแก้โค้ด Python ปุ๊บ ก็สามารถรันโค้ดใหม่ได้ทันทีโดยไม่ต้องสั่งบิลด์ใหม่ ประหยัดเวลาไปได้เยอะเลยครับ!
6. 🏁 บทสรุป (To be continued…)
เห็นไหมครับว่า ROS 2 File System นั้นถูกออกแบบมาอย่างมีตรรกะ เพื่อให้เรารองรับสเกลโปรเจกต์ระดับอุตสาหกรรมได้ เมื่อเราเข้าใจความแตกต่างระหว่าง src, build, install และรู้วิธีจัดการกับ Package แล้ว การทำงานกับระบบซอฟต์แวร์หุ่นยนต์ที่ซับซ้อนก็จะไม่ใช่เรื่องยากอีกต่อไป!
ในตอนต่อไป เราจะนำความรู้เรื่อง Package นี้แหละครับ มาเริ่มเขียน Node แรกของเราด้วย Python กันแบบจริงๆ จังๆ เตรียมตัวเปิด Editor คู่ใจ (พี่แนะนำ VS Code) แล้วมาร่ายมนต์ปลุกหุ่นยนต์ให้ตื่นกันครับ!
ต้องการที่ปรึกษาด้านการออกแบบสถาปัตยกรรมหุ่นยนต์ (Robotics) และระบบ Automation ให้กับองค์กรของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและพัฒนาซอฟต์แวร์แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p