6. เซ็นเซอร์ที่โดรนใช้รู้ตัวเอง
IMU บารอมิเตอร์ LiDAR และ Optical flow ทำงานยังไง อ่านผิดได้เมื่อไร
โดรนตาบอด ไม่เห็นห้องและไม่รู้ว่ามันอยู่ที่ไหน สิ่งที่มี คือเซ็นเซอร์สี่ชนิดที่ทำให้พอรู้สถานะตัวเอง ถ้าเข้าใจว่าแต่ละตัววัดอะไรและเสียตรงไหน ปัญหาหน้างานครึ่งหนึ่งจะอธิบายได้เอง
1. IMU: ไจโรกับมาตรความเร่ง
ไจโร (gyroscope) วัดว่า "กำลังหมุนเร็วแค่ไหน" รอบแต่ละแกน ไวมาก ตอบทันที แต่ถ้าเอาค่ามารวมเพื่อหามุม ค่าคลาดเล็กๆ จะสะสมจนมุมเพี้ยนช้าๆ (drift)
มาตรความเร่ง (accelerometer) วัดแรงที่กระทำต่อตัวเซ็นเซอร์ ตอนนิ่งมันรู้ว่า "ทิศลง" ชี้ไปทางไหน จึงหามุมเอียงสัมบูรณ์ได้ ไม่เพี้ยนตามเวลา แต่สั่นง่ายตามแรงสั่นของมอเตอร์
ทำไมใช้คู่กัน: ไจโรแม่นระยะสั้นแต่เพี้ยนระยะยาว มาตรความเร่งตรงกันข้าม ตัวควบคุมผสมสองค่านี้ (เรียกว่า sensor fusion) ได้ค่าเอียงที่ทั้งเร็วทั้งไม่เพี้ยน
นี่คือเหตุผลที่ต้อง Calibrate: ไจโรมีค่าติดตัว (bias) ตอนนิ่งต้องรู้ว่า "นิ่ง" อ่านได้ค่าเท่าไร ถ้ากด calibrate ตอนขยับ ค่า bias จะผิด โดรนจะไถลไปทางเดียวตลอด (ดู ประกอบและจับคู่)
2. บารอมิเตอร์: ความสูงจากความกดอากาศ
ยิ่งสูง อากาศยิ่งเบา ความกดอากาศลดลง ราวๆ 12 ปาสกาลต่อเมตรใกล้ระดับน้ำทะเล เซ็นเซอร์วัดความกดแล้วแปลงเป็นความสูง
- ใช้ได้ถึง 50 เมตร (ตามสเปกผู้ผลิต) ไกลกว่า LiDAR มาก
- แต่ ลื่นไหลช้าและไวต่อสิ่งรบกวน ลมจากใบพัดเองก็เปลี่ยนความกดตรงเซ็นเซอร์ ประตูปิดแอร์เปิดก็เปลี่ยนค่า ใช้เป็นตัวสำรองเมื่อสูงเกิน 8 เมตร
3. LiDAR (ToF): ระยะถึงพื้น
ยิงแสงอินฟราเรดลงพื้น แล้ววัดเวลาที่แสงสะท้อนกลับ ระยะ = ความเร็วแสง × เวลา ÷ 2 (หาร 2 เพราะไปและกลับ)
- แม่นระดับเซนติเมตร ตอบสนองเร็ว ใช้ได้ถึง 8 เมตร
- ค่าที่ได้คือ ระยะถึงพื้นที่อยู่ใต้โดรนตอนนี้ ถ้าบินผ่านหัวโต๊ะหรือแท่นที่สูง 20 ซม. ระยะที่อ่านได้ก็จะลดลง 20 ซม. โดรนจะคิดว่าตัวเองต่ำลงแล้วเด้งขึ้นให้ ตรงนี้เกี่ยวกับกติกาจริง เพราะสนามแข่งมีแท่นสูง
- พื้นดำล้วนหรือกระจกเงา ดูดหรือสะท้อนแสงผิดทิศ อ่านพลาด
ค่าที่ pArduino->get_height_cm() ในโค้ดชมรมให้มา คือความสูงจากเซ็นเซอร์ฝั่ง FC ชนิดนี้ (อ่านผ่าน I2C จากที่อยู่ 0x34)
4. Optical flow: ไถลไปทางไหน
กล้องเล็กใต้ท้องถ่ายพื้นเป็นภาพต่อเนื่อง แล้วดูว่า ลวดลายบนพื้นเลื่อนไปทางไหน กี่พิกเซลต่อเฟรม เมื่อรู้ความสูง (จาก LiDAR) ก็แปลงเป็นความเร็วจริงได้ ยิ่งสูง ลายเลื่อนยิ่งช้าในภาพ จึงต้องรู้ความสูงมาคำนวณด้วย
- ทำให้ FC รู้ว่าโดรนไถลและดึงกลับได้ (poshold)
- ต้องการพื้นที่มี ลวดลายและแสงพอ พื้นสีเดียวล้วน ไม่มีอะไรให้เทียบ กล้องจะ "ไม่รู้ว่าขยับ"
- แสงน้อยหรือพื้นสะท้อน กล้องมองพลาด
นี่คือเหตุผลที่สนามแข่งใช้พรมที่มีลวดลาย และคู่มือเตือนไม่ให้บินเหนือผิวดำล้วนหรือมันเงา
เมื่อเซ็นเซอร์อ่านผิด
| อาการ | เซ็นเซอร์ที่น่าสงสัย | วิธีแก้ |
|---|---|---|
| ไถลไปทางเดียวตอนลอย | ไจโร (calibrate ผิด) | วางบนพื้นราบ กด calibrate ใหม่ |
| ไถลเรื่อยๆ ไม่นิ่ง | Optical flow (พื้นไม่มีลาย/แสงน้อย) | ย้ายไปพื้นที่มีลาย เพิ่มแสง |
| เด้งขึ้นลงตอนบินผ่านของ | LiDAR (เห็นของข้างใต้) | บินสูงขึ้น หรือรอให้ผ่านแล้วใช้ set_height อีกครั้ง |
| ความสูงเพี้ยนในที่ลมแรง | บารอมิเตอร์ | ใช้ LiDAR ใกล้พื้นเป็นหลัก |
| ไฟเหลืองติดค้าง | หลายตัว | หยุด ตรวจเซ็นเซอร์ใต้ท้องไม่ถูกบัง และ calibrate ใหม่ |
ลองทำ
- ถ่ายรูปพื้นห้องซ้อมของคุณ ลวดลายพอให้ Optical flow ทำงานไหม (ลองเทียบกับพื้นกระเบื้องขาวเรียบ)
- คำนวณ: ถ้าแสงไปถึงพื้นและกลับในเวลา 6.7 นาโนวินาที (0.0000000067 วินาที) ความสูงเท่าไร (ระยะ = 3×10⁸ × 6.7×10⁻⁹ ÷ 2 ≈ 1.0 เมตร)
- ลองสั่ง
sh(110)เหนือพรมมีลายและเหนือกระดาษดำล้วน เทียบความนิ่งของโดรน