# ภารกิจสำรวจจำลองและการอ่าน log

ชุดฝึก Drone-Hub วันที่ 7 กันยายน 2569 เริ่มบน PC ด้วย Python 3.10 ขึ้นไป ไม่มีแพ็กเกจเพิ่ม Windows ใช้ `python`; Linux ใช้ `python3` แตก ZIP และเปิด terminal ในโฟลเดอร์นี้

## แบบจำลองที่รันได้ทันที

`mission.json` เป็นเส้นทางสมมติในพิกัดตะวันออก/เหนือ/ขึ้น หน่วยเมตร เริ่มที่ `[0,0,0]` ขึ้นสูง 20 m สำรวจแนวสลับทิศช่วง 40×30 m กลับต้นทางและลดระดับ ความเร็วทุกแนวรวมถึงขึ้น/ลง 5 m/s

```console
python simulate.py
```

ได้ `output/synthetic-flight.csv` (เวลา จุดเป้าหมาย east/north/up), `output/summary.json` และ `output/survey-sitl-only.waypoints` เปิด CSV ด้วย spreadsheet แล้ววาดกราฟ east เทียบ north ควรเห็นแนวสำรวจสลับทิศ 4 แนว ข้อมูลค่าเริ่มต้นต้องได้ระยะ 260 m, เวลา 52 s, 53 แถวตัวอย่าง และ `landed_at_origin: true`

โปรแกรมนี้คำนวณตำแหน่งเชิงเส้นตามเวลาเท่านั้น ไม่จำลองแรง ลม แบตเตอรี่ การเลี้ยว sensor หรือ flight controller ตัวเลขใน CSV สร้างโดยโปรแกรม ไม่ใช่ log จากโดรนหรือ ArduPilot SITL ระยะเวลาจึงไม่ใช้ประมาณเวลาบินจริง

ทดลองแก้ `speed_m_s` เป็น 2.5 แล้วรันใหม่ เวลาต้องเพิ่มเป็น 104 s โดยระยะยังเป็น 260 m จากนั้นคืนเป็น 5 ทดสอบค่าศูนย์ควรได้รับ error เพราะความเร็วต้องมากกว่า 0 สร้างสำเนา JSON แล้วใช้ `python simulate.py --mission my-mission.json` หากต้องการเก็บโจทย์เดิม

คำสั่งนี้สร้างทั้ง CSV และ waypoint จึงรับเฉพาะเส้นทางครบภารกิจ: อย่างน้อย 3 จุด เริ่ม `[0,0,0]`, จุดถัดไปขึ้นแนวดิ่ง `[0,0,ความสูงมากกว่า 0]`, จุดระหว่างทางทั้งหมดอยู่เหนือพื้น และจุดสุดท้ายมีความสูง 0 โดย XY ตรงกับจุดก่อนหน้าเพื่อให้ลงแนวดิ่ง จะลงที่ต้นทางหรือจุดอื่นก็ได้ เส้นทาง 2 จุดหรือเส้นทางที่จบกลางอากาศ เช่น `[40,0,20]` จะถูกปฏิเสธพร้อมข้อความ `SITL export requires...` โดยไม่เขียนทับผลเก่า ผลที่มีอยู่ใน `output` หลังคำสั่งล้มเหลวจึงยังเป็นของรอบก่อน ไม่ใช่เส้นทางใหม่ ข้อจำกัดนี้ป้องกันคำสั่ง TAKEOFF/LAND ใน waypoint เปลี่ยนความหมายจากเส้นทาง JSON

## ต่อด้วย ArduPilot SITL (ยังไม่ได้รันในรอบนี้)

