โมดูล 4/5 · สัปดาห์ 10–12 · 27 ชม.

เหตุ link ขาดหายและ failsafe

UAT 207 ระบบสื่อสารและเครือข่ายข้อมูล

เวลาเรียนประมาณ 85 นาทีร่าง รอตรวจปรับปรุงล่าสุด 28 กันยายน 2569

บทเรียน

เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ

  1. แยกการขาดของ telemetry, GCS failsafe และ RC failsafe
  2. อธิบายพารามิเตอร์ failsafe ของ ArduPilot และ PX4 และค่าเริ่มต้นที่ต้องตรวจ
  3. สร้าง state machine สถานะลิงก์จากเวลาที่รับ heartbeat
  4. เลือกค่า timeout โดยคำนวณโอกาส failsafe หลอกจากอัตราแพ็กเก็ตหาย

ความรู้พื้นฐานที่ควรมี: UAT 207 โมดูล 3 · UAT 312 โมดูล 4 (ขั้นตอนเมื่อ C2 ขาด)

ทำไมต้องรู้

ลิงก์ขาดเป็นเหตุที่เกิดบ่อยที่สุดอย่างหนึ่งในการบิน และระบบต้องตัดสินใจเองว่าจะทำอะไร ถ้าตั้งไว้ไวเกิน โดรนจะกลับฐานกลางภารกิจทุกครั้งที่สัญญาณสะดุด ถ้าตั้งไว้ช้าเกิน โดรนจะบินต่อไปโดยไม่มีใครควบคุมได้ ปฏิบัติการ L10 และหน่วยความรู้เรื่อง C2 ในการจำลองของคลังความรู้โดรนเตือนว่า การขาดของ telemetry, GCS failsafe และ RC loss เป็นคนละเหตุการณ์ และไม่ใช่ทุกกรณีที่ต้องกลับฐาน

failsafe คนละชนิด

  • Heartbeat คู่มือ MAVLink ระบุว่าบนลิงก์วิทยุ ส่วนประกอบมักส่ง heartbeat 1 Hz และถือว่าอีกระบบหลุดเมื่อขาด 4–5 ข้อความ แต่ย้ำว่าตัวเลขนี้ขึ้นกับช่องทาง
  • GCS failsafe ของ ArduPilot ทำงานเมื่อไม่ได้รับ heartbeat จาก GCS นาน FS_GCS_TIMEOUT (ค่าเริ่มต้น 5 s) แต่ FS_GCS_ENABLE ปิดไว้โดยค่าเริ่มต้น ต้องเปิดและเลือกการกระทำเอง เช่น RTL หรือลงจอด
  • Radio (RC) failsafe ของ ArduPilot FS_THR_ENABLE ค่าเริ่มต้นคือ RTL และ FS_THR_VALUE 975 PWM คือระดับคันเร่งที่ถือว่าสัญญาณรีโมตหาย
  • PX4 ใช้ COM_DL_LOSS_T (ค่าเริ่มต้น 10 s) กับ NAV_DLL_ACT ซึ่งปิดไว้โดยค่าเริ่มต้นสำหรับลิงก์ข้อมูล และ COM_RC_LOSS_T (0.5 s) กับ NAV_RCL_ACT (ค่าเริ่มต้น Return) สำหรับรีโมต

ค่าเริ่มต้นเหล่านี้มาจากเอกสารและซอร์สโค้ดของรุ่นที่ตรวจ ต้องตรวจกับเฟิร์มแวร์ที่ใช้จริงทุกครั้ง แนวทาง RTCA DO-400 เรื่องขั้นตอนเมื่อ C2 ขาดให้ภาพรวมว่าควรวางแผนล่วงหน้าอย่างไร

State machine ของลิงก์

ตัวอย่างที่ 1 สถานะลิงก์จากเวลา heartbeat

เวลาที่สถานีรับ heartbeat (วินาที) เตือนเมื่อขาดเกิน 2.5 s และถือว่าหลุดเมื่อเกิน 5 s ตามค่า FS_GCS_TIMEOUT เริ่มต้น

beats = [0, 1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 17, 18, 19]
WARN_S, LOST_S, DT = 2.5, 5.0, 0.5

state, events = "connected", []
t = 0.0
while t <= 20:
    last = max(b for b in beats if b <= t)
    age = t - last
    new = "lost" if age > LOST_S else "warning" if age > WARN_S else "connected"
    if new != state:
        events.append((t, state, new, age))
        state = new
    t += DT
for t, old, new, age in events:
    print(f"t = {t:4.1f} s: {old:<9} -> {new:<9} (last heartbeat {age:.1f} s ago)")
t =  9.0 s: connected -> warning   (last heartbeat 3.0 s ago)
t = 11.5 s: warning   -> lost      (last heartbeat 5.5 s ago)
t = 12.0 s: lost      -> connected (last heartbeat 0.0 s ago)

เมื่อลิงก์กลับมา ระบบไม่ควรกลับไปทำภารกิจเดิมทันทีโดยอัตโนมัติเสมอไป ขึ้นกับการตั้งค่าและขั้นตอนของทีม ให้ตรวจใน log ว่าโหมดเปลี่ยนอย่างไร

ไทม์ไลน์ 0 ถึง 20 วินาที แถวบนเป็นขีดสีฟ้าของ heartbeat ทุกวินาที ขาดช่วงระหว่าง 6 ถึง 12 วินาที แถวล่างเป็นแถบสถานะ เชื่อมต่อสีเขียว 0 ถึง 9 วินาที เตือนสีทอง 9 ถึง 11.5 วินาที หลุดสีชมพู 11.5 ถึง 12 วินาที และเชื่อมต่อสีเขียวอีกครั้งตั้งแต่ 12 วินาที
ภาพที่ 1 ไทม์ไลน์สถานะลิงก์จาก heartbeat

เลือก timeout ด้วยตัวเลข

ถ้า heartbeat แต่ละครั้งหายด้วยโอกาส อย่างอิสระ การขาดติดกัน ครั้งจะเกิดด้วยโอกาส ในแต่ละช่วง แต่เที่ยวบินหนึ่งมีหลายพันช่วง โอกาสที่จะเจอสักครั้งจึงสูงกว่านั้นมาก

ตัวอย่างที่ 2 โอกาส failsafe หลอกต่อเที่ยวบิน

heartbeat 1 Hz เที่ยวบิน 30 นาที (1,800 ครั้ง) นับโอกาสที่มีการขาดติดกันอย่างน้อย N ครั้ง ด้วยการนับสถานะความยาวช่วงที่ขาด

def false_failsafe(p, n_timeout, n_beats=1800):
    run = [1.0] + [0.0] * n_timeout        # run[r] = โอกาสที่ขาดติดกันอยู่ r ครั้ง
    for _ in range(n_beats):
        new = [0.0] * (n_timeout + 1)
        for r in range(n_timeout):
            new[0] += run[r] * (1 - p)
            new[r + 1] += run[r] * p
        new[n_timeout] += run[n_timeout]
        run = new
    return run[n_timeout]

print("loss p | N=3        N=5        N=10")
for p in (0.05, 0.1, 0.2, 0.3):
    print(f"{p:6.2f} | " + "  ".join(f"{false_failsafe(p, n):9.2e}" for n in (3, 5, 10)))
loss p | N=3        N=5        N=10
  0.05 |  1.92e-01   5.33e-04   1.66e-10
  0.10 |  8.03e-01   1.60e-02   1.61e-07
  0.20 |  1.00e+00   3.69e-01   1.47e-04
  0.30 |  1.00e+00   9.54e-01   7.38e-03

ที่แพ็กเก็ตหาย 10% timeout 3 วินาทีมีโอกาสเกิด failsafe หลอกในเที่ยวบินครึ่งชั่วโมงถึงราว 80% ส่วน 5 วินาทีเหลือราว 2% และ 10 วินาทีแทบไม่เกิด แต่ timeout ยาวหมายถึงโดรนบินต่อนานขึ้นเมื่อลิงก์ขาดจริง ต้องชั่งทั้งสองด้าน แบบจำลองนี้ถือว่าการหายแต่ละครั้งอิสระกัน ซึ่งมักไม่จริงเพราะการหายมักเกิดเป็นช่วง จึงต้องใช้ข้อมูลจาก log จริงตรวจซ้ำ

กราฟโอกาส failsafe หลอกต่อเที่ยวบิน 30 นาทีบนสเกลลอการิทึม เทียบกับ timeout 1 ถึง 10 heartbeat สามเส้น p เท่ากับ 0.1 สีฟ้าลดลงเร็วที่สุด p เท่ากับ 0.2 สีทอง และ p เท่ากับ 0.3 สีชมพูลดลงช้าที่สุด ทุกเส้นเริ่มใกล้ 1 ที่ timeout ต่ำ
ภาพที่ 2 โอกาส failsafe หลอกตาม timeout และอัตราแพ็กเก็ตหาย

ปฏิบัติการประจำโมดูล

ปฏิบัติการ: ตัดและต่อลิงก์ใน SITL (L10)

  1. เปิด SITL และ GCS บันทึกค่าพารามิเตอร์ failsafe ทั้งหมดก่อนเริ่ม
  2. เปิด GCS failsafe ด้วยการกระทำที่ทีมเลือก ตั้ง timeout ตามการคำนวณ
  3. หยุด forwarding ของ MAVProxy บันทึกเวลาที่หยุดและเวลาที่โหมดเปลี่ยน
  4. ต่อกลับแล้วบันทึกพฤติกรรม เทียบกับโค้ดตัวอย่างที่ 1
  5. แยกผลของ telemetry loss, GCS failsafe และ RC loss ในรายงาน

ข้อผิดพลาดที่พบบ่อย

ระวัง

  • คิดว่า failsafe เปิดอยู่แล้วโดยค่าเริ่มต้น
  • ตั้ง timeout สั้นเกิน จนกลับฐานบ่อย
  • ตั้ง timeout ยาวเกิน โดยไม่คิดระยะที่บินต่อ
  • ไม่ทดสอบ failsafe ในการจำลองก่อน
  • ใช้ค่าเริ่มต้นจากเอกสารโดยไม่ตรวจเฟิร์มแวร์จริง

สรุป

  • telemetry loss, GCS failsafe และ RC loss เป็นคนละเหตุการณ์ ต้องตั้งค่าแยก
  • ArduPilot: FS_GCS_TIMEOUT 5 s แต่ FS_GCS_ENABLE ปิดโดยค่าเริ่มต้น · PX4: COM_DL_LOSS_T 10 s กับ NAV_DLL_ACT ปิดโดยค่าเริ่มต้น
  • state machine ลิงก์ใช้อายุของ heartbeat ล่าสุดกำหนดสถานะ
  • เลือก timeout จากโอกาส failsafe หลอกและระยะที่บินต่อเมื่อขาดจริง

แบบฝึกตรวจความเข้าใจ

  1. คู่มือ MAVLink บอกว่าบนลิงก์วิทยุมักถือว่าหลุดเมื่อใด
  2. heartbeat หายด้วยโอกาส 0.1 โอกาสหายติดกัน 3 ครั้งในช่วงหนึ่งเท่าใด
  3. ทำไมโอกาส failsafe หลอกต่อเที่ยวบินจึงสูงกว่า มาก
  4. FS_GCS_ENABLE ของ ArduPilot มีค่าเริ่มต้นอะไร
  5. โดรนบิน 20 m/s ตั้ง timeout 10 s เมื่อลิงก์ขาดจริงจะบินต่อไปอีกเท่าใดก่อนเริ่ม failsafe
เฉลย
  1. เมื่อขาด heartbeat 4–5 ข้อความ (ที่ 1 Hz)
  2. เที่ยวบินมีหลายพันช่วงเวลา แต่ละช่วงเป็นโอกาสให้เกิดได้
  3. 0 คือปิด
  4. m

สรุปสูตรสำคัญ

โอกาสขาดติดกัน N ครั้งในครั้งเดียว
เวลาจนประกาศลิงก์หลุด

แหล่งอ้างอิงหลัก

  1. MAVLink Development Team. Heartbeat/connection protocol. MAVLink developer guide. link
  2. ArduPilot Dev Team. GCS failsafe. ArduPilot Copter documentation. link
  3. ArduPilot Dev Team. Radio failsafe. ArduPilot Copter documentation. link
  4. PX4 Autopilot. Safety configuration (failsafes). PX4 user guide (main). link
  5. RTCA. (2023). Guidance material: Lost C2 link procedures (DO-400). link

อ่านเพิ่มเติม

ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล

ในชั้นเรียน / ภาคสนาม

ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย

หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz

แบบทดสอบประจำโมดูล

แบบทดสอบนี้ใช้ตรวจความเข้าใจ (formative) ไม่ใช่การสอบเก็บคะแนน

โดเมนความรู้: การสื่อสาร เครือข่าย และ IoT