ชมรมโดรน

2. วางเส้นทางและงบเวลา

ท่าบินรูปตัว T และการแบ่งเวลา 150 วินาทีให้แต่ละคำสั่ง ตามเอนจินของตัวจำลอง

ภารกิจ 150 วินาทีเหมือนเดินทางด้วยงบเงินจำกัด ถ้าไม่จดว่าแต่ละช่วงใช้เท่าไร ก็ไม่รู้ว่าเกินเมื่อไร โดรนของชมรมไม่มีเครื่องวัดระยะบิน มันบินตามเวลา ดังนั้น เวลาคือหน่วยเงินเดียวที่ต้องบริหาร

1. โดรนนับระยะด้วยเวลา

คำสั่ง fw(250) ไม่ได้บอกให้โดรนไป "250 ซม. แล้วหยุด" ใน protocol.cpp มันคือ

void Arduino::move_forward_cm(uint16_t distance_cm, uint8_t speed) {
  set_direction(1, speed);                         // 1 = เดินหน้า
  delay(ms_round(distance_cm * MS_PER_CM_FWD));    // รอตามเวลา
  poshold(speed);                                  // แล้วสั่งหยุดนิ่ง
}

สั่งทิศ รอตามเวลา แล้วสั่งหยุด ค่าเวลาต่อซม. วัดมาจากโดรนจริงและเก็บไว้ใน config.hpp

ทิศms ต่อ 1 ซม.250 ซม. ใช้
เดินหน้า fw15.463.87 วินาที
ถอย bw15.163.79 วินาที
ซ้าย ml15.653.91 วินาที
ขวา mr15.653.91 วินาที

เรียกวิธีนี้ว่า dead-reckoning คือเดาตำแหน่งจากเวลาและความเร็ว แบตอ่อนลงหรือลมแรง ความเร็วเปลี่ยน ระยะก็เพี้ยน จึงต้องซ้อมในสนามจริงและจูนตัวเลข

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

2. ท่าตัว T

ภารกิจทิ้งสัมภาระต้องไปสองแท่นบน แล้วกลับ เส้นทางที่ประหยัดคือรูปตัว T

เส้นทางบินรูปตัว Tขึ้นจากแท่นกลาง เดินหน้า 250 ไปซ้าย 250 ปล่อย ไปขวา 500 ปล่อย กลับซ้าย 250 ถอย 250 ลงจอดแท่นซ้ายแท่นขวาTakeoff1 fw(250)2 ml(250)3 mr(500) · ข้ามไปแท่นขวาposhold · dropposhold · drop4 ml(250)5 bw(250)ระยะเป็นซม. ตามโปรแกรม mission-t ใน src/flight/programs.ts
ตัว T ด้านบน: ขึ้นเหนือ 250 ซ้าย 250 (ถึงแท่นซ้ายบน) ข้ามขวา 500 (ถึงแท่นขวาบน) กลับซ้าย 250 ถอย 250 ลงที่ Takeoff

ทำไมถึงเป็นตัว T: จุด Takeoff อยู่ตรงกลางระหว่างแท่นสองแท่นบนพอดี ไปทางเหนือ 250 ซม. จะอยู่แนวเดียวกับแท่น จากนั้นซ้าย 250 ถึงแท่นหนึ่ง ข้ามไปขวาอีก 500 ถึงอีกแท่น ไม่ต้องเลี้ยวตัว (yaw) ซึ่งเสียเวลา (42 ms ต่อองศา ตามค่า YAW_MS_PER_DEG ใน config.hpp)

ระยะรวมของตัว T คือ 250 + 250 + 500 + 250 + 250 = 1,500 ซม. กินเวลาบินล้วนๆ ราว 23 วินาที

ท่านี้เป็นแบบที่ใช้ในโปรแกรม mission-t ของตัวจำลอง ส่วนโค้ดจริงของชมรม (KEY1_mode1 ใน Drone_Mission.ino) ใช้ตัวเลขต่างกันเล็กน้อย เช่น fw(256) และ mr(480) ที่ได้จากการจูนบนสนามจริง ตัวเลขในตัวจำลองเป็นค่ากลางที่ปรับทีหลังได้

3. งบเวลาแจกแจง

เอนจินใน src/flight/engine.ts ใช้ค่าคงที่เหล่านี้นับเวลา ผลลัพธ์ของ mission-warm (ตัว T ด้านบนอย่างเดียว) คือ 42.0 วินาที

