กรองมุมให้เรียบกับความหน่วง: ค่าเฉลี่ยเคลื่อนที่ 3 จุด

ภาพแนวคิดโต๊ะเรียนการกรอง มีลูกแก้วสีฟ้าสามช่อง ริบบิ้น นาฬิกา บัตรว่าง โมดูล IMU บอร์ดไมโครคอนโทรลเลอร์และโดรนถอดใบพัด
ภาพจำลองแนวคิดสร้างด้วย AI ไม่ใช่ภาพหน้าจอหรือรุ่นอุปกรณ์ที่ยืนยันการรองรับ

เริ่มตัวอย่างกรองสามจุด · กลับบทมุมตามเวลา

อ่านต่อ บทสะสมมุมจาก Gyro ด้วยเวลาจริง เพื่อฝึก dt ไม่เท่ากันและผลของ offset ที่สะสม

วัตถุประสงค์และพื้นฐานที่ใช้

ฝึกอ่านผลของการกรองก่อนใช้มุมใน MCU: คำนวณค่าเฉลี่ยสามจุด ตรวจ sample ที่ยังไม่ครบ และบอกเวลาอ้างอิงของผลได้ ใช้เครื่องคิดเลข PC หรือกระดาษ ไม่ต้องมีบอร์ด อ่าน มุมต่อเนื่องและอัตราหมุนจาก Log ก่อนทำ

ภาพเสมือนจริงต้นบทสร้างด้วย AI ใช้ลูกแก้วสามช่อง ริบบิ้นและนาฬิกาเป็นสื่อแนวคิด ไม่ใช่อุปกรณ์กรองหรือผลวัด ตัวเลขทั้งหมดสมมติหนึ่งแกน เป็นมุมต่อเนื่องแล้ว ไม่มีมุมจริงให้ประเมินความแม่นยำ และไม่มีการทดลอง IMU หรือรันเฟิร์มแวร์

กำหนดหน้าต่างและช่วงเริ่มต้นให้ชัด

บทนี้ใช้ causal moving average: y[n] = (x[n] + x[n−1] + x[n−2]) / 3 น้ำหนักแต่ละจุดเท่ากับ 1/3 ใช้เฉพาะจุดปัจจุบันและอดีต ไม่ใช้ sample อนาคต กำหนด sample ห่างเท่ากัน 10 ms ใน clock/session เดียว และคำนวณเฉพาะเมื่อมีสามจุดครบ

สองจุดแรกจึง ยังไม่มีค่าเฉลี่ยเต็มหน้าต่าง ไม่ใช่ผลกรองศูนย์ การเติมศูนย์ ใช้ค่าแรกซ้ำ หรือเฉลี่ยเฉพาะจุดที่มี เป็นกติกาเริ่มต้นคนละแบบ ต้องระบุและคำนวณผลใหม่ อย่าใส่ค่าที่ไม่มีเพื่อทำให้กราฟต่อเนื่อง

DSP Guide ของผู้เขียน Steven W. Smith อธิบายการเฉลี่ยหลาย sample และการเลื่อนสัมพันธ์เมื่อใช้จุดด้านเดียว บทนี้กำหนดหน้าต่างย้อนหลังสามจุดและตัวเลขตัวอย่างเอง ไม่ใช้สูตรที่ต้องรออนาคตเป็นผลออนไลน์

คำนวณหกจุดและอ่านเวลาของผล

กำหนด: t เป็นเวลาของ sample หน่วย ms, x/y เป็น degree; ไม่มี gap/reset; ค่า y พร้อมคำนวณได้อย่างเร็วที่สุดเมื่อจุดล่าสุดมาถึง ยังไม่รวมเวลาประมวลผลหรือส่งข้อมูล

Sample (ms) x (°) y เต็ม 3 จุด (°)
0 0 ยังไม่ครบ
10 1.2 ยังไม่ครบ
20 1.8 1
30 3.2 31/15 ≈ 2.066667
40 3.8 44/15 ≈ 2.933333
50 5.2 61/15 ≈ 4.066667

ที่ 20 ms: (0 + 1.2 + 1.8) / 3 = 1° หน้าต่างคือ 0, 10, 20 ms มีจุดกึ่งกลางที่ 10 ms แต่คำนวณผลนี้ได้เมื่อมี sample 20 ms แล้ว จึงห้ามเขียนว่า MCU มีผล 1° พร้อมใช้ตั้งแต่ 10 ms การเลื่อนกราฟไปกึ่งกลางหน้าต่างทำได้เพื่อเปรียบเทียบย้อนหลัง ต้องติดป้ายเวลาให้ชัด

หาอัตราเฉลี่ยของผลต่างโดยใช้ dt = 0.01 s จากคู่จุดจริง ไม่ปัด y ก่อนลบ:

ช่วง (ms) dt (ms) x rate (deg/s) y rate (deg/s)
0→10 10 120 ยังไม่ครบ
10→20 10 60 ยังไม่ครบ
20→30 10 140 320/3 ≈ 106.667
30→40 10 60 260/3 ≈ 86.667
40→50 10 140 340/3 ≈ 113.333

ผลกรองจุดแรกที่ 20 ms ยังไม่มีผลเต็มหน้าต่างก่อนหน้า จึงไม่มี y rate สำหรับช่วง 10→20 ms อัตรา y เป็นผลต่างของ ค่าเฉลี่ยสองหน้าต่าง ไม่ใช่ gyro ทันทีหรือการหมุนจริงที่พิสูจน์แล้ว ตัวเลขดูแกว่งน้อยลงในชุดนี้ไม่ได้พิสูจน์ว่าใกล้มุมจริงขึ้น

