สอบเทียบกล้องและ IMU
UAT 307 การมองเห็นด้วยคอมพิวเตอร์และเทคโนโลยีการรับรู้
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- ประมาณ homography ระหว่างภาพกับระนาบพื้นด้วยวิธี DLT
- ใช้ homography วัดระยะบนพื้นจากภาพเฉียง
- ประมาณเวลาคลาดระหว่างกล้องกับ IMU ด้วย cross-correlation
- แยกสาเหตุความคลาดเคลื่อนเป็นพารามิเตอร์ภาพ ตำแหน่งติดตั้ง และเวลา
ทำไมต้องรู้
UAT 205 สอบเทียบพารามิเตอร์ภายในของกล้องและความบิดเบี้ยวของเลนส์แล้ว หน่วยความรู้เรื่องปรับเทียบกล้องและ IMU ของคลังความรู้โดรนแนะนำให้แยกพารามิเตอร์ภาพ ตำแหน่งติดตั้ง และเวลา เพื่อค้นหาสาเหตุความคลาดเคลื่อนอย่างเป็นระบบ โมดูลนี้เพิ่มสองเรื่อง คือ homography สำหรับวัดบนระนาบพื้น และ เวลาคลาดระหว่างกล้องกับ IMU ซึ่งถ้าไม่แก้ ระบบนำทางด้วยภาพจะผิดทุกครั้งที่โดรนหมุน
Homography และ DLT
จุดบนระนาบเดียวกัน (เช่น พื้นลานจอด) กับตำแหน่งในภาพสัมพันธ์กันด้วยเมทริกซ์ homography ขนาด 3×3 ที่มีอิสระ 8 ค่า ตำรา Multiple View Geometry ของ Hartley และ Zisserman อธิบายวิธี DLT (direct linear transform) ที่ใช้คู่จุดตั้งแต่ 4 คู่ขึ้นไป แต่ละคู่ให้สมการเชิงเส้นสองสมการ แล้วหา ด้วย SVD ตำราแนะนำให้ปรับมาตรฐานพิกัดก่อนเมื่อใช้กับข้อมูลจริง OpenCV มี cv2.findHomography ที่รวมการกำจัดคู่จุดผิดด้วย RANSAC
ตัวอย่างที่ 1 วัดระยะบนลานจอดจากภาพเฉียง
มุมทั้งสี่ของลานจอดขนาด 10 × 20 m ปรากฏในภาพที่ตำแหน่งพิกเซลดังนี้ ต้องการระยะระหว่างสองจุดบนพื้นที่เห็นในภาพ (ข้อมูลจำลอง)
import numpy as np
img_pts = np.array([[412, 830], [1508, 812], [1320, 402], [590, 410.]]) # พิกเซล
ground = np.array([[0, 0], [10, 0], [10, 20], [0, 20.]]) # เมตร
def dlt(src, dst):
rows = []
for (x, y), (u, v) in zip(src, dst):
rows.append([-x, -y, -1, 0, 0, 0, u * x, u * y, u])
rows.append([0, 0, 0, -x, -y, -1, v * x, v * y, v])
_, _, vt = np.linalg.svd(np.array(rows))
h = vt[-1].reshape(3, 3)
return h / h[2, 2]
def to_ground(H, p):
q = H @ np.r_[p, 1.0]
return q[:2] / q[2]
H = dlt(img_pts, ground)
a, b = to_ground(H, [960, 700]), to_ground(H, [960, 450])
print("point A on ground (m):", np.round(a, 2))
print("point B on ground (m):", np.round(b, 2))
print(f"distance A-B: {np.linalg.norm(a - b):.2f} m, while in the image they are {700 - 450} px apart")
print("check corner:", np.round(to_ground(H, img_pts[2]), 3))
point A on ground (m): [4.98 4.3 ]
point B on ground (m): [ 5.03 16.97]
distance A-B: 12.67 m, while in the image they are 250 px apart
check corner: [10. 20.]
สองจุดห่างกันในภาพ 250 พิกเซล แต่บนพื้นห่างกันกว่า 12 m เพราะส่วนบนของภาพอยู่ไกลกล้องกว่า หนึ่งพิกเซลจึงแทนระยะบนพื้นมากกว่า homography ใช้ได้เฉพาะจุดบนระนาบเดียวกันเท่านั้น วัตถุที่มีความสูง เช่น เสา จะถูกฉายผิดตำแหน่ง
เวลาคลาดระหว่างกล้องกับ IMU
กล้องและ IMU มักมีนาฬิกาต่างกัน และภาพมีเวลาเปิดรับแสงกับการส่งข้อมูล เวลาคลาดเพียงไม่กี่สิบมิลลิวินาทีทำให้ระบบรวมข้อมูลเข้าใจผิดว่าภาพถ่ายเมื่อโดรนหันไปอีกทิศ Furgale และคณะ (2013) เสนอการสอบเทียบเวลาและตำแหน่งร่วมกันสำหรับระบบหลายเซนเซอร์ ซึ่งใช้ในเครื่องมือ Kalibr หลักการพื้นฐานคือเทียบสัญญาณการหมุนจากสองแหล่ง แล้วหาเวลาเลื่อนที่ทำให้ตรงกันมากที่สุด
ตัวอย่างที่ 2 หาเวลาคลาดด้วย cross-correlation
อัตราหมุนจาก gyro กับอัตราหมุนที่ประมาณจากภาพ (สุ่มที่ 200 Hz) โดยสัญญาณจากภาพช้ากว่าจริง 35 ms (ข้อมูลจำลอง)
import numpy as np
fs = 200
t = np.arange(0, 10, 1 / fs)
gyro = np.sin(2 * np.pi * 0.7 * t) + 0.5 * np.sin(2 * np.pi * 1.9 * t + 1)
TRUE_OFFSET = 0.035 # s
cam = np.interp(t - TRUE_OFFSET, t, gyro) + np.random.default_rng(1).normal(0, 0.05, t.size)
lags = np.arange(-40, 41) # ตัวอย่าง = ±200 ms
score = [np.dot(gyro[50:-50], np.roll(cam, -lag)[50:-50]) for lag in lags]
est = lags[int(np.argmax(score))] / fs
print(f"estimated offset {est * 1000:.0f} ms (true {TRUE_OFFSET * 1000:.0f} ms, resolution {1000 / fs:.0f} ms)")
rate = 60 # deg/s ขณะหมุนหัว
print(f"at {rate} deg/s an uncorrected offset of {TRUE_OFFSET * 1000:.0f} ms means {rate * TRUE_OFFSET:.1f} deg of heading error")
estimated offset 40 ms (true 35 ms, resolution 5 ms)
at 60 deg/s an uncorrected offset of 35 ms means 2.1 deg of heading error
ค่าที่ได้คลาดจากค่าจริงไม่เกินหนึ่งช่วงการสุ่ม ความละเอียดขึ้นกับอัตราการสุ่ม และปรับให้ละเอียดขึ้นได้ด้วยการประมาณระหว่างจุด แม้เวลาคลาดดูน้อย แต่ขณะหมุนหัวเร็ว ทิศที่คำนวณจะผิดหลายองศา ซึ่งมากพอให้ระบบนำทางด้วยภาพเสียความแม่นยำ
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: สอบเทียบเรขาคณิตและเวลา
- วางเป้าสี่มุมที่รู้ระยะบนพื้น ถ่ายภาพเฉียงจากโดรน แล้วหา homography ด้วยตัวอย่างที่ 1
- วัดระยะระหว่างจุดอื่นบนพื้นจากภาพ เทียบกับตลับเมตร
- เทียบผลกับ
cv2.findHomographyและทดลองเพิ่มจุดผิดหนึ่งจุด ดูผลของ RANSAC - บันทึก gyro และวิดีโอขณะหมุนโดรนไปมา ประมาณเวลาคลาดด้วยตัวอย่างที่ 2
- ศึกษาเอกสาร Kalibr และเขียนขั้นตอนสอบเทียบกล้องกับ IMU สำหรับโดรนฝึก
ข้อผิดพลาดที่พบบ่อย
ระวัง
- ใช้ homography กับจุดที่ไม่อยู่บนระนาบเดียวกัน
- ใช้คู่จุดที่เรียงเป็นเส้นตรง ทำให้แก้สมการไม่ได้
- ไม่ปรับมาตรฐานพิกัด ก่อน DLT เมื่อใช้ข้อมูลจริง
- ไม่ตรวจเวลาคลาด ระหว่างกล้องกับ IMU
- สอบเทียบครั้งเดียวแล้วใช้ตลอด ทั้งที่เปลี่ยนเลนส์หรือตำแหน่งติดตั้ง
สรุป
- homography แปลงพิกัดระหว่างภาพกับระนาบ หาได้ด้วย DLT จากคู่จุดตั้งแต่ 4 คู่
- ระยะบนพื้นต่อพิกเซลไม่คงที่ในภาพเฉียง ต้องแปลงด้วย homography ก่อนวัด
- เวลาคลาดระหว่างกล้องกับ IMU หาได้จาก cross-correlation ของสัญญาณการหมุน
- ความคลาดเคลื่อนมาจากพารามิเตอร์ภาพ ตำแหน่งติดตั้ง หรือเวลา ต้องแยกให้ออก
แบบฝึกตรวจความเข้าใจ
- homography มีอิสระกี่ค่า และต้องใช้คู่จุดอย่างน้อยกี่คู่
- คู่จุดหนึ่งคู่ให้สมการกี่สมการ
- ทำไมระยะบนพื้นต่อพิกเซลจึงไม่คงที่ในภาพเฉียง
- เวลาคลาด 20 ms ขณะหมุน 90 deg/s ทำให้ทิศผิดเท่าใด
- ถ้าสุ่มสัญญาณที่ 100 Hz ความละเอียดของเวลาคลาดจาก cross-correlation เท่าใดโดยไม่ประมาณระหว่างจุด
เฉลย
- 8 ค่า อย่างน้อย 4 คู่
- 2 สมการ
- ส่วนที่ไกลกล้องหนึ่งพิกเซลแทนพื้นที่มากกว่าส่วนที่ใกล้
- 10 ms
สรุปสูตรสำคัญ
| Homography | |
| สมการ DLT ของแต่ละคู่จุด | |
| Cross-correlation |
แหล่งอ้างอิงหลัก
- Hartley, R., & Zisserman, A. (2004). Multiple view geometry in computer vision (2nd ed.). Cambridge University Press. link
- Szeliski, R. (2022). Computer vision: Algorithms and applications (2nd ed.). Springer. link
- Furgale, P., Rehder, J., & Siegwart, R. (2013). Unified temporal and spatial calibration for multi-sensor systems. In 2013 IEEE/RSJ International Conference on Intelligent Robots and Systems (pp. 1280–1286). link
- OpenCV. OpenCV documentation. link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz