# เตรียมข้อมูลภาพกับ IMU ก่อนทดลอง VIO

ชุดนี้เป็นแบบฝึกตรวจข้อมูลเข้า ยังไม่ได้รัน OpenVINS เพื่อประมาณตำแหน่ง และไม่มีผลความแม่นยำหรือผลทดสอบการบิน รอบนี้พบไฟล์กำหนด OpenCV/Ceres ใน cached NodeODX แต่ยังไม่พบเส้นทางที่ครบทั้ง compiler, ROS, OpenVINS และข้อมูลภาพกับ IMU ที่พร้อมใช้

## สิ่งที่ทดลองได้ทันที

ดาวน์โหลด `vio-readiness.zip` แล้วอ่าน `README.md` และ `inventory.json` ก่อน ภายในมีภาพสีเทาขนาด 8×6 พิกเซลที่สร้างขึ้นเพื่อทดสอบตัวอ่านข้อมูลเท่านั้น กล้องละ 3 ภาพ, IMU 23 แถว และ calibration สมมติ ห้ามนำค่าชุดนี้ไปตั้งค่ากล้องจริง

หากมี Python/Pillow อยู่แล้ว ใช้ `python validate.py synthetic-fixture` ภายใน sandbox ออฟไลน์ที่จำกัดทรัพยากร หากมี cached Docker image ตามสคริปต์อยู่แล้ว ใช้ `rtk python check_sandbox.py --synthetic-only` เพื่อรันแบบทดสอบสิบกรณีโดยไม่ดาวน์โหลด dependency ดูรายละเอียด sandbox ใน README

ผล `INPUT_CONTRACT_PASS` แปลว่ารูปแบบและความสอดคล้องของข้อมูลผ่านเกณฑ์ชุดฝึก ไม่ได้แปลว่า estimator ทำงาน ส่วน `INPUT_CONTRACT_REJECTED` พร้อม exit code 2 บอกสาเหตุที่ต้องแก้ ทุกผลระบุ `estimator_executed: false`

## ฝึกค้นหาข้อผิดพลาด

1. สำเนาโฟลเดอร์ `synthetic-fixture` เป็นชุดฝึกของตน อ่าน `contract.json`, CSV ของกล้องสองตัวและ IMU คู่กัน
2. ตรวจ timestamp แรก `1403636580000000001` ต้องคงเป็นจำนวนเต็ม nanosecond อย่าแปลงผ่านเลขทศนิยมหรือโปรแกรมที่ปัดหลักท้าย กล้องสองตัวต้องมีเวลาเดียวกันทุกภาพ
3. ลบแถวภาพหนึ่งรายการจากกล้องที่สอง แล้วตรวจอีกครั้ง ต้องถูกปฏิเสธเพราะ stereo จับคู่ไม่ครบ
4. คืนไฟล์เดิม แล้วลบ IMU ช่วงต้นจนเหลือเวลาเริ่มหลังภาพแรก ต้องถูกปฏิเสธเพราะไม่มีข้อมูลครอบคลุมช่วงภาพหลังปรับ time offset
5. ทดลองเปลี่ยนหน่วย gyro เป็น `deg/s` หรือแก้ขนาดภาพใน config ให้ไม่ตรงไฟล์ ต้องถูกปฏิเสธ อย่าแก้เพียงชื่อหน่วยเพื่อให้ผ่าน ข้อมูลจริงต้องแปลงด้วยวิธีที่ถูกต้องและบันทึกที่มา
6. ส่งตารางสั้น ๆ ระบุสิ่งที่เปลี่ยน เหตุผลที่ไม่ผ่าน และวิธีแก้ พร้อมอธิบายว่าทำไมการตรวจรูปแบบยังไม่ยืนยันความถูกต้องของ calibration

## เมื่อต้องใช้ข้อมูลจริง

ต้องมีภาพ stereo ที่มี timestamp, IMU หน่วย rad/s และ m/s², camera intrinsics/distortion, extrinsics และ time offset จากแหล่ง calibration ที่ตรงกับชุดข้อมูล ใช้ `T_imu_cam` ในทิศ camera → IMU และ `t_imu = t_camera + offset` อย่างชัดเจน ไม่เดาเมทริกซ์หรือกำหนด offset เป็นศูนย์เพียงเพราะยังไม่รู้ค่า

JSON ในชุดฝึกเป็นสัญญารูปแบบสำหรับตรวจข้อมูล ไม่ใช่ไฟล์ตั้งค่า OpenVINS การอ่าน YAML และความถูกต้องเชิงกายภาพต้องตรวจแยก แบบฝึกรองรับ PNG สีเทา 8 บิตและ pinhole/radtan เท่านั้น จำกัดภาพกล้องละ 600 ภาพ/30 วินาที, IMU 10,000 แถวและช่องว่างสูงสุด 20 ms เงื่อนไขเหล่านี้เป็นเพดานของแบบฝึก ไม่ใช่เกณฑ์รับรอง VIO ทั่วไป

trajectory จาก evo ที่มีอยู่เดิมไม่มีภาพและ IMU จึงถูกปฏิเสธโดยตัวตรวจนี้ ผลทดสอบสิบกรณีที่แนบเป็นการตรวจตัวอ่านข้อมูล ไม่ใช่ผลจากเซนเซอร์จริง ดู `test-result.json`

ขั้นถัดไปที่ยังรอ: runtime ROS1/OpenVINS ที่จัดเตรียมและตรึงเวอร์ชัน, bag ของ [EuRoC จากเจ้าของข้อมูล](https://projects.asl.ethz.ch/datasets/euroc-mav/) พร้อม calibration ที่ตรงกัน และ sandbox ที่เหมาะสม README มีคำสั่ง official serial replay แบบจำกัด 30 วินาทีสำหรับใช้หลังเงื่อนไขครบ ห้ามส่ง groundtruth เข้า estimator เพื่อแอบช่วยเริ่มต้นแล้วเรียกผลว่าเป็นการประมาณอิสระ และห้ามใช้ `run_simulation` แทนหลักฐาน replay ภาพจริง