1. ใช้ Linux หรือ Windows WSL2 ตาม [คู่มือติดตั้ง SITL](https://ardupilot.org/dev/docs/sitl-simulator-software-in-the-loop.html) และ [วิธีใช้](https://ardupilot.org/dev/docs/using-sitl-for-ardupilot-testing.html) ติดตั้งอยู่ในพื้นที่ผู้ใช้ บันทึก commit ArduPilot และรุ่น MAVProxy
2. หลังติดตั้งและ build ตามคู่มือแล้ว เริ่มจากโฟลเดอร์ ArduCopter ของ source checkout:

```console
../Tools/autotest/sim_vehicle.py -v ArduCopter --console --map -L CMAC
```

3. คัดลอกไฟล์ `survey-sitl-only.waypoints` ไป path ที่ MAVProxy เข้าถึงได้ ใน MAVProxy console ใช้ `wp load <absolute-path>/survey-sitl-only.waypoints` แล้ว `wp list` ตรวจบนแผนที่ว่าเส้นทางอยู่บริเวณ CMAC ของ simulator และ altitude เป็น relative-to-home 20 m (ไม่ใช่ระดับน้ำทะเล)
4. ตรวจ vehicle ที่เชื่อมต่อว่าเป็น SITL ที่เพิ่งเปิด ไม่เชื่อม flight controller จริง รอ EKF/GPS พร้อม แล้วจึงใช้ console ควบคุม simulator:

```console
mode GUIDED
arm throttle
takeoff 20
mode AUTO
```

5. สังเกตลำดับ waypoint และการ LAND เก็บ console output, mission ที่ใช้ และ telemetry `.tlog`/DataFlash `.BIN` ที่ simulator สร้างจริงไว้แยกจาก CSV สังเคราะห์ ใช้ MAVExplorer หรือ Mission Planner อ่าน log ตามคู่มือ [MAVProxy log](https://ardupilot.org/mavproxy/docs/getting_started/logfiles.html)

QGC WPL ใช้ [รูปแบบทางการ](https://mavlink.io/en/file_formats/) 12 คอลัมน์คั่นด้วย tab: รายการ 0 เป็น home, ที่เหลือใช้ frame 3 (relative altitude), TAKEOFF 22, WAYPOINT 16 และ LAND 21 จุดยึด CMAC อ้างอิง [locations.txt ของ ArduPilot](https://github.com/ArduPilot/ardupilot/blob/master/Tools/autotest/locations.txt) ใช้เพื่อ simulation เท่านั้น สูตรแปลงเมตรเป็น lat/lon เป็นประมาณการระยะสั้น ห้ามนำไฟล์นี้ไปใช้เป็นภารกิจจริงโดยตรง

## ผลที่คาดและเกณฑ์ส่งงาน

- ขั้น Python: แนบ CSV, summary, กราฟเส้นทาง และผลเปลี่ยนความเร็ว ระบุว่าเป็น kinematic simulation
- ขั้น SITL: ยืนยันใน log จริงว่า mission ถูกโหลด ครบแนวสำรวจและลงจอด ระบุ commit, OS, command, วันที่ และความแตกต่างจากแบบจำลอง Python หากไม่มี log ให้ระบุว่ายังไม่ผ่าน SITL
- ขั้นกล้อง/สำรวจจริงไม่อยู่ในชุดนี้: ไม่ได้คำนวณ GSD, image overlap, terrain clearance หรือทดสอบ geofence

## ถ้าติดขัด

- JSON error: ตรวจ comma/วงเล็บและใช้ตัวเลขในพิกัดทั้งสามแกน
- โปรแกรมแจ้งความเร็ว/เวลาไม่ถูกต้อง: ใช้ค่าจำกัดที่มากกว่า 0; sample period เล็กมากทำให้ log โต
- โปรแกรมแจ้ง `SITL export requires...`: ตรวจจุดขึ้นแนวดิ่งและเพิ่มจุดลงความสูง 0 ใต้จุดสุดท้าย เส้นทางต้องมีอย่างน้อย 3 จุด ไม่ใช้ไฟล์ผลเก่าเป็นผลของรอบที่ล้มเหลว
- `sim_vehicle.py` ไม่พบ: ตรวจว่า build/setup ArduPilot เสร็จและอยู่โฟลเดอร์ ArduCopter คำสั่งนี้ไม่รวมอยู่ใน ZIP
- `wp load` ไม่พบไฟล์ใน WSL: ใช้ path Linux เช่น `/mnt/c/...` ไม่ใช่ `C:\...`
- Arm ไม่ผ่าน: อ่าน pre-arm message และแก้เหตุที่ simulator รายงาน ไม่ปิด safety checks เพื่อให้ผ่าน
- AUTO ไม่เดินภารกิจ: ตรวจ `wp list`, mode, GPS/EKF และ alt frame ใน simulator แล้วเก็บ error ไว้ในแบบ feedback

Source และ fixture ที่สร้างใหม่ในชุดนี้ MIT (`LICENSE.txt`) ArduPilot และ MAVProxy มีใบอนุญาตของตนเอง (GPLv3); ไม่รวม binary ภายนอก เอกสารต้นทางตรวจ 2026-09-07 ไม่มีผลทดลองผู้เรียนจริงในชุดนี้
