ชมรมโดรน

6. เซ็นเซอร์ที่โดรนใช้รู้ตัวเอง

IMU บารอมิเตอร์ LiDAR และ Optical flow ทำงานยังไง อ่านผิดได้เมื่อไร

โดรนตาบอด ไม่เห็นห้องและไม่รู้ว่ามันอยู่ที่ไหน สิ่งที่มี คือเซ็นเซอร์สี่ชนิดที่ทำให้พอรู้สถานะตัวเอง ถ้าเข้าใจว่าแต่ละตัววัดอะไรและเสียตรงไหน ปัญหาหน้างานครึ่งหนึ่งจะอธิบายได้เอง

เซ็นเซอร์บนโดรนและสิ่งที่แต่ละตัววัดLiDAR วัดระยะถึงพื้นกล้อง Optical flowดูลายพื้นว่าเลื่อนไปทางไหนIMU (ไจโร + มาตรความเร่ง)รู้ว่าเอียงเท่าไร หมุนเร็วแค่ไหนบารอมิเตอร์วัดความสูงจากความกดอากาศ
เซ็นเซอร์บน RCSA EDU และสิ่งที่แต่ละตัวมอง

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 ใหม่

ลองทำ

  1. ถ่ายรูปพื้นห้องซ้อมของคุณ ลวดลายพอให้ Optical flow ทำงานไหม (ลองเทียบกับพื้นกระเบื้องขาวเรียบ)
  2. คำนวณ: ถ้าแสงไปถึงพื้นและกลับในเวลา 6.7 นาโนวินาที (0.0000000067 วินาที) ความสูงเท่าไร (ระยะ = 3×10⁸ × 6.7×10⁻⁹ ÷ 2 ≈ 1.0 เมตร)
  3. ลองสั่ง sh(110) เหนือพรมมีลายและเหนือกระดาษดำล้วน เทียบความนิ่งของโดรน

On this page