กราฟตัวเลขมุมหกจุดเทียบค่าเฉลี่ยสามจุดตามเวลาพร้อมใช้ พร้อมกราฟ step และไดอะแกรมกึ่งกลางหน้าต่างกับเวลาพร้อมคำนวณ

Matplotlib จากตัวเลขสมมติ จุด y วางที่เวลาจุดล่าสุดของหน้าต่าง; เส้นเชื่อมให้อ่านลำดับ ไม่ใช่ waveform ที่วัดระหว่าง sample เปิดกราฟกรองมุมและความหน่วงขนาดเต็ม

Group delay ไม่ใช่เวลารอให้ถึงค่าสุดท้าย

สำหรับ FIR น้ำหนักเท่ากัน N จุดที่สุ่มสม่ำเสมอ ความหน่วงเชิงกลุ่มในย่านที่นิยามได้คือ (N−1)/2 sample กรณี N = 3 จึง 1 sample = 10 ms อ่าน นิยาม group delay ของ SciPy ซึ่งแยกการหน่วงองค์ประกอบความถี่ และระบุว่าค่าที่ความถี่ตรงศูนย์ของ transfer function อาจไม่ถูกนิยาม บทนี้ไม่ได้รัน SciPy

ขยายที่มาของกรณีนี้: H(ω) = (1 + exp(−jω) + exp(−j2ω))/3 = exp(−jω)(1+2cosω)/3 เมื่อ ω เป็น radian/sample ในช่วงที่ตัวประกอบจริงไม่เป็นศูนย์และไม่เปลี่ยนเครื่องหมาย phase มี slope −1 จึงได้ group delay 1 sample ที่ศูนย์ของ H ห้ามอ้าง slope นี้ข้ามจุด phase กระโดด

แยกตัวอย่าง step: x = 0, 0, 0, 3, 3, 3° ที่ t = 0, 10, 20, 30, 40, 50 ms เมื่อเปลี่ยนเป็น 3° ที่ 30 ms ผลเต็มหน้าต่างคือ y ที่ 20, 30, 40, 50 ms = 0, 1, 2, 3° ถึงค่าสุดท้ายที่ 50 ms ห่างจากจุดเปลี่ยน 20 ms กรณีนี้จึงแยก group delay 10 ms, การแทนที่ sample ทั้งหน้าต่าง 20 ms และเวลาประมวลผล/สื่อสารจริงที่โจทย์ยังไม่ทราบ ไม่ใช้เลขหนึ่งแทนอีกเลข

ข้อจำกัดก่อนนำไปใช้กับข้อมูลโดรน

อย่าเฉลี่ยมุมแสดง 179° กับ −179° ตรง ๆ แล้วอ้าง 0° เป็นทิศใกล้เดิม ต้องเลือกวิธีสำหรับมุมและสมมติฐานให้เหมาะ อ่าน มุมข้ามขอบ และ Unwrap ก่อนกรองมุมต่อเนื่อง การเลือกจำนวนรอบที่ผิดไม่ถูกแก้ด้วยการเฉลี่ย

ถ้า sample ห่างไม่เท่ากัน ค่าเฉลี่ยสามตัวเลขยังคำนวณได้ แต่ไม่ใช่แบบจำลอง FIR ที่ช่วงเวลาเท่ากันนี้ และไม่ควรประกาศ delay 10 ms ตายตัว เมื่อเกิด gap/reset ให้บอกว่า window มีข้อมูลใดและเวลาใด ใช้กติกาเริ่มใหม่ที่ประกาศ ไม่สร้างจุดที่ไม่ถูกวัด ตรวจ อายุข้อมูลที่จุดใช้ ประกอบ

การเฉลี่ยไม่ได้แก้ bias คงที่: บวก offset b ทุก x ก็ได้ y เดิมบวก b เพราะผลรวมน้ำหนักเป็น 1 ไม่มี reference จึงไม่มี RMSE หรือหลักฐานความแม่นยำในชุดนี้ และ filter หลังการแปลงเป็นข้อมูลดิจิทัลไม่เรียกคืนข้อมูลที่ alias ไปแล้ว อ่าน อัตราสุ่มและข้อมูลที่ไม่ถูกวัด สำหรับข้อจำกัดก่อนเลือก filter

ขั้นตอนฝึกและคำแนะนำเบื้องต้น

  1. อ่าน คู่มือชุดกรองมุม ทำสำเนา ใบวางแผนกรองมุมว่าง บันทึกแกน หน่วย clock/session และกติกาเริ่มต้น
  2. ทำ โจทย์กรองมุมและความหน่วง เก็บเศษส่วนเต็มไว้จนขั้นสุดท้าย เขียนสมาชิกหน้าต่าง เวลากึ่งกลาง และเวลาพร้อมคำนวณคนละช่อง
  3. เปรียบเทียบตัวอย่าง ramp กับ step ก่อนเปิด เฉลยกรองมุม บอกสิ่งที่สรุปได้จากเลขและสิ่งที่ยังต้องวัดจริง
  4. หากต่อยอดฮาร์ดแวร์ ให้เก็บ input/output/timestamp และ configuration ของ filter เพื่อประเมินผลตามงานจริง ไม่เลือกค่าจูนควบคุมโดรนจากชุดเลขนี้

เริ่มด้วยหน้าต่างเล็กและกติกาชัดเจน อย่าเพิ่มจำนวนจุดเพียงเพื่อให้กราฟสวยขึ้นโดยไม่อ่านผลต่อเวลา ไม่มีคะแนนใหม่ในแบบประเมินเดิม ไม่มีผลวัดหรือ flight tuning ใหม่

ตัวเลขและแหล่งอ้างอิงชุดกรองมุม · รายการแฮชชุดกรองมุม · กลับภาพรวม MCU

moving averagecausal filtergroup delaystep responsetimestampIMU