เหตุ link ขาดหายและ failsafe
UAT 207 ระบบสื่อสารและเครือข่ายข้อมูล
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- แยกการขาดของ telemetry, GCS failsafe และ RC failsafe
- อธิบายพารามิเตอร์ failsafe ของ ArduPilot และ PX4 และค่าเริ่มต้นที่ต้องตรวจ
- สร้าง state machine สถานะลิงก์จากเวลาที่รับ heartbeat
- เลือกค่า timeout โดยคำนวณโอกาส failsafe หลอกจากอัตราแพ็กเก็ตหาย
ทำไมต้องรู้
ลิงก์ขาดเป็นเหตุที่เกิดบ่อยที่สุดอย่างหนึ่งในการบิน และระบบต้องตัดสินใจเองว่าจะทำอะไร ถ้าตั้งไว้ไวเกิน โดรนจะกลับฐานกลางภารกิจทุกครั้งที่สัญญาณสะดุด ถ้าตั้งไว้ช้าเกิน โดรนจะบินต่อไปโดยไม่มีใครควบคุมได้ ปฏิบัติการ 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_VALUE975 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 ว่าโหมดเปลี่ยนอย่างไร
เลือก 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 จริงตรวจซ้ำ
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ตัดและต่อลิงก์ใน SITL (L10)
- เปิด SITL และ GCS บันทึกค่าพารามิเตอร์ failsafe ทั้งหมดก่อนเริ่ม
- เปิด GCS failsafe ด้วยการกระทำที่ทีมเลือก ตั้ง timeout ตามการคำนวณ
- หยุด forwarding ของ MAVProxy บันทึกเวลาที่หยุดและเวลาที่โหมดเปลี่ยน
- ต่อกลับแล้วบันทึกพฤติกรรม เทียบกับโค้ดตัวอย่างที่ 1
- แยกผลของ 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 หลอกและระยะที่บินต่อเมื่อขาดจริง
แบบฝึกตรวจความเข้าใจ
- คู่มือ MAVLink บอกว่าบนลิงก์วิทยุมักถือว่าหลุดเมื่อใด
- heartbeat หายด้วยโอกาส 0.1 โอกาสหายติดกัน 3 ครั้งในช่วงหนึ่งเท่าใด
- ทำไมโอกาส failsafe หลอกต่อเที่ยวบินจึงสูงกว่า มาก
- FS_GCS_ENABLE ของ ArduPilot มีค่าเริ่มต้นอะไร
- โดรนบิน 20 m/s ตั้ง timeout 10 s เมื่อลิงก์ขาดจริงจะบินต่อไปอีกเท่าใดก่อนเริ่ม failsafe
เฉลย
- เมื่อขาด heartbeat 4–5 ข้อความ (ที่ 1 Hz)
- เที่ยวบินมีหลายพันช่วงเวลา แต่ละช่วงเป็นโอกาสให้เกิดได้
- 0 คือปิด
- m
สรุปสูตรสำคัญ
| โอกาสขาดติดกัน N ครั้งในครั้งเดียว | |
| เวลาจนประกาศลิงก์หลุด |
แหล่งอ้างอิงหลัก
- MAVLink Development Team. Heartbeat/connection protocol. MAVLink developer guide. link
- ArduPilot Dev Team. GCS failsafe. ArduPilot Copter documentation. link
- ArduPilot Dev Team. Radio failsafe. ArduPilot Copter documentation. link
- PX4 Autopilot. Safety configuration (failsafes). PX4 user guide (main). link
- RTCA. (2023). Guidance material: Lost C2 link procedures (DO-400). link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz