รูปปกบทความ

1. 🎯 ตอนที่ 3: เจาะลึกสถาปัตยกรรม ROS - เมื่อหุ่นยนต์ทำงานเป็นทีมเวิร์ก

สวัสดีครับน้องๆ นักพัฒนาหุ่นยนต์ทุกคน! ในตอนที่แล้วเราได้เห็นจุดเปลี่ยนผ่านระดับตำนานจาก ROS 1 สู่ ROS 2 กันไปแล้ว วันนี้พี่จะพามาเจาะลึกโครงสร้างระดับสถาปัตยกรรม (Architecture) ที่อยู่เบื้องหลังความสำเร็จของ ROS กันบ้าง

แม้ว่า ROS 2 จะเปลี่ยนระบบสื่อสารไปใช้ DDS แล้ว แต่รากฐานแนวคิดของการทำงานแบบ “กระจายศูนย์” (Distributed System) และการแยกโปรแกรมเป็นส่วนย่อยๆ ยังคงเป็นหัวใจสำคัญที่วิศวกรหุ่นยนต์ทุกคนต้องแม่นยำ วันนี้เราจะมาแหวกดูไส้ในกันว่า ระบบปฏิบัติการหุ่นยนต์เขามีวิธีจัดระเบียบโค้ดนับแสนบรรทัดไม่ให้ตีกันจนหุ่นยนต์ค้างได้อย่างไรครับ!

2. 📖 เปิดฉาก (The Hook)

น้องๆ เคยเขียนโค้ดควบคุมหุ่นยนต์ที่ทุกอย่างถูกยัดรวมกันอยู่ในไฟล์เดียว หรือใน while(true) ลูปยักษ์ๆ ลูปเดียวไหมครับ? อ่านค่ากล้อง… อ่านค่าเซ็นเซอร์ LIDAR… คำนวณสมการ… สั่งมอเตอร์หมุน… ถ้าเซ็นเซอร์ตัวใดตัวหนึ่งเกิดหน่วงหรือค้าง (Block) ขึ้นมา ผลคือ “หุ่นยนต์หยุดชะงักทั้งตัว” แล้วเดินชนกำแพงดังโครม!

นี่คือฝันร้ายของคนทำหุ่นยนต์เลยครับ เพราะหุ่นยนต์คือการรวมตัวกันของฮาร์ดแวร์หลายชิ้นที่ทำงานด้วยความเร็วไม่เท่ากัน ROS จึงถูกออกแบบมาเพื่อแก้ปัญหานี้โดยเฉพาะ ด้วยการจับโค้ดแยกชิ้นส่วนออกจากกัน ให้ทำงานขนานกันไปเลยบนสถาปัตยกรรมแบบ Distributed System (ระบบแบบกระจายศูนย์) นั่นเองครับ

3. 🧠 แก่นวิชา (Core Concepts)

โครงสร้างการทำงานหรือ “Computation Graph” ของ ROS ถูกออกแบบมาให้โปรแกรมแต่ละส่วนทำงานแยกกันอย่างอิสระ (Loosely coupled) แล้วค่อยส่งข้อมูลมาคุยกันผ่านระบบเครือข่าย โดยมีแก่นวิชาที่สำคัญดังนี้ครับ:

  • Node (ผู้ปฏิบัติงานระดับมดงาน): Node คือโปรแกรมย่อย (Process) ที่ถูกเขียนขึ้นมาเพื่อ “ทำหน้าที่เพียงอย่างเดียว” (Single-purpose) เช่น Node สำหรับอ่านค่ากล้อง, Node สำหรับควบคุมล้อ, Node สำหรับระบบนำทาง เปรียบเทียบง่ายๆ: Node เหมือนพนักงานในโรงงานที่ทำหน้าที่เฉพาะทางของตัวเอง การแบ่งเป็น Node ทำให้เราแยกเขียนโค้ดด้วยภาษาที่ต่างกันได้ (เช่น Node กล้องเขียนด้วย C++ เพื่อความเร็ว ส่วน Node ตัดสินใจเขียนด้วย Python เพื่อความง่ายของ AI) และถ้า Node ไหนพัง ก็ไม่พาให้ Node อื่นพังตามไปด้วย
  • ROS Master (ผู้จัดการและสมุดหน้าเหลือง - เฉพาะใน ROS 1): ใน ROS 1 การที่ Node นับสิบตัวจะคุยกันได้ พวกเขาต้องรู้ที่อยู่ (IP Address และ Port) ของกันและกันก่อน ROS Master จึงทำหน้าที่คล้ายกับ DNS Server หรือสมุดหน้าเหลือง เมื่อ Node เกิดใหม่ มันจะต้องวิ่งไปรายงานตัวที่ Master ก่อนว่า “ฉันชื่อนี้นะ ฉันมีข้อมูลกล้องมาส่ง” จากนั้น Master จะเป็นคนจับคู่ให้ Node ที่อยากได้ข้อมูลกล้องมาเจอกับ Node ที่ส่งข้อมูล เมื่อจับคู่เสร็จ ทั้งสอง Node จะคุยกันเองโดยตรงแบบ Peer-to-Peer โดยไม่ต้องผ่าน Master อีก
  • Parameter Server (คลังเก็บค่า Config กลาง): ในการเขียนโปรแกรม เรามักจะมีค่าคงที่ หรือ ค่า Configuration ต่างๆ เช่น พอร์ต USB ของเซ็นเซอร์ (/dev/ttyUSB0), ค่า Gain ของ PID Controller (P, I, D), หรือความเร็วสูงสุดของหุ่นยนต์ ROS มี Parameter Server ให้เราเก็บตัวแปรเหล่านี้ไว้ใน “พจนานุกรมส่วนกลาง” (Shared Dictionary) บนเครือข่าย ทำให้ Node ทุกตัวดึงค่าไปใช้ได้ และเราสามารถแก้ค่าเหล่านี้ได้โดยไม่ต้อง Re-compile โค้ดใหม่!
