เริ่มตัวอย่างผลต่างมุม · กลับบท Complementary Filter
อ่านต่อ บทมุมต่อเนื่องและอัตราหมุนจาก Log เพื่อฝึกสะสมมุมและตรวจช่วงเวลาจริง
วัตถุประสงค์และพื้นฐานที่ใช้
ฝึกแยก ตัวเลขมุมที่แสดง จาก ทิศเดียวกันบนวงกลม แล้วเลือกวิธีหาผลต่างที่ไม่กระโดดเพราะข้ามขอบช่วง ใช้เครื่องคิดเลข PC หรือกระดาษ ไม่ต้องมีบอร์ด อ่าน หน่วยและการผสาน IMU ก่อนทำ เหมาะกับการอ่าน log หรือเตรียมโจทย์หนึ่งแกน ยังไม่ใช่ estimator ท่าทางโดรนสามมิติ
ภาพเสมือนจริงต้นบทสร้างด้วย AI เป็นอุปกรณ์สาธิตเชิงแนวคิด ไม่ใช่ผลทดลอง มุมทั้งหมดในชุดนี้สมมติขึ้น ไม่มีข้อมูลวัด IMU หรือมุมจริงสำหรับประเมินความแม่นยำ
ช่วงมุมเป็นข้อตกลงในการแสดงค่า
ทิศ 181° กับ −179° ต่างกันหนึ่งรอบเต็ม จึงชี้ทิศเดียวกัน บทนี้ใช้หน่วย degree และช่วง [−180°, 180°) รวม −180° แต่ไม่รวม +180° นิยามสำหรับค่าจำกัดที่เป็นตัวเลข:
wrap(x) = x − 360 × floor((x + 180) / 360)
floor คือปัดลง เช่น floor(−0.1) = −1 ไม่ใช่ตัดทศนิยมเข้าหาศูนย์: wrap(181) = −179, wrap(−181) = 179 และ wrap(180) = −180 ถ้าเขียนโค้ดภายหลัง ต้องตรวจหน่วย ช่วงปลายและพฤติกรรม remainder ของภาษา ไม่คัดลอกสูตร % โดยไม่ทดสอบค่าติดลบ
ซอร์ส ROS angles อธิบายการ normalize และหาผลต่างเส้นทางสั้น ด้วย radian แนวคิดนำมาเทียบได้ แต่บทนี้เลือกช่วง degree เอง โดยจุดตรงข้ามเลือก −180° เป็นตัวแทน; ซอร์สนั้นเลือก +π ที่ขอบ ไม่ถือว่าเครื่องหมายที่ขอบยืนยันทิศหมุนจริง
คำนวณผลต่างมุมและอ่านกรณีตรงข้าม
ให้ a เป็นมุมเริ่ม b เป็นมุมปลาย ใช้แกน จุดศูนย์และทิศบวกเดียวกัน ผลต่างตรง = b − a; ผลต่างเส้นทางสั้น = wrap(b − a) ตารางนี้ไม่มีเวลาระหว่าง sample จึงคำนวณอัตราหมุนหรือเส้นทางการเคลื่อนที่จริงไม่ได้
| a → b (°) | ผลต่างตรง (°) | เส้นทางสั้น (°) |
|---|---|---|
| 179 → -179 | -358 | 2 |
| -179 → 179 | 358 | -2 |
| 170 → -170 | -340 | 20 |
| 0 → 180 | 180 | -180 · สองทางเท่ากัน |
| 350 → 10 | -340 | 20 |
179° → −179°: b − a = −358°; floor((−358 + 180)/360) = −1 จึงได้ −358 − 360×(−1) = +2° ตรวจย้อน: wrap(179 + 2) = −179 ทิศปลายตรงกับ b ส่วน −179° → 179° ได้ −2° ตามลำดับจาก→ไป
0° → 180° มีเส้นทาง +180° และ −180° ยาวเท่ากัน สูตรเลือก −180° เพื่อให้ผลอยู่ในช่วงที่ประกาศเท่านั้น หากต้องตัดสินทิศหมุน ต้องมีบริบทการเคลื่อนที่หรือกติกาเพิ่มเติม บทนี้ไม่ประกาศว่าค่า −180° คือทิศจริง
สร้างด้วย Matplotlib จากโจทย์สมมติ วงกลมคณิตศาสตร์ใช้ทิศบวกทวนเข็มในระนาบภาพ ไม่ใช่ผังแกน body FRD เปิดไดอะแกรมมุมข้ามขอบขนาดเต็ม
ปรับมุมตามผลต่างสั้นก่อน normalize
การนำมุม 179° กับ −179° มาเฉลี่ยตรง ๆ จะได้ 0° ซึ่งอยู่คนละด้านของวงกลม ถ้าต้องการขยับจาก prediction ไปทาง observation ในแบบจำลองหนึ่งแกน ให้กำหนด beta = น้ำหนักการปรับ ในช่วง 0 ≤ beta ≤ 1 แล้วคำนวณ:
innovation = wrap(observation − prediction)estimate = wrap(prediction + beta × innovation)
โจทย์กำหนด prediction = 179°, observation = −179°, beta = 0.1 เพื่อฝึก ได้ innovation = +2° และ estimate = 179.2° แต่การผสานตัวเลขตรง 0.9×179 + 0.1×(−179) ได้ 143.2° เมื่อ beta = 0.5 วิธีผลต่างสั้นได้ wrap(180) = −180°; beta = 0 อยู่ที่ prediction และ beta = 1 ไปยัง observation ที่ normalize แล้ว
beta นี้ตรงกับ 1 − alpha ในสูตรผสานของบทก่อนเฉพาะความหมายของน้ำหนัก ไม่ใช่ค่าจูนการบิน และวิธีนี้เลือกเส้นทางสั้นระหว่างทิศหนึ่งแกน ไม่ใช่การเฉลี่ย vector แบบทั่วไปหรือการผสาน quaternion กรณีตรงข้ามยังต้องมีกติกาเลือกทางเอง การ wrap ไม่แก้ bias, แรงแทรก, timestamp ผิด หรือการสลับแกน
ค่าเฉลี่ยทิศกับเส้นทางตามเวลาเป็นคนละเรื่อง
ค่าเฉลี่ยทิศหลายตัวอาจใช้ sin/cos: แปลง degree เป็น radian ก่อนหา S = ค่าเฉลี่ย sin และ C = ค่าเฉลี่ย cos แล้วหา atan2(S,C) ตัวอย่าง 179° และ −179° ให้อยู่ใกล้ทิศ 180° ต่างจากค่าเฉลี่ยตัวเลข 0° อ่านนิยามใน SciPy circular mean ถ้า vector เฉลี่ยเป็นศูนย์ เช่นทิศ 0° และ 180° ที่มีน้ำหนักเท่ากัน ไม่มีทิศเฉลี่ยที่เลือกได้เพียงค่าเดียว ค่าใดที่ library คืนมาในกรณีนั้นไม่ใช่หลักฐานทิศทาง ต้องตรวจกรณีใกล้ศูนย์ด้วยเกณฑ์ที่เหมาะกับข้อมูล
การ normalize ทำให้มุมอยู่ในช่วง แต่ไม่เก็บจำนวนรอบที่หมุนผ่าน ส่วน unwrap ตามลำดับเวลาต้องมีสมมติฐานการเปลี่ยนมุมระหว่าง sample เช่นน้อยกว่า 180° ในขนาดสัมบูรณ์ ถ้าขาดข้อมูลหรือหมุนเร็วกว่านั้น ทิศปลายเดียวกันอาจมาจากหลายเส้นทางได้ อย่าใช้ผลต่างสั้นแทนการเคลื่อนที่จริงโดยไม่มีหลักฐานเวลาและอัตราหมุน
ขั้นตอนฝึกและคำแนะนำเบื้องต้น
- อ่าน คู่มือชุดมุมข้ามขอบ แล้วทำสำเนา ใบวางแผนมุมว่าง เขียนหน่วย ช่วงมุม จุดศูนย์ แกนและทิศบวก
- ทำ โจทย์ผลต่างและการผสานมุม ก่อนเปิด เฉลยมุมข้ามขอบ ตรวจ wrap(a + delta) ว่าตรงกับ wrap(b) ทุกแถว
- เปลี่ยน beta ทีละค่าและบอกความหมายของผล ก่อนนำไปเทียบ สามรอบ Complementary Filter เดิม ชุดเดิมไม่ข้ามขอบ จึงคงสมการและเฉลยเดิมไว้
- ถ้าข้อมูลมาเป็นลำดับเวลา ให้อ่าน การตรวจอายุข้อมูล ประกอบ ระบุสิ่งที่ยังไม่รู้เกี่ยวกับ sample ที่ขาดและจำนวนรอบ
- ก่อนใช้ข้อมูลจากบอร์ดจริง ตรวจ driver/config และกรอบ sensor→body ผลหนึ่งแกนไม่อธิบาย Euler สามแกนทุกท่า และ accelerometer เพียงอย่างเดียวไม่ให้ yaw อ้างอิงโลก
คำแนะนำเริ่มต้น: ทดสอบค่าบวก ค่าติดลบ หลายรอบและจุดตรงข้าม บันทึกว่าจุดใดเป็นข้อตกลงของสูตรและจุดใดมาจากข้อมูลจริง ไม่ใช้ความเรียบของกราฟยืนยันว่าค่าเซนเซอร์ถูกต้อง ชุดนี้ไม่มีคะแนนหรือสถานะผ่านใหม่ในแบบประเมินเดิม
ตัวเลขและแหล่งอ้างอิงของชุดมุม · รายการแฮชชุดมุม · กลับภาพรวม MCU