# เฉลยเหตุและเวลาใน SITL

ข้อมูลจากผลเก่าบนArduCopter4.7.1quadSITLวันที่1ตุลาคม2026หนึ่งrunต่อกรณี รอบนี้ไม่มีrun/build/analyzerใหม่ ทุกindexนับarrayจาก1 ไม่ใช่บรรทัดไฟล์ คำตอบไม่รับรองการบินจริง

## S1 · protocolและread-back

สองrunมีPARAM_VALUEที่อ่านกลับตรงFS_GCS_ENABLE5/FS_GCS_TIMEOUT5/FS_OPTIONS0/ARMING_SKIPCHK0/MAV_GCS_SYSID255 ในtraceindex56/57/58/60/62ตามลำดับทั้งสองcase ข้อมูลparametersของrunตรงด้วย การอ่านกลับสนับสนุนค่าที่ใช้ในrun ไม่ได้ทำให้เป็นค่าที่แนะนำสำหรับลำจริง ค่า5เลือกAlwaysLandในprotocolนี้ การตอบสนองยังสัมพันธ์กับรุ่น/parameters/สถานะ ตาม[ArduPilot GCS Failsafe](https://ardupilot.org/copter/docs/gcs-failsafe.html)

## S2 · แยกartifactที่buildกับartifactที่run

ทั้งสองrun binary_sha256=011627d41dd95640c3aca02d45283474be48721c8b1bb7a4b234d38b69063482ตรงprotocolofficialprebuilt ส่วนsourcebuildbinarySHA=e41db6bb7f01070b9c4749441b584f2a9a9deab86943de5db61704d7ffe136acต่างกัน sourceCommit/tagรุ่นเดียวกันไม่ทำให้binarybytesเหมือนกัน ผลbuildผ่านจึงไม่ใช่ผลว่ารันทดลองด้วยbinaryที่buildเอง ผลนี้เป็นLinuxSITL ไม่ใช่STM32targetbuild/upload

## S3 · อ่านตำแหน่งการบันทึกก่อนหาความหน่วง

baselinetraceindex1305 ACKcommand176/result0ที่59.906171s; runner command(176,1,9)รอACKที่ตรงและacceptedก่อนคืนแล้วจึงeventland_command59.906187s จากนั้นอ่านHEARTBEATmode9จึงeventland59.906242s ดังนั้นB1=0.000055s=55usเป็นช่องว่างของhosteventsหลังACK ไม่ใช่เวลาส่งคำสั่งถึงmodeจริง ไม่มีsendtimestampหรือinternalmodechangetimestampในคู่นี้ acceptedหมายถึงรับคำสั่งไปดำเนินการ ยังไม่ใช่การทำงานเสร็จ ตาม[MAVLink Command Protocol](https://mavlink.io/en/services/command.html)

## S4 · เลือกboundaryให้ตรงคำถาม

G1=64.711191−60.031862=4.679329sหลังโปรแกรมหยุดส่ง G2=64.711191−59.635100=5.076091sหลังhostส่งheartbeatสุดท้าย G3=60.031862−59.635100=0.396762sขอบต่างกัน จึงG1+G3=G2 ผลเดิมปัดG1เป็น4.679s Timeout5sอ้างheartbeatที่firmwareรับครั้งสุดท้าย ไม่ใช่จุดตั้งsend_heartbeats=Falseของhost และทั้งสองสมการมีhostobservation/scheduler/telemetry จึงไม่รับรองexactinternaldeadlineหรือเวลารับheartbeatจริง

## S5 · ลำดับtelemetryไม่ใช่ลำดับเหตุภายใน

gcs-lossไม่มีland_commandeventในeventsเต็ม พบLAND64.711191sและfailsafe_text64.711244s จึงG4=0.000053s=53us แต่ไม่แปลว่าต้นเหตุfailsafeภายในเกิดหลังการเข้าLAND หลักฐานประกอบคือprotocolหยุดheartbeat/ไม่มีbranchสั่งLANDและSTATUSTEXTGCSFailsafeร่วมกับHEARTBEATmode/armed ไม่ใช้ข้อความเดียวหรือtimestampเดียวสรุปเหตุ ภายในreceive()runnerบันทึกtraceก่อนevent:STATUSTEXTtraceindex1412เป็น64.711243s ขณะที่eventเป็น64.711244sห่าง1us ไม่ใช่สองfailsafe การปัด6ทศนิยมไม่รับรองresolution/accuracyระดับus ไม่มีinternaltriggertimestamp

## S6 · แปลงหน่วยไม่เท่ากับsyncclock

58939ms=58.939sเป็นlast_observed_boot_msที่runnerจำจากmessageล่าสุด ไม่ใช่clockอ่านพร้อมheartbeat_stop60.031862s hosttเป็นmonotonicelapsedของrun ส่วนbootmsเป็นfirmwareclock จึงไม่ลบเพื่อหาlatency แม้หน่วยsเหมือนกัน ยังไม่มีmapping/offset/drift/จุดวัดเดียวกัน หลักฐานนี้ไม่ยืนยันMCUtimingบนบอร์ดจริง

## S7 · mode ACK และdisarmเป็นคนละหลักฐาน

B2=73.194264−59.906242=13.288022s G5=82.132064−64.711191=17.420873s เป็นobservedLAND→observeddisarmedในแต่ละrun ต้องอ่านHEARTBEATmode9/armedtrueแล้วmode9/armedfalseประกอบ ไม่ใช้ACKacceptedแทนลงเสร็จ และไม่ใช้ความต่าง4.132851sสรุปว่าทุกfailsafelandช้ากว่าคำสั่งปกติ เพราะมีเพียงrunละครั้ง สภาพแบบจำลองและเวลาเริ่มต่างกัน ยังไม่มีการทดลองซ้ำ/บอร์ด/การบินจริง

## S8 · รายงานและแผนต่อยอด

ตัวอย่างข้อสรุป:baselineมีACK176acceptedและland_commandก่อนobservedLAND/disarm; gcs-lossหยุดheartbeatและพบmodeLAND/ข้อความGCSFailsafe/disarmโดยeventsเต็มไม่มีland_command อ้างsourcearrayindex+SHAและบอกว่าเป็นผลเก่า1run/case ค่าที่คำนวณคือhostinterval ไม่ใช่internaltriggertime ขอบunknownรวมclockmapping/captureครบ/บอร์ดจริงและGCSrecovery

แผนคำถามต่อยอดที่ยังไม่รัน:เมื่อheartbeatกลับมาหลังเข้าLANDmodeมีอะไรเกิดขึ้น เลือกbaseline/ตัวแปรเดียว กำหนดเวลาส่งกลับด้วยhostclock เก็บGCS_SENT/ACK/HEARTBEATmode-armed/STATUSTEXTและparameterread-back แยกคำสั่งผู้ทดสอบก่อนรันในenvironmentแยกตามคู่มือเดิม ไม่เขียนผลว่ากลับGUIDEDเองแล้ว [เอกสารArduPilot](https://ardupilot.org/copter/docs/gcs-failsafe.html)อธิบายว่าการเชื่อมต่อกลับไม่ทำให้กลับmodeเดิมโดยอัตโนมัติ แต่สองrunนี้ไม่มีการทดลองrecoveryและไม่รับรองผลเพิ่ม

## เกณฑ์ตรวจตนเองที่เสนอ

ข้อละ2คำตอบ1+เหตุผล/หน่วย/ขอบ1รวม16 S1read-back/ขอบ S2binaryartifact S3ACK/ตำแหน่งevent S4สามboundary S5telemetry/causalorder S6clock S7disarm/หนึ่งrun S8อ้างหลักฐาน/แผนnot-run ไม่แทนrubricกิจกรรมSimเดิม ไม่ใช่ผลผู้เรียนหรือรับรองพร้อมบิน