รูปประกอบ ROS Computation Graph

4. 💻 ร่ายมนต์โค้ดและคำสั่ง (Show me the Code)

เพื่อให้เห็นภาพการทำงาน พี่มีตัวอย่างคำสั่ง Terminal สำหรับจัดการ Nodes, Master และ Parameter Server มาฝากครับ (คำสั่งอ้างอิงจาก ROS 1 เพื่อให้เห็นภาพการทำงานของ Master)

# 1. ปลุกผู้จัดการให้ตื่นก่อน! คำสั่งนี้จะทำการรัน ROS Master และ Parameter Server
# ต้องรันคำสั่งนี้ทิ้งไว้ใน Terminal หนึ่งเสมอก่อนเริ่มทำงาน (เฉพาะ ROS 1)
roscore

# 2. ตรวจสอบดูว่าตอนนี้ในระบบมี "มดงาน" (Node) ตัวไหนกำลังทำงานอยู่บ้าง
rosnode list

# 3. แอบดูข้อมูลประจำตัวของ Node ที่ชื่อว่า /camera_node
# (จะบอกได้เลยว่า Node นี้กำลังส่งข้อมูลอะไร และรับข้อมูลอะไรอยู่)
rosnode info /camera_node

# 4. ขอดูรายการค่า Config ทั้งหมดที่เก็บอยู่ใน Parameter Server หน่อยซิ
rosparam list

# 5. ดึงค่าความเร็วสูงสุด (max_velocity) ที่หุ่นยนต์ตั้งไว้มาดู
# สมมติว่าดึงแล้วได้ค่า 1.5 กลับมา
rosparam get /robot_config/max_velocity

# 6. เราสามารถเปลี่ยนค่า Config ของหุ่นยนต์แบบ Real-time ได้ด้วยคำสั่งนี้!
# (เปลี่ยนค่า P-Gain ของ PID Controller เป็น 4.0 แบบไม่ต้องแก้โค้ด)
rosparam set /joint1_gains/p 4.0

# 7. เซฟค่า Config ทั้งหมดในระบบ เก็บลงเป็นไฟล์ YAML เพื่อเอาไว้ใช้คราวหลัง
rosparam dump my_robot_params.yaml

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

ถึงแม้ระบบนี้จะดูสมบูรณ์แบบ แต่ในฐานะวิศวกร เราต้องรู้ข้อจำกัดของเครื่องมือครับ:

  • จุดตายของ ROS 1: อย่างที่บอกไปว่า ROS Master คือผู้จัดการที่ทำหน้าที่จับคู่ Node ถ้าเกิดคอมพิวเตอร์ที่รัน roscore ดับ หรือ Network หลุด Node ใหม่จะไม่สามารถหากันเจอได้เลย (Single Point of Failure) นี่จึงเป็นสาเหตุสำคัญที่ ROS 2 ต้องเปลี่ยนไปใช้ระบบ DDS เพื่อตัด Master ทิ้ง และให้ Node ค้นหากันเองแบบกระจายศูนย์ 100% (Decentralized Discovery)
  • อย่าใช้ Parameter Server ผิดประเภท: Parameter Server ถูกออกแบบมาผ่านระบบ XMLRPC ซึ่งเหมาะกับข้อมูลที่ “ค่อนข้างคงที่” (Static) หรือนานๆ เปลี่ยนที เช่น ชื่อพอร์ต USB หรืองานตั้งค่าต่างๆ ห้าม นำ Parameter Server ไปใช้ส่งข้อมูลที่มีการเปลี่ยนแปลงความถี่สูงระดับ Real-time เด็ดขาด (เช่น ค่าจากเซ็นเซอร์ หรือ ตำแหน่งของหุ่นยนต์) ถ้าทำแบบนั้นระบบจะหน่วงและ Master จะ Overload ให้เปลี่ยนไปใช้การสื่อสารแบบ “Topic” แทนครับ

6. 🏁 บทสรุป (To be continued…)

การจับโปรแกรมแยกส่วนเป็น Node โดยมี Master คอยจับคู่ให้ และมี Parameter Server เป็นศูนย์กลางเก็บค่าการตั้งค่า คือรากฐานที่ทำให้ ROS กลายเป็นระบบที่ยืดหยุ่น โค้ดสามารถนำกลับมาใช้ซ้ำ (Reuse) ได้ง่าย และขยายสเกลการทำงานได้ในระดับอุตสาหกรรม

ตอนนี้น้องๆ คงเห็นภาพรวมแล้วว่า โครงสร้างของ ROS ถูกจัดระเบียบไว้อย่างไร แต่ความสนุกของจริงกำลังจะเริ่มขึ้นครับ! ในตอนต่อไป พี่จะพาไปดูวิธีการพูดคุยแลกเปลี่ยนข้อมูลกันระหว่าง Node ผ่านคลื่นวิทยุที่เรียกว่า “Topics” และการส่งข้อความแบบ “Publisher / Subscriber” เตรียมตัวเปิด Terminal แล้วมาลุยกันต่อครับ!


ต้องการที่ปรึกษาด้านการออกแบบสถาปัตยกรรมหุ่นยนต์ (Robotics) และระบบ Automation ให้กับองค์กรของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและพัฒนาซอฟต์แวร์แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p