ชมรมโดรน

8. ทำไมกะเวลาแล้วระยะคลาด (Dead reckoning)

โดรนไม่รู้ตำแหน่งตัวเอง โค้ดของชมรมกะระยะจากเวลา ความคลาดสะสมมาจากไหนและลดได้ยังไง

คำสั่ง fw(250) ในโค้ดของชมรมไม่ได้บอกโดรนว่า "ไปให้ถึงจุดที่อยู่ห่างไปข้างหน้า 250 เซนติเมตร" มันทำแค่ "บินไปข้างหน้า รอ 3.87 วินาที แล้วหยุด" หน้านี้อธิบายว่าทำไมต้องทำแบบนี้ ทำไมคลาด และทำยังไงให้คลาดน้อยที่สุด

วิธีของกะลาสีเรือเมื่อก่อนมี GPS

เรือสมัยก่อนรู้ว่าเรือวิ่งกี่นอตและมาแล้วกี่ชั่วโมง จึงคำนวณได้ว่า "ตอนนี้น่าจะอยู่ตรงนี้" เรียกว่า dead reckoning ไม่ต้องมีเครื่องมือบอกตำแหน่ง ใช้แค่ ความเร็ว × เวลา = ระยะ

โดรนของชมรมไม่มี GPS ในอาคาร และไม่มีเซ็นเซอร์วัดตำแหน่ง X Y จริง (Optical flow ช่วยกันไถล แต่ไม่ได้ให้ตำแหน่งสัมบูรณ์) จึงใช้วิธีเดียวกับเรือ

คำนวณจากโค้ดจริง

ใน config.hpp

constexpr float MS_PER_CM_FWD   = 15.46f;   // ไปหน้า: 15.46 มิลลิวินาทีต่อ 1 ซม.
constexpr float MS_PER_CM_BACK  = 15.16f;
constexpr float MS_PER_CM_LEFT  = 15.65f;
constexpr float MS_PER_CM_RIGHT = 15.65f;

ค่าเหล่านี้คือ เวลาที่ใช้ต่อระยะ 1 เซนติเมตร (กลับด้านกับ "ความเร็ว") ไปหน้า 250 ซม.

เวลา = 250 × 15.46 = 3,865 ms ≈ 3.87 วินาที
ความเร็วเฉลี่ย = 250 ซม. ÷ 3.87 วินาที ≈ 64.7 ซม./วินาที

ความเร็วราว 0.65 เมตรต่อวินาที ซึ่งต่ำกว่าความเร็วสูงสุด 2 เมตรต่อวินาทีของโดรนมาก เพราะชมรมเลือกบินช้าให้แม่นและหยุดทัน ลองใส่ตัวเลขเอง

delay ≈ 3865 ms ≈ 3.87 วินาที · ความเร็วเฉลี่ย ≈ 65 ซม./วินาที

ทำไมถึงคลาด

ความคลาดมี 4 แหล่งใหญ่ ทุกข้อเกิดจริงและเจอบ่อย

1. ช่วงเร่งและเบรกรวมอยู่ในเวลา เมื่อสั่งไปข้างหน้า โดรนต้องเอียงก่อน ใช้เวลาเร่งขึ้นถึงความเร็วปกติ และเมื่อหยุดต้องเบรก ระยะที่ได้ไม่ได้ขึ้นกับเวลาเป็นเส้นตรงเป๊ะๆ ค่า 15.46 ที่วัดจากระยะ 250 ซม. จึงอาจไม่เหมาะกับระยะ 50 ซม. วัดค่าที่ระยะที่ใช้บ่อย

2. แบตเตอรี่ แรงดันเปลี่ยน ความเร็วเปลี่ยน ดู แบตเตอรี่

3. พื้นผิวและลม ลมจากแอร์ ลมจากโดรนตัวอื่น พื้นลื่น ล้วนผลักโดรนต่างจากที่คาด

4. ทิศหันหัวคลาด ถ้าโดรนหันหัวคลาดไป 2° แล้วบินไปข้างหน้า 400 ซม. จะเบี่ยงออกด้านข้าง

ด้านข้างที่คลาด = 400 × tan 2° ≈ 14 ซม.

แค่ 2 องศาที่ตามองไม่เห็น คลาดไป 14 ซม. ในระยะ 4 เมตร ซึ่งมากพอจะพลาดแท่นขนาด 1 เมตร

คลาดสะสม