ขั้นวิธีคิดเวลา
calibration()ตั้งศูนย์ 3 วินาที3.0 วิ
reload()คนแข่งใส่บอล6.5 วิ
takeOff()ขึ้น 80 ซม.1.9 วิ
sh(100)ปรับความสูงเล็กน้อย0.1 วิ
fw(250)250 × 15.463.9 วิ
ml(250)250 × 15.653.9 วิ
poshold() ×2หยุดนิ่ง 1.2 วิ ต่อครั้ง2.4 วิ
drop() ×2ปล่อยชุด 20 ลูก 1.6 วิ ต่อครั้ง3.2 วิ
mr(500)500 × 15.657.8 วิ
ml(250)250 × 15.653.9 วิ
bw(250)250 × 15.163.8 วิ
autoLand()ลงจากความสูง 100 ซม.1.6 วิ
รวม≈ 42.0 วิ

เวลาในตัวจำลองต่างจากโดรนจริง

ตัวจำลองนับ fw(250) เป็น 3.87 วินาที แต่ใน DroneEasy.cpp ฟังก์ชัน fw() ทำ move_forward_cm แล้วต่อด้วย settle(400) ซึ่งรออีก 400 ms โดรนจริงจึงช้ากว่าเล็กน้อยทุกครั้งที่สั่งเคลื่อนที่ ตัวปล่อยบอลก็ต่างกัน ฟังก์ชันของจริงบล็อก 1.5 วินาทีต่อครั้ง (ดู ปล่อยสัมภาระ) ประมาณการหยาบๆ ของ mission-t บนโดรนจริงคือ 83.5 + 4 (10 คำสั่งเคลื่อนที่ × 0.4) + 7.2 (4 การปล่อย × 1.8 ที่ต่างกัน) ≈ 95 วินาที ตัวเลขนี้คำนวณเอา ยังไม่ได้จับเวลาจริง

4. เทคนิคเขียนแผน

  1. ลงตารางก่อนโค้ด เขียนทีละขั้น พร้อมเวลา แล้วบวก ถ้าเกิน 150 ตัดขั้นที่ได้คะแนนน้อยสุดก่อน
  2. ใช้ความสูงร่วมกัน สั่ง sh() ให้น้อยที่สุด ขึ้นลงทุก 10 ซม. กินเวลา 12 ms/ซม. ตามเอนจิน
  3. เส้นตรงสั้นๆ ก่อน ตัว T ใช้ระยะตรงเท่ากันทุกท่อน แก้ตัวเลขทีละท่อนได้ง่ายกว่าเส้นทางซับซ้อน
  4. เลี้ยวให้น้อย ถ้าเลี่ยง yaw ได้ ให้เลี่ยง การหมุน 90° กินเวลา 90 × 42 ms + 220 ms ≈ 4 วินาที ตามเอนจิน
  5. เผื่อ 10–20% ตัวจำลองไม่รู้เรื่องลมหรือแบต ถ้าแผนใช้ 140 วินาที ในสนามจริงมีโอกาสหมดเวลา

ลองทำ

  1. ตั้งค่า mission-warm แล้วปรับ fw(250) เป็น fw(300) ดูว่าเวลาเพิ่มกี่วินาที (คำตอบ: 50 × 15.46 ms ≈ 0.77 วินาที)
  2. จดตารางงบเวลาของท่าที่คุณออกแบบเอง แล้วเทียบกับผลที่ตัวจำลองบอก
  3. คำนวณว่า ถ้าเพิ่ม settle(400) หลังทุกคำสั่งเคลื่อนที่ จะเกิน 150 วินาทีหรือไม่
รันวอร์มอัพตัว T

พังตรงไหนบ่อย

  • นับเวลาจากตัวจำลองอย่างเดียว โดรนจริงช้ากว่าตามที่คำนวณข้างบน
  • ระยะสะสมเพี้ยน ซ้ายขวาบนสนามไม่เท่ากัน เพราะ 15.65 ms/ซม. เป็นค่าเฉลี่ย จดค่าที่วัดจริงของโดรนตัวเอง
  • ลืมเวลาบรรจุบอล reload() ใช้ 6.5 วินาที ในตัวอย่าง
  • ลืม poshold() ก่อนปล่อย โดรนยังไหลอยู่ บอลตกนอกแท่น
  • ตัดสินจากเวลาที่เหลือเท่านั้น เวลาเหลือไม่ได้แปลว่าคะแนนครบ ตรวจรายการคะแนนที่ตัวจำลองสรุปให้ด้วย

On this page