รูปปกบทความ

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 นี้อย่างไร
รูปประกอบ ROS 2 Directory Structure

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 build

2. การสร้าง 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 rclpy

3. การสร้าง Package ภาษา C++ เบื้องต้น:

# ถ้าอยากเขียน C++ ก็ทำคล้ายกันครับ แค่เปลี่ยน build-type เป็น ament_cmake และใช้ rclcpp
ros2 pkg create my_cpp_pkg --build-type ament_cmake --dependencies rclcpp

4. การคอมไพล์และการนำไปใช้ (Build and Source):

# กลับมาที่โฟลเดอร์รากของ Workspace เสมอเวลาจะคอมไพล์
cd ~/ros2_ws

# สั่งคอมไพล์เฉพาะ Package ที่เราเพิ่งสร้าง (เพื่อความรวดเร็ว)
colcon build --packages-select my_py_pkg

# "การ Source" คือการประกาศให้ระบบปฏิบัติการ (Linux) รู้จักกับ Package ใหม่ของเรา 
# ถ้าไม่ทำขั้นตอนนี้ น้องจะใช้คำสั่ง ros2 run หา Package ของตัวเองไม่เจอครับ!
source install/setup.bash

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (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