รูปปกบทความ

1. 🎯 ตอนที่ 9: สร้างโลกจำลองด้วย Gazebo Simulator ซ้อมพังหุ่นยนต์ในโลกเสมือนก่อนเจ็บจริง

สวัสดีครับน้องๆ ว่าที่วิศวกรหุ่นยนต์ทุกคน! ในตอนที่แล้วเราได้ทำความรู้จักกับ RViz ที่เป็นเหมือน “ดวงตา” ให้เรามองเห็นข้อมูลของหุ่นยนต์กันไปแล้ว แต่วันนี้พี่จะพาขยับไปอีกขั้นด้วยการสร้าง “โลกทั้งใบ” ให้หุ่นยนต์ของเราได้ไปวิ่งเล่น!

น้องๆ พร้อมที่จะรู้จักกับ Gazebo Simulator เครื่องมือจำลองสถานการณ์ระดับเทพ ที่จะช่วยให้เราทดสอบโค้ดหุ่นยนต์สุดล้ำได้โดยไม่ต้องเสียเงินซื้อฮาร์ดแวร์แพงๆ หรือเสี่ยงทำมอเตอร์ไหม้กันหรือยังครับ? ถ้าพร้อมแล้ว เปิดหน้าจอ Terminal รอไว้เลย!

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

สมัยที่พี่เริ่มทำหุ่นยนต์ใหม่ๆ พี่เคยเขียนโค้ดอัลกอริทึมเดินหลบหลีกสิ่งกีดขวาง (Obstacle Avoidance) ด้วยความมั่นใจเต็มเปี่ยม พี่อัปโหลดโค้ดลงหุ่นยนต์ตัวจริงแล้วกดรันทันที… ผลปรากฏว่าหุ่นยนต์คำนวณระยะพลาด พุ่งชนกำแพงอย่างจังจนเซ็นเซอร์ LIDAR ราคาหลักหมื่นแตกกระจาย! วินาทีนั้นบอกเลยว่าใจสลายแถมโดนหัวหน้าด่าเละเทะครับ

ในโลกของหุ่นยนต์ การเอาโค้ดที่ยังไม่ผ่านการทดสอบไปรันบนฮาร์ดแวร์จริงคือความเสี่ยงระดับหายนะ! เพราะหุ่นยนต์มีน้ำหนัก มีความเร็ว และทำอันตรายต่อสิ่งรอบข้างได้ นี่คือเหตุผลที่วงการหุ่นยนต์ทั่วโลกต้องพึ่งพา Gazebo Simulator

Gazebo คือ “สนามเด็กเล่นเสมือนจริง” ที่เราสามารถเสกหุ่นยนต์ขึ้นมาทดสอบกี่ตัวก็ได้ จะสั่งให้มันวิ่งตกโต๊ะ ชนกำแพง หรือพังพินาศสักร้อยรอบก็ไม่มีใครว่าแถมไม่เสียเงินสักบาท! เมื่อเรามั่นใจว่าโค้ดทำงานได้สมบูรณ์ในโลกเสมือน เราค่อยนำโค้ดชุดเดียวกันนั้นไปรันบนหุ่นยนต์จริง นี่แหละครับคือวิถีของมือโปร!

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

หลายคนอาจจะยังสับสนระหว่าง RViz กับ Gazebo พี่ขออธิบายให้ชัดๆ อีกรอบ: RViz คือโปรแกรมแสดงผลข้อมูล (Visualizer) แต่ Gazebo คือโปรแกรมจำลองโลกทางกายภาพ (3D Simulator) ครับ โดย Gazebo มีหัวใจสำคัญอยู่ 3 ส่วนหลักๆ คือ:

  • Physics Engine (เครื่องยนต์ฟิสิกส์): Gazebo ขับเคลื่อนด้วยเอนจินจำลองฟิสิกส์ระดับเทพ (เช่น ODE - Open Dynamics Engine, Bullet หรือ DART) ที่คอยคำนวณแรงโน้มถ่วง (Gravity), มวล (Mass), แรงเฉื่อย (Inertia), แรงเสียดทาน (Friction) และการชนกันของวัตถุ (Collision) ทำให้พฤติกรรมของหุ่นยนต์ใน Gazebo สมจริงสุดๆ เช่น ถ้าล้อหุ่นยนต์เจอพื้นลื่น ล้อก็จะหมุนฟรี หรือถ้าน้ำหนักหุ่นยนต์ไม่สมดุล มันก็อาจจะล้มคว่ำได้!
  • Sensor & Actuator Plugins (ปลั๊กอินจำลองฮาร์ดแวร์): Gazebo สามารถจำลองเซ็นเซอร์ได้แทบทุกชนิดบนโลก ไม่ว่าจะเป็น กล้อง 3D, LIDAR, IMU, GPS หรือแม้แต่เซ็นเซอร์วัดแรงกระแทก โดยเราสามารถเติม “Noise” หรือความคลาดเคลื่อนเข้าไปในข้อมูลเซ็นเซอร์ได้ด้วย เพื่อให้เหมือนกับเซ็นเซอร์ราคาถูกในโลกจริง
  • ROS 2 Integration (การเชื่อมต่อโลกเสมือนเข้ากับ ROS 2): ต้องบอกก่อนว่า Gazebo นั้นเป็นโปรแกรมแยกอิสระ (Standalone) ไม่ได้ผูกติดกับ ROS 2 นะครับ! การที่มันจะคุยกับ ROS 2 ได้ เราต้องใช้สะพานเชื่อมที่เรียกว่า ros_gz_bridge (ในยุค ROS 2 สมัยใหม่) เพื่อแปลภาษาจาก Topic ของ Gazebo ให้กลายเป็น Topic ของ ROS 2 เช่น แปลงค่าพิกัดการหมุนล้อในโลกเสมือน ให้กลายเป็นข้อมูล /joint_states ส่งมาให้ ROS 2 ประมวลผลต่อ
