ตอนที่ 8: ทำความรู้จัก RViz ดวงตาที่สามของนักพัฒนาหุ่นยนต์

1. 🎯 ตอนที่ 8: ทำความรู้จัก RViz ดวงตาที่สามของนักพัฒนาหุ่นยนต์
สวัสดีครับน้องๆ วิศวกรหุ่นยนต์ทุกคน! กลับมาพบกันอีกแล้วนะครับ ในตอนที่ผ่านๆ มา เราได้เรียนรู้วิธีการส่งข้อมูลคุยกันระหว่าง Node ผ่าน Topic กันไปแล้ว แต่ปัญหาคือ ข้อมูลที่วิ่งอยู่ใน Topic ส่วนใหญ่มักจะเป็นตัวเลขมหาศาล (เช่น อาร์เรย์ของระยะห่างจากเลเซอร์ 720 ค่า) ถ้าน้องๆ นั่งมองตัวเลขพวกนี้ไหลผ่านหน้าจอ Terminal ไปเรื่อยๆ คงรู้สึกเหมือนกำลังนั่งดูโค้ดในหนังเรื่อง The Matrix แน่ๆ!
เพื่อไม่ให้เราต้องนั่งเพ่งตัวเลขจนปวดตา วันนี้พี่จะพาไปทำความรู้จักกับเครื่องมือสุดเทพที่เป็นเสมือน “ดวงตาที่สาม” ของนักพัฒนาหุ่นยนต์ นั่นก็คือ RViz ครับ เราจะมาดูกันว่ามันช่วยให้เรามองเห็นโลกผ่านมุมมองของหุ่นยนต์ได้อย่างไร!
2. 📖 เปิดฉาก (The Hook)
ลองจินตนาการดูว่า น้องๆ กำลังเขียนโค้ดให้หุ่นยนต์เดินหลบหลีกสิ่งกีดขวางในเขาวงกต หุ่นยนต์ของน้องมีเซ็นเซอร์ LIDAR คอยสแกนกำแพง และมีกล้อง 3 มิติ (Depth Camera) คอยมองหาวัตถุบนพื้น
พอกดรันโค้ดปุ๊บ… ปรากฏว่าหุ่นยนต์วิ่งชนกำแพงดังโครม! คำถามคือ “มันเกิดอะไรขึ้น?” เซ็นเซอร์พัง? หรืออัลกอริทึมเราคำนวณผิด? หรือหุ่นยนต์มันมองไม่เห็นกำแพงจริงๆ?
ถ้าไม่มีเครื่องมือช่วยมองภาพ เราจะไม่มีทางรู้เลยว่าหุ่นยนต์ “คิด” หรือ “เห็น” อะไรอยู่ นี่แหละครับคือจุดที่ RViz (ROS Visualization) เข้ามาเป็นฮีโร่กู้สถานการณ์ มันจะช่วยแปลงตัวเลขที่น่าปวดหัวเหล่านั้น ให้กลายเป็นภาพกราฟิก 3 มิติที่มนุษย์อย่างเราเข้าใจได้ทันที ช่วยให้การหาบั๊ก (Debugging) กลายเป็นเรื่องหมูๆ ไปเลยครับ!
3. 🧠 แก่นวิชา (Core Concepts)
ก่อนอื่นพี่ต้องขอเคลียร์ความเข้าใจผิดระดับชาติที่วิศวกรหน้าใหม่มักจะสับสนกันก่อนครับ ระหว่างคำว่า RViz กับ Simulator (เช่น Gazebo)
- RViz ไม่ใช่ Simulator! RViz (ย่อมาจาก ROS Visualization) คือเครื่องมือแสดงผล 3 มิติ (3D Visualizer) เท่านั้น หน้าที่ของมันคือการไป Subscribe หรือ “ดักฟัง” ข้อมูลที่กำลังวิ่งอยู่ใน Topic แล้วนำมาวาดเป็นกราฟิกบนหน้าจอ มันไม่มีระบบฟิสิกส์ ไม่มีแรงโน้มถ่วง และไม่มีการจำลองการชนใดๆ ทั้งสิ้น สิ่งที่น้องเห็นใน RViz คือสิ่งที่หุ่นยนต์ส่งมาบอกเรา (ไม่ว่าจะมาจากหุ่นยนต์จริง หรือหุ่นยนต์จำลองก็ตาม)
- Gazebo คือ Simulator ตัวจริง Gazebo คือโปรแกรมจำลองโลกเสมือนจริงที่มี “Physics Engine” (เช่น ODE, Bullet) อยู่เบื้องหลัง มันสามารถจำลองแรงโน้มถ่วง แรงเสียดทาน และการชนกันของวัตถุได้ โลกใน Gazebo คือโลกที่หุ่นยนต์ไปวิ่งเล่น แล้วเซ็นเซอร์ใน Gazebo ก็จะสร้างข้อมูล (Data) ส่งออกมาให้ ROS 2 รับไปประมวลผล
เปรียบเทียบง่ายๆ: Gazebo คือ “โลกจำลอง (The Matrix)” ที่สร้างข้อมูลขึ้นมา ส่วน RViz คือ “หน้าจอมอนิเตอร์” ที่คอยดึงข้อมูลจาก Matrix มาแสดงผลให้เราดูครับ
ใน RViz เราสามารถใช้ “Displays” (ปลั๊กอินแสดงผล) เพื่อดูข้อมูลได้หลากหลายรูปแบบมาก เช่น:
- RobotModel: ใช้ดูโมเดล 3 มิติของหุ่นยนต์ (โครงสร้าง แขน ขา ล้อ) โดยอ้างอิงจากไฟล์ URDF
- LaserScan: ใช้ดูข้อมูลจากเลเซอร์ 2 มิติ (LIDAR) ซึ่งจะวาดออกมาเป็นจุดหรือเส้นสีแดงๆ รอบตัวหุ่นยนต์
- PointCloud2: ใช้ดูข้อมูลความลึก 3 มิติ (Depth Data) จากกล้องอย่าง Kinect หรือ RealSense ซึ่งจะแสดงเป็นกลุ่มเมฆของจุดสี (Point Cloud) ที่มีทั้งระยะทางและสีสัน

4. 💻 ร่ายมนต์โค้ดและคำสั่ง (Show me the Code)
เรามาลองเปิด RViz2 แล้วเพิ่มจอแสดงผล (Displays) เข้าไปดูกันครับ
# 1. ร่ายมนต์เรียก RViz2 ขึ้นมา
ros2 run rviz2 rviz2เมื่อหน้าต่าง RViz เปิดขึ้นมา โลกตรงกลางจะยังว่างเปล่า (มืดดำ) เพราะเรายังไม่ได้บอกให้มันไปดักฟัง Topic อะไรเลย ให้น้องๆ ทำตามสเต็ปนี้ครับ:
- ตั้งค่า Fixed Frame: ที่พาเนลซ้ายมือ (Displays Panel) ตรงส่วน Global Options ให้เปลี่ยนค่า
Fixed Frameเป็นจุดอ้างอิงหลักของหุ่นยนต์ เช่นbase_linkหรือodom(ถ้าไม่ตั้งค่านี้ RViz จะพ่น Error สีแดงและไม่ยอมวาดอะไรเลย!) - เพิ่มโมเดลหุ่นยนต์ (RobotModel):
- กดปุ่ม
Addที่มุมซ้ายล่าง - เลือก
RobotModelแล้วกด OK - ปรับค่า Description Source เป็น
Topicและเลือก Description Topic เป็น/robot_description(RViz จะไปดึงไฟล์ URDF มาวาดเป็นหุ่น 3 มิติให้เราดูทันที)
- กดปุ่ม
- เพิ่มเส้นเลเซอร์ (LaserScan):
- กดปุ่ม
Add-> เลือกLaserScan - ในช่อง Topic ให้เลือกชื่อ Topic ของเลเซอร์ (เช่น
/scan) - (Tip: สามารถปรับขนาด Size(m) และเลือกสีแดง (Color Transformer: FlatColor) ให้มองเห็นชัดขึ้นได้)
- กดปุ่ม
- เพิ่มภาพจุด 3 มิติ (PointCloud2):
- กดปุ่ม
Add-> เลือกPointCloud2 - ในช่อง Topic ให้เลือก (เช่น
/camera/depth/points) - RViz จะวาดกลุ่มจุดนับหมื่นจุดขึ้นมาประกอบเป็นรูปร่างของวัตถุ 3 มิติตรงหน้าหุ่นยนต์ให้เราเห็น!
- กดปุ่ม
5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
- ปัญหาโลกแตก “Global Status: Error (Fixed Frame)”:
ถ้าน้องเปิด RViz มาแล้วเห็นข้อความแดงเถือก “Frame [map] does not exist” ไม่ต้องตกใจครับ! มันแปลว่า RViz พยายามจะวาดรูปโดยอ้างอิงจากจุดศูนย์กลาง (Origin) ที่ชื่อ
mapแต่หาไม่เจอ ให้เราคลิกที่ดรอปดาวน์ของ Fixed Frame แล้วเปลี่ยนเป็นเฟรมที่มีอยู่จริงในระบบ เช่นbase_link(ตัวหุ่นยนต์) หรือcamera_link(ตัวกล้อง) อาการแดงก็จะหายไปครับ - มองทะลุหุ่นยนต์ด้วย Alpha:
เวลาเราดูโมเดลหุ่นยนต์ทับกับเซ็นเซอร์ บางทีมันบังกันเอง ให้น้องๆ ไปที่เมนู RobotModel แล้วปรับค่า
Alpha(ความโปร่งใส) จาก1.0ให้เหลือสัก0.7หรือ0.8ครับ เราจะสามารถมองทะลุเกราะหุ่นยนต์เข้าไปเห็นแกน (TF) หรือจุดเลเซอร์ที่อยู่ข้างในได้อย่างชัดเจน - อย่าลืม Save Config! (Ctrl+S):
การมานั่งกด Add ทีละเซ็นเซอร์ทุกครั้งที่รัน RViz เป็นเรื่องที่น่าเบื่อมาก เมื่อน้องๆ จัดหน้าจอเรียบร้อยแล้ว ให้ไปที่เมนู File -> Save Config As… (หรือกด Ctrl+S) แล้วเซฟเป็นไฟล์
.rvizเก็บไว้ใน Package ของเรา ครั้งต่อไปเราสามารถสั่งโหลดไฟล์นี้ผ่าน Launch file ได้เลยโดยไม่ต้องมานั่งจัดหน้าจอใหม่ครับ!
6. 🏁 บทสรุป (To be continued…)
RViz คือเครื่องมือที่ขาดไม่ได้เลยสำหรับคนทำหุ่นยนต์ มันเปลี่ยนนามธรรม (ข้อมูลตัวเลขและสมการ) ให้กลายเป็นรูปธรรม (กราฟิก 3 มิติ) ทำให้เรา “เห็น” ว่าหุ่นยนต์กำลังมองโลกอย่างไรผ่าน Point Cloud และ Laser Scan รวมถึงช่วยเช็คความถูกต้องของโครงสร้างหุ่นยนต์ (RobotModel)
แต่เดี๋ยวก่อน! การที่ RViz จะวาดชิ้นส่วนหุ่นยนต์ให้อยู่ถูกที่ถูกทางได้ (แขนอยู่ต่อจากไหล่, เลเซอร์อยู่บนหลังคา) มันต้องอาศัยผู้ช่วยคนสำคัญที่คอยบอก “พิกัดสัมพัทธ์” ของทุกชิ้นส่วน ซึ่งเราเรียกสิ่งนี้ว่าระบบ TF (Transform Framework) ครับ! ในตอนต่อไป พี่จะพาน้องๆ ไปเจาะลึกโครงสร้างกระดูกสันหลังของหุ่นยนต์กัน เตรียมตัวรับมือกับคณิตศาสตร์และเวกเตอร์กันให้พร้อมนะครับ!
ต้องการที่ปรึกษาด้านการออกแบบสถาปัตยกรรมหุ่นยนต์ (Robotics) และระบบ Automation ให้กับองค์กรของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและพัฒนาซอฟต์แวร์แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p