คำสั่งต่อเนื่องจะบวกกัน ตัวอย่าง: เส้นทางที่ไปหน้า 250 → ซ้าย 255 → ถอย 250 ในแต่ละช่วงคลาด 1.5% (เวลาไม่ตรง)

ไปหน้า 250 ซม. : คลาด ±3.8 ซม.
ซ้าย 255 ซม.   : คลาด ±3.8 ซม.
ถอย 250 ซม.   : คลาด ±3.8 ซม.
รวมกันโดยบวกตรงๆ (กรณีแย่สุด) ≈ ±11.4 ซม.

ยิ่งภารกิจยาว ความคลาดยิ่งสะสม เป็นเหตุผลที่ภารกิจที่มี 10 ขั้นตอนควรมี "จุดเทียบ" ระหว่างทาง (เช่นแท่นที่โดรนต้องเข้า หรือเส้นบนพื้น) และทำไมถึงเขียนโค้ดแยกเป็นหลายช่วงสั้นๆ

ความคลาดเคลื่อนสะสมเมื่อบินด้วยการกะเวลาเส้นประคือเส้นทางที่ตั้งใจ เส้นทึบคือที่โดรนไปจริง ซึ่งเบี่ยงออกทีละนิดแล้วสะสมเริ่มเส้นทางที่ตั้งใจ (เส้นประ)ที่ไปจริง (เบี่ยงสะสมทุกช่วง)คลาดไปนี้
เส้นประคือเส้นทางที่ตั้งใจ เส้นแดงคือที่ไปจริง ความคลาดเล็กๆ ในแต่ละช่วงบวกกันจนปลายทางคลาดไปไกล (ภาพประกอบ)

ลดความคลาดยังไง

วิธีผล
วัดค่า ms/cm ที่ระยะที่ใช้จริง ไม่ใช่ระยะไกลสุดลดความคลาดจากช่วงเร่ง/เบรก
ใช้แบตเต็มและก้อนเดียวกับที่ซ้อมเสมอลดความคลาดจากแรงดัน
เว้นเวลา settle หลังคำสั่งเคลื่อนที่ทุกครั้งให้โดรนหยุดเอียงก่อนคำสั่งต่อไป (fw() ใส่ให้ 400 ms อัตโนมัติ)
ล็อกตำแหน่งด้วย poshold หลังหยุดOptical flow ดึงกลับไม่ให้ไถล (ในโค้ดของชมรมเรียกให้เองท้ายคำสั่ง move_*_cm)
เพิ่มคำสั่งหมุนหัวเป็นขั้นตอนที่ตรวจสอบได้ลดทิศหันคลาด ดู หมุนหัว
อ่านเซ็นเซอร์ความสูงเพื่อยืนยันก่อนปล่อยของความสูงยืนยันได้ แม้ X Y ยืนยันไม่ได้
ซ้อมเส้นทางเดิมหลายรอบแล้วปรับปรับค่าแต่ละช่วงตามผลจริง

เปรียบเทียบกับการมีเซ็นเซอร์ตำแหน่ง

โดรนบางรุ่นที่มี GPS หรือระบบจับตำแหน่ง (เช่นกล้องสนาม) บอกพิกัดจริงได้ คำสั่ง "ไปที่ (250, 0)" จะไปถึงจุดนั้นแล้วหยุดเอง ความคลาดไม่สะสม เพราะตรวจสอบตำแหน่งอยู่ตลอด ข้อเสียคือต้องมีอุปกรณ์เพิ่มและกติกาอาจไม่อนุญาต โดรนของชมรมไม่มี จึงต้องอาศัยวินัยในการวัดและซ้อม

ลองทำ

  1. วัดค่า ms/cm ของโดรนคุณ: ทำเส้นเทปยาว 250 ซม. บนพื้น สั่ง fw(250) ห้าครั้ง วัดระยะที่ไปจริง หาค่าเฉลี่ย แล้วปรับ MS_PER_CM_FWD = 15.46 × 250 / ระยะจริงเฉลี่ย
  2. ถ้าระยะจริงเฉลี่ย = 238 ซม. ค่าใหม่คือเท่าไร (คำตอบ: 15.46 × 250 / 238 = 16.24 ms/ซม. เวลานานขึ้นเพื่อให้ไปได้ไกลขึ้น)
  3. คำนวณความคลาดด้านข้างเมื่อหันคลาด 3° และบิน 300 ซม. (คำตอบ: 300 × tan 3° ≈ 15.7 ซม.)

ขั้นตอนวัด calibrate แบบละเอียดและตารางบันทึกอยู่ที่ ระยะกับเวลา

On this page