รูปประกอบการทำงานร่วมกันระหว่าง ROS 2 และ Gazebo ผ่าน Bridge

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

เรามาลองร่ายมนต์เปิดโลก Gazebo และสร้างสะพานเชื่อมข้อมูลกับ ROS 2 เบื้องต้นกันครับ:

# 1. เปิด Gazebo ขึ้นมาพร้อมกับโหลดโลกว่างๆ (empty.sdf)
# (-r หมายถึงให้เวลาใน Simulator เริ่มเดินทันที ไม่ต้องรอให้เรากด Play)
ros2 launch ros_gz_sim gz_sim.launch.py gz_args:="empty.sdf -r"

# 2. ในอีก Terminal หนึ่ง เราจะสั่ง "เสก" หุ่นยนต์ (Spawn) ลงไปในโลกเสมือน
# โดยดึงโมเดล 3 มิติจาก Topic ชื่อ /robot_description ที่เราสร้างไว้ใน URDF
ros2 run ros_gz_sim create -topic robot_description

# 3. สร้างสะพานเชื่อม (Bridge) ระหว่าง Gazebo กับ ROS 2
# เช่น เชื่อม Topic สั่งการเคลื่อนที่ (/cmd_vel) เพื่อให้ ROS 2 สั่งล้อในโลกเสมือนให้หมุนได้
ros2 run ros_gz_bridge parameter_bridge /cmd_vel@geometry_msgs/msg/Twist]gz.msgs.Twist

คอมเมนต์: คำสั่ง parameter_bridge คือพระเอกของเราที่ทำหน้าที่เป็นล่ามแปลภาษา ระหว่าง Message ของ ROS 2 (เช่น geometry_msgs/msg/Twist) ไปเป็น Message ของฝั่ง Gazebo (gz.msgs.Twist) อย่างไร้รอยต่อครับ

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

ในฐานะที่พี่เขียน URDF แล้วโยนลง Gazebo จนหุ่นล้มมาแล้วหลายท่า นี่คือข้อควรระวังที่น้องๆ ต้องจำให้ขึ้นใจ:

  • หุ่นยนต์ทะลุพื้น! (Missing Collision Tags): ถ้าน้องโหลดโมเดล 3D URDF ลง Gazebo แล้วจู่ๆ หุ่นยนต์ก็ร่วงหล่นทะลุพื้นโลกไปในความว่างเปล่า… สาเหตุ 100% มาจากน้องลืมใส่แท็ก <collision> และ <inertial> ในไฟล์ URDF ครับ! Gazebo ต้องการข้อมูลมวลและขอบเขตการชนเพื่อคำนวณฟิสิกส์ ถ้าไม่มีสิ่งเหล่านี้ มันจะถือว่าหุ่นยนต์ของน้องเป็นวิญญาณที่ไม่มีตัวตน
  • เช็คชีพจรคอมพิวเตอร์ด้วย Real-Time Factor (RTF): ที่มุมขวาล่างของ Gazebo น้องจะเห็นค่า RTF (Real-Time Factor) ถ้าคอมพิวเตอร์ของน้องแรงพอ ค่านี้จะอยู่ใกล้เคียง 1.0 (หมายความว่าเวลาในเกม 1 วินาที เท่ากับเวลาในโลกจริง 1 วินาที) แต่ถ้าน้องใส่หุ่นยนต์เยอะเกินไป หรือเขียนโมเดลซับซ้อนจนคอมพิวเตอร์ประมวลผลไม่ทัน ค่า RTF อาจจะตกไปเหลือ 0.2 ซึ่งแปลว่าหุ่นในโลกเสมือนจะเดินช้าเป็นสโลว์โมชั่น (เหมือนหนังเดอะเมทริกซ์) ซึ่งจะส่งผลให้การคำนวณอัลกอริทึมพวก PID Controller ใน ROS 2 เพี้ยนไปหมดเลยครับ!

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

สรุปแล้ว Gazebo Simulator คือสนามทดสอบชั้นยอดที่ช่วยให้เราประหยัดเวลา ลดต้นทุน และป้องกันความเสียหายที่อาจเกิดขึ้นกับฮาร์ดแวร์จริง การเขียนโค้ดคุมหุ่นยนต์ยุคใหม่ เราจะยึดหลัก “เขียนครั้งเดียว รันได้ทั้งในโลกจำลองและโลกจริง”

ตอนนี้น้องๆ มีทั้ง RViz เอาไว้ดูข้อมูล และมี Gazebo เอาไว้จำลองฟิสิกส์แล้ว ในตอนต่อไป พี่จะพาน้องๆ นำอาวุธทั้งหมดที่เราเรียนมา ไปเจอกับโจทย์สุดคลาสสิกของวงการหุ่นยนต์ นั่นคือการทำ “SLAM (Simultaneous Localization and Mapping)” หรือการให้หุ่นยนต์วิ่งทำแผนที่ห้องด้วยตัวมันเอง! เตรียมตัวให้พร้อม ความสนุกของจริงกำลังจะเริ่มขึ้นแล้วครับ!


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