VIO และ SLAM
UAT 307 การมองเห็นด้วยคอมพิวเตอร์และเทคโนโลยีการรับรู้
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- แยก VIO, VIN และ SLAM ตามบทบาทของกล้อง IMU และแผนที่
- คำนวณความลึกจากกล้องสเตอริโอและความคลาดเคลื่อนของความลึก
- อธิบายปัญหามาตราส่วนของกล้องตัวเดียว และประมาณมาตราส่วนจาก IMU
- เลือกเซนเซอร์รับรู้ให้เหมาะกับระยะและสภาพแวดล้อม
ทำไมต้องรู้
หน่วยความรู้เรื่อง VIN, VIO และ SLAM ของคลังความรู้โดรนอธิบายบทบาทของกล้อง IMU และการรวมข้อมูล ก่อนเลือกเครื่องมือทดลองการนำทาง VIO (visual-inertial odometry) ประมาณการเคลื่อนที่ต่อเนื่องจากกล้องกับ IMU SLAM สร้างแผนที่และหาตำแหน่งในแผนที่ไปพร้อมกัน ซึ่งปิดวงเพื่อลดการลอยได้ UAT 366 ใช้แนวคิด SLAM ในอาคารแล้ว โมดูลนี้เน้น ความลึก และ มาตราส่วน ซึ่งเป็นสองเรื่องที่ทำให้ระบบนำทางด้วยภาพผิดบ่อยที่สุด
ความลึกจากสเตอริโอ
กล้องสองตัววางห่างกันเป็นระยะฐาน เห็นจุดเดียวกันที่ตำแหน่งต่างกันในภาพ ความต่างนี้เรียกว่า disparity ความลึกคือ เมื่อ คือความยาวโฟกัสหน่วยพิกเซล เพราะ แปรผกผันกับ ความคลาดเคลื่อนของ disparity เพียงเล็กน้อยทำให้ความลึกที่ระยะไกลผิดมาก ความคลาดเคลื่อนของความลึกโตตามกำลังสองของระยะ ตามความสัมพันธ์ ที่ Keselman และคณะ (2017) ใช้อธิบายกล้องความลึกแบบสเตอริโอของ Intel RealSense
ตัวอย่างที่ 1 กล้องสเตอริโอขนาดเล็กบนโดรน
ความยาวโฟกัส 640 พิกเซล ระยะฐาน 95 mm ความคลาดเคลื่อนของ disparity 0.25 พิกเซล (ค่าสมมติ)
F_PX, BASE, DD = 640, 0.095, 0.25 # พิกเซล, m, พิกเซล
for z in (2, 5, 10, 20):
d = F_PX * BASE / z
dz = z * z / (F_PX * BASE) * DD
print(f"range {z:>2} m: disparity {d:5.2f} px, depth error about {dz:.3f} m ({dz / z:.1%})")
range 2 m: disparity 30.40 px, depth error about 0.016 m (0.8%)
range 5 m: disparity 12.16 px, depth error about 0.103 m (2.1%)
range 10 m: disparity 6.08 px, depth error about 0.411 m (4.1%)
range 20 m: disparity 3.04 px, depth error about 1.645 m (8.2%)
ที่ 2 m ความลึกผิดเพียงไม่กี่เซนติเมตร แต่ที่ 20 m ผิดเกินหนึ่งเมตร กล้องสเตอริโอขนาดเล็กจึงเหมาะกับการหลบสิ่งกีดขวางระยะใกล้ ถ้าต้องการความลึกที่ระยะไกลต้องเพิ่มระยะฐาน เพิ่มความละเอียด หรือใช้ LiDAR
มาตราส่วนของกล้องตัวเดียว
กล้องตัวเดียวรู้ทิศทางการเคลื่อนที่แต่ไม่รู้ มาตราส่วน ภาพของบ้านจริงที่อยู่ไกลกับบ้านจำลองที่อยู่ใกล้อาจเหมือนกัน VIO แก้ปัญหานี้ด้วย IMU ซึ่งวัดความเร่งในหน่วยจริง เมื่อเทียบระยะเคลื่อนที่จากภาพ (ไม่มีหน่วย) กับระยะจากการอินทิเกรต IMU ในช่วงสั้น จะได้ตัวคูณมาตราส่วน ต้องมีความเร่งพอให้ IMU วัดได้ชัด การบินความเร็วคงที่นาน ๆ จึงประมาณมาตราส่วนได้ยาก
ตัวอย่างที่ 2 ประมาณมาตราส่วนด้วยกำลังสองน้อยที่สุด
ระยะเคลื่อนที่ในหกช่วงสั้นจาก IMU (เมตร) และจากภาพ (ไม่มีหน่วย) มาตราส่วนจริง 3.2 (ข้อมูลจำลอง)
import numpy as np
imu = np.array([0.52, 1.05, 1.48, 2.10, 2.47, 3.03]) # m
vis = imu / 3.2 + np.random.default_rng(8).normal(0, 0.01, 6) # ไม่มีหน่วย
s = (vis @ imu) / (vis @ vis)
resid = imu - s * vis
print("visual displacements:", np.round(vis, 3))
print(f"estimated scale {s:.3f} (true 3.2), residual RMS {np.sqrt(np.mean(resid ** 2)):.3f} m")
print(f"a 10-unit visual path would be {10 * s:.1f} m")
visual displacements: [0.145 0.315 0.449 0.653 0.749 0.945]
estimated scale 3.250 (true 3.2), residual RMS 0.034 m
a 10-unit visual path would be 32.5 m
มาตราส่วนที่ประมาณได้ใกล้ค่าจริง ค่าที่เหลือบอกคุณภาพการประมาณ ถ้ามาตราส่วนผิดไปเพียง 5% เส้นทาง 100 m จะผิดไป 5 m ดังนั้นระบบ VIO จึงประมาณมาตราส่วนต่อเนื่องตลอดการบิน และระบบบางแบบใช้เซนเซอร์วัดระยะหรือบารอมิเตอร์ช่วยยืนยัน
เลือกเซนเซอร์รับรู้
- สเตอริโอ ให้ความลึกหนาแน่นระยะใกล้ ใช้ได้เมื่อมีพื้นผิวและแสงพอ
- LiDAR ให้ระยะแม่นในระยะไกลกว่าและไม่ขึ้นกับแสง แต่หนักและแพงกว่า
- กล้องตัวเดียวกับ IMU เบาและถูก แต่ต้องมีการเคลื่อนที่พอให้หามาตราส่วน
- ทุกแบบมีปัญหากับพื้นผิวเรียบไม่มีลาย ผิวสะท้อน น้ำ และหมอก
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ความลึกและมาตราส่วน
- วัดความลึกจากกล้องสเตอริโอที่ระยะ 1–10 m เทียบกับระยะจริง และเทียบกับตัวอย่างที่ 1
- เปลี่ยนพื้นหลังเป็นผนังเรียบไม่มีลาย สังเกตความลึกที่หายไป
- ใช้ข้อมูลกล้องกับ IMU ที่บันทึกไว้ ประมาณมาตราส่วนด้วยตัวอย่างที่ 2
- เทียบมาตราส่วนช่วงที่โดรนเร่งกับช่วงที่บินความเร็วคงที่
- เขียนข้อเสนอการเลือกเซนเซอร์รับรู้สำหรับโดรนตรวจใต้สะพาน
ข้อผิดพลาดที่พบบ่อย
ระวัง
- เชื่อความลึกจากสเตอริโอที่ระยะไกล
- ใช้กล้องตัวเดียวโดยไม่มีแหล่งมาตราส่วน
- บินความเร็วคงที่ตลอด ทำให้ VIO หามาตราส่วนไม่ได้
- ใช้ระบบรับรู้ด้วยภาพเหนือน้ำหรือพื้นเรียบ โดยไม่มีสำรอง
- สับสน VIO กับ SLAM ว่าปิดวงได้
สรุป
- VIO ประมาณการเคลื่อนที่จากกล้องกับ IMU ส่วน SLAM เพิ่มแผนที่และการปิดวง
- ความลึกจากสเตอริโอ ความคลาดเคลื่อนโตตามกำลังสองของระยะ
- กล้องตัวเดียวไม่รู้มาตราส่วน IMU ช่วยประมาณได้เมื่อมีความเร่งพอ
- เลือกเซนเซอร์ตามระยะ แสง และพื้นผิวของงาน
แบบฝึกตรวจความเข้าใจ
- = 700 px, = 0.1 m, = 14 px ความลึกเท่าใด
- ถ้าระยะเพิ่มเป็นสองเท่า ความคลาดเคลื่อนของความลึกเพิ่มกี่เท่า
- ทำไมกล้องตัวเดียวจึงไม่รู้มาตราส่วน
- มาตราส่วนผิด 3% เส้นทาง 200 m ผิดเท่าใด
- SLAM ต่างจาก VIO อย่างไร
เฉลย
- m
- 4 เท่า
- วัตถุใหญ่ที่ไกลกับวัตถุเล็กที่ใกล้ให้ภาพเหมือนกัน
- 6 m
- SLAM สร้างแผนที่และปิดวงเมื่อกลับมาที่เดิม จึงลดการลอยสะสมได้
สรุปสูตรสำคัญ
| ความลึกจากสเตอริโอ | |
| ความคลาดเคลื่อนของความลึก | |
| มาตราส่วนจากกำลังสองน้อยที่สุด |
แหล่งอ้างอิงหลัก
- Szeliski, R. (2022). Computer vision: Algorithms and applications (2nd ed.). Springer. link
- Corke, P. (2023). Robotics, vision and control: Fundamental algorithms in Python. Springer. link
- Hartley, R., & Zisserman, A. (2004). Multiple view geometry in computer vision (2nd ed.). Cambridge University Press. link
- Keselman, L., Woodfill, J. I., Grunnet-Jepsen, A., & Bhowmik, A. (2017). Intel RealSense stereoscopic depth cameras (arXiv:1705.05548). link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz