# SITL: มี heartbeat แต่ไม่มี GPS/EKF ควรตรวจอะไร

ตรวจจริงบน Ubuntu/WSL กับ ArduCopter 4.7.1 เมื่อ 28 กันยายน 2026 ใช้ network namespace ที่มีเฉพาะ loopback ไม่เชื่อมฮาร์ดแวร์ ขั้นตอนนี้ไม่ใช่คู่มือเปลี่ยนค่าโดรนจริง

## 1. แยกการเชื่อมต่อออกจากการรับข้อมูล

HEARTBEAT บอกว่าโปรแกรมตอบสนอง BOOT → STANDBY ไม่ได้ยืนยันว่ารับ GPS/EKF แล้ว รอบรับอย่างเดียว 40 วินาทีได้ heartbeat แต่ไม่มีข้อมูลสองชนิดนี้ การรอต่อโดยไม่ตรวจ stream จึงไม่ได้แก้สาเหตุ

## 2. ขอข้อความตามวิธีทางการ

หลังเชื่อมต่อกับ SITL ที่ยืนยันว่าแยกจากเครือข่ายจริง ใช้ MAV_CMD_SET_MESSAGE_INTERVAL (command 511) ผ่าน COMMAND_LONG:

| ข้อความ | param1: message ID | param2: interval หน่วย microseconds |
|---|---:|---:|
| GPS_RAW_INT | 24 | 1000000 |
| EKF_STATUS_REPORT | 193 | 1000000 |
| SYS_STATUS | 1 | 1000000 |

หนึ่งล้าน microseconds คือ 1 วินาที จึงขอ 1 Hz พารามิเตอร์ที่เหลือใช้ 0 ตามรอบนี้ ตรวจ COMMAND_ACK ของแต่ละคำขอ ต้องเป็น ACCEPTED (result 0) และต้องได้รับข้อความจริงด้วย ACK เพียงอย่างเดียวไม่ยืนยันเนื้อหาข้อมูล

รอบนี้ส่งจาก system/component 255/190 ไปยัง SITL 1/1 บน TCP 127.0.0.1:5760 ภายใน namespace เท่านั้น ค่า ID และ endpoint เหล่านี้เป็นของการทดลองนี้ ไม่ใช้เดาสำหรับอุปกรณ์อื่น

## 3. อ่านสาเหตุที่ pre-arm ยังไม่ผ่าน

หลังขอ stream พบ `PreArm: Motors: Check frame class and type` การเรียก executable โดยตรงพร้อม `--model quad` ในรอบเดิมยังไม่ได้โหลด defaults แบบที่เครื่องมือ sim_vehicle ใช้

ซอร์ส ArduPilot tag `Copter-4.7.1` ระบุให้ quad ใช้ `Tools/autotest/default_params/copter.parm` ไฟล์นี้กำหนด FRAME_CLASS=1 และ FRAME_TYPE=0 พร้อมค่าจำลองอื่น เราทดลองใน working directory ชั่วคราวใหม่ โดยเพิ่ม `--defaults <path-to-copter.parm>` ลงในคำสั่งเริ่ม SITL ไม่เปลี่ยนการตั้งค่าเครื่อง ไม่ปิด pre-arm checks และไม่ใช้ไฟล์นี้ปรับอุปกรณ์จริง

## 4. ตรวจผลหลายชั้น

- GPS_RAW_INT ท้ายรอบ: fix_type=6 (RTK fixed ที่ simulator รายงาน), satellites_visible=10 ทั้งหมดเป็นข้อมูลจำลอง
- EKF_STATUS_REPORT flags=167 = 1+2+4+32+128 แสดงบิต attitude, horizontal velocity, vertical velocity, absolute vertical position และ constant-position mode บิต 128 ไม่ใช่บิตยืนยันตำแหน่งแนวราบ จึงยังไม่ใช้ผลนี้รับรองการนำทางตาม waypoint
- SYS_STATUS: ตรวจบิต `MAV_SYS_STATUS_PREARM_CHECK` (268435456) ใน present, enabled และ health เป็นจริง ไม่ตัดสินจากการไม่มีข้อความผิดพลาดอย่างเดียว
- HEARTBEAT ทุกข้อความยังไม่ armed ไม่ได้ทดสอบ mission upload, arm, takeoff หรือบิน

หลังให้ระบบเริ่มต้นครบช่วงสังเกต 90 วินาที พบ EKF3 IMU0/IMU1 is using GPS และ flags=831 ต่อเนื่อง 5 ตัวอย่างท้าย (1+2+4+8+16+32+256+512) ไม่มีบิต constant-position 128 เกณฑ์นี้อ้างบิตที่ `wait_ekf_happy(require_absolute=True)` ใช้ในชุดทดสอบทางการ แต่ไม่ได้อ้างว่ารันชุด AutoTest ทั้งชุดผ่าน

นี่เป็นผลตรวจสภาพจำลอง ณ ช่วงสังเกต 90 วินาที ไม่ใช่ใบรับรองความปลอดภัย การบินจริง หรือความแม่นยำของแบบจำลอง

## แหล่งทางการ

- https://ardupilot.org/dev/docs/mavlink-requesting-data.html
- https://ardupilot.org/copter/docs/common-prearm-safety-checks.html
- https://github.com/ArduPilot/ardupilot/blob/Copter-4.7.1/Tools/autotest/pysim/vehicleinfo.py
- https://github.com/ArduPilot/ardupilot/blob/Copter-4.7.1/Tools/autotest/default_params/copter.parm
- https://mavlink.io/en/messages/common.html
- https://mavlink.io/en/messages/ardupilotmega.html#EKF_STATUS_FLAGS

หลักฐานก่อน–หลัง: `/downloads/projects/sitl-telemetry-fix-2026-09-28.json` มี hash binary/defaults และข้อมูลที่ได้รับจริง

แหล่งเกณฑ์ EKF: https://github.com/ArduPilot/ardupilot/blob/Copter-4.7.1/Tools/autotest/vehicle_test_suite.py (wait_ekf_happy)
