ทำความเข้าใจ Kalman Filter ด้วยตัวอย่างเรดาร์แบบง่าย
(kalmanfilter.net)- Kalman Filter คือ อัลกอริทึมประมาณค่าสถานะที่เหมาะสมที่สุด สำหรับประเมินสถานะของระบบและคาดการณ์อนาคตในสภาพแวดล้อมที่มีสัญญาณรบกวนสูง
- อธิบายกระบวนการเพิ่มความแม่นยำด้วยการ ทำซ้ำขั้นตอนการคาดการณ์และการอัปเดต โดยใช้ค่าที่วัดได้ของระยะทางและความเร็ว ผ่านตัวอย่างเรดาร์ติดตามเครื่องบิน
- ในแต่ละขั้นตอนจะคำนวณ เวกเตอร์สถานะ, เมทริกซ์โคเวเรียนซ์, Kalman Gain เพื่อรวมค่าที่วัดได้และค่าที่คาดการณ์แบบถ่วงน้ำหนัก
- แสดงเชิงตัวเลขว่าค่า ความคลาดเคลื่อนของการประมาณ (ความไม่แน่นอน) ลดลง เมื่อเวลาผ่านไป โดยพิจารณาทั้งความไม่แน่นอนของการวัดและของแบบจำลองร่วมกัน
- มอบพื้นฐานความเข้าใจที่ช่วยให้ ออกแบบและนำฟิลเตอร์ไปใช้งานได้ด้วยตนเอง ผ่านตัวอย่างเชิงตัวเลขที่เข้าใจง่ายและการคำนวณทีละขั้นตอน
แนะนำ Kalman Filter
-
Kalman Filterคืออัลกอริทึมประมาณค่าสถานะที่ใช้ประเมินและคาดการณ์สถานะของระบบในสภาพแวดล้อมที่มีความไม่แน่นอน เช่น สัญญาณรบกวนจากการวัดหรือปัจจัยภายนอก
- ใช้เป็นเครื่องมือสำคัญในหลายสาขา เช่น การติดตามวัตถุ การนำทาง วิทยาการหุ่นยนต์ และการควบคุม
- ตัวอย่างเช่น ใช้ลด noise ของเส้นทางเมาส์เพื่อให้การเคลื่อนไหวลื่นขึ้น หรือนำไปใช้ตรวจจับแนวโน้มของข้อมูลการเงินและการพยากรณ์อากาศ
- ชี้ให้เห็นว่าสื่อการสอนจำนวนมากเน้นการพิสูจน์ทางคณิตศาสตร์มากเกินไปจนขาดตัวอย่างใช้งานจริง ขณะที่เนื้อหานี้ให้ คำอธิบายเชิงสัญชาตญาณที่เน้นตัวอย่างเชิงตัวเลข
- กล่าวถึงกรณีที่ฟิลเตอร์ออกแบบไม่ดีจนติดตามเป้าหมายล้มเหลว พร้อมเสนอวิธีแก้ไข
- เป้าหมายคือช่วยให้ผู้อ่าน สร้างความเข้าใจจนสามารถออกแบบและนำ Kalman Filter ไปใช้งานได้เอง
เส้นทางการเรียนรู้
- ภาพรวมหน้าเดียว: แนะนำแนวคิดหลักและสมการสำคัญแบบกระชับ โดยต้องมีเพียงความรู้พื้นฐานด้านสถิติและพีชคณิตเชิงเส้น
- เว็บทิวทอเรียลฟรี: ทิวทอเรียลออนไลน์ที่สร้างความเข้าใจแบบเป็นขั้นตอนด้วยตัวอย่างเชิงตัวเลข โดยไม่ต้องมีความรู้ล่วงหน้า
- Kalman Filter from the Ground Up (หนังสือ): มีตัวอย่างเชิงตัวเลขครบถ้วน 14 ตัวอย่าง ครอบคลุมฟิลเตอร์ไม่เชิงเส้น (Extended/Unscented) และการรวมข้อมูลจากหลายเซ็นเซอร์ พร้อมโค้ด Python·MATLAB
ความจำเป็นของการคาดการณ์
- อธิบายความจำเป็นของการประมาณสถานะและการคาดการณ์ผ่าน ตัวอย่างเรดาร์ติดตามเครื่องบิน
- สถานะของระบบคือ ตำแหน่งของเครื่องบิน (ระยะทาง (r)) และเรดาร์คำนวณระยะทางจากเวลาสะท้อนกลับของพัลส์
- ความเร็ว (v) สามารถวัดได้จากปรากฏการณ์ Doppler
- การคาดการณ์ตำแหน่งหลังช่วงเวลา (\Delta t) ทำผ่าน แบบจำลองพลวัต
- ตัวอย่าง: (r_{t_1} = r_{t_0} + v \cdot \Delta t)
- (\Delta t = 5s), (r_{t_0}=10,000m), (v=200m/s) → (r_{t_1}=11,000m)
- ในสภาพแวดล้อมจริงมีทั้งสัญญาณรบกวนจากการวัด (Measurement Noise) และความไม่แน่นอนของแบบจำลอง (Process Noise)
- แม้จะมีเรดาร์หลายตัววัดพร้อมกัน ผลลัพธ์ก็อาจต่างกันเล็กน้อย
- สมมติฐานว่าความเร็วคงที่อาจพังทลายลงได้จากปัจจัยภายนอก เช่น ลม
- Kalman Filter ทำทั้งการประมาณสถานะปัจจุบันและการคาดการณ์สถานะในอนาคตพร้อมกัน และให้ ค่าความไม่แน่นอน (ความแปรปรวน) ของการประมาณแต่ละครั้งควบคู่กัน
- เป็น อัลกอริทึมที่เหมาะสมที่สุด สำหรับลดความไม่แน่นอนของการประมาณสถานะ
ตัวอย่าง Kalman Filter
-
เรดาร์ 1 มิติวัดระยะทาง (r) และความเร็ว (v) ของเครื่องบิน
- เวกเตอร์สถานะ (\boldsymbol{x} = [r, v]^T)
- ใช้เวกเตอร์และเมทริกซ์ในการอธิบายระบบ
-
Iteration 0 — การกำหนดค่าเริ่มต้นและการคาดการณ์
-
การกำหนดค่าเริ่มต้น
- กำหนดค่าเริ่มต้นของฟิลเตอร์ด้วยค่าที่วัดได้ครั้งแรก (\boldsymbol{z}_0 = [10{,}000, 200]^T)
- ความไม่แน่นอนของการวัด (ส่วนเบี่ยงเบนมาตรฐาน): ระยะทาง 4m, ความเร็ว 0.5m/s (\boldsymbol{R}_0 = \begin{bmatrix}16 & 0 \ 0 & 0.25\end{bmatrix})
- ค่าประมาณสถานะเริ่มต้น (\hat{\boldsymbol{x}}_{0,0} = \boldsymbol{z}_0)
- โคเวเรียนซ์เริ่มต้น (\boldsymbol{P}_{0,0} = \boldsymbol{R}_0)
-
ขั้นตอนการคาดการณ์
- ช่วงเวลา (\Delta t = 5s)
- เมทริกซ์การเปลี่ยนผ่านสถานะ (\boldsymbol{F} = \begin{bmatrix}1 & 5 \ 0 & 1\end{bmatrix})
- สถานะที่คาดการณ์ (\hat{\boldsymbol{x}}{1,0} = \boldsymbol{F}\hat{\boldsymbol{x}}{0,0} = [11{,}000, 200]^T)
- การคาดการณ์โคเวเรียนซ์ (ไม่รวม process noise): (\boldsymbol{P}{1,0} = \boldsymbol{F}\boldsymbol{P}{0,0}\boldsymbol{F}^T = \begin{bmatrix}22.25 & 1.25 \ 1.25 & 0.25\end{bmatrix})
- เพิ่ม process noise ((\sigma_a = 0.2m/s^2)): (\boldsymbol{Q} = \begin{bmatrix}6.25 & 2.5 \ 2.5 & 1\end{bmatrix})
- โคเวเรียนซ์ของการคาดการณ์ขั้นสุดท้าย: (\boldsymbol{P}_{1,0} = \begin{bmatrix}28.5 & 3.75 \ 3.75 & 1.25\end{bmatrix})
-
สรุป Iteration 0
- ใช้การวัดครั้งแรกเพื่อกำหนดค่าเริ่มต้นของสถานะและโคเวเรียนซ์
- ใช้แบบจำลองการเปลี่ยนผ่านสถานะเพื่อคาดการณ์สถานะถัดไปและความไม่แน่นอน
- สมการคาดการณ์
- การคาดการณ์สถานะ: (\hat{\boldsymbol{x}}{n+1,n} = \boldsymbol{F}\hat{\boldsymbol{x}}{n,n} + \boldsymbol{G}\boldsymbol{u}_n)
- การคาดการณ์โคเวเรียนซ์: (\boldsymbol{P}{n+1,n} = \boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T + \boldsymbol{Q})
-
Iteration 1 — การอัปเดตและการคาดการณ์
-
การอัปเดตฟิลเตอร์
- การวัดครั้งที่สอง: (\boldsymbol{z}_1 = [11{,}020, 202]^T)
- ความไม่แน่นอนของการวัดเพิ่มขึ้น (ส่วนเบี่ยงเบนมาตรฐาน: ระยะทาง 6m, ความเร็ว 1.5m/s) (\boldsymbol{R}_1 = \begin{bmatrix}36 & 0 \ 0 & 2.25\end{bmatrix})
- เมื่อเทียบกับโคเวเรียนซ์การคาดการณ์ (\boldsymbol{P}_{1,0}) พบว่าความไม่แน่นอนของการคาดการณ์ต่ำกว่า
- Kalman Filter รวมค่าที่วัดได้กับค่าที่คาดการณ์ด้วยค่าเฉลี่ยถ่วงน้ำหนัก
- น้ำหนัก (K_1): Kalman Gain
- สมการอัปเดตสถานะ: (\hat{\boldsymbol{x}}{1,1} = \hat{\boldsymbol{x}}{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1 - \boldsymbol{H}\hat{\boldsymbol{x}}{1,0}))
- เมทริกซ์การสังเกต (\boldsymbol{H} = \boldsymbol{I})
- การคำนวณ Kalman Gain: (\boldsymbol{K}1 = \boldsymbol{P}{1,0}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{1,0}\boldsymbol{H}^T + \boldsymbol{R}_1)^{-1}) ผลลัพธ์: (\boldsymbol{K}_1 = \begin{bmatrix}0.4048 & 0.6377 \ 0.0399 & 0.3144\end{bmatrix})
- innovation: (\boldsymbol{z}1 - \hat{\boldsymbol{x}}{1,0} = [20, 2]^T)
- ค่าชดเชย: (\boldsymbol{K}_1[20, 2]^T = [9.37, 1.43]^T)
- สถานะหลังอัปเดต: (\hat{\boldsymbol{x}}_{1,1} = [11{,}009.37, 201.43]^T)
-
การอัปเดตโคเวเรียนซ์
- ใช้รูปแบบแบบย่อ: (\boldsymbol{P}_{1,1} = (\boldsymbol{I} - \boldsymbol{K}1)\boldsymbol{P}{1,0})
- ผลลัพธ์: (\boldsymbol{P}_{1,1} = \begin{bmatrix}14.57 & 1.43 \ 1.43 & 0.71\end{bmatrix})
- หลังอัปเดต ความไม่แน่นอนต่ำกว่าทั้งความไม่แน่นอนของการคาดการณ์และของการวัด → เมื่อรวมการวัดกับการคาดการณ์ ความไม่แน่นอนจะลดลงเสมอ
-
ขั้นตอนการคาดการณ์
- คาดการณ์เวลา (t_2) ถัดไป
- การคาดการณ์สถานะ: (\hat{\boldsymbol{x}}{2,1} = \boldsymbol{F}\hat{\boldsymbol{x}}{1,1} = [12{,}016.5, 201.43]^T)
- การคาดการณ์โคเวเรียนซ์: (\boldsymbol{P}{2,1} = \boldsymbol{F}\boldsymbol{P}{1,1}\boldsymbol{F}^T + \boldsymbol{Q} = \begin{bmatrix}52.86 & 7.47 \ 7.47 & 1.71\end{bmatrix})
- หากเวลาผ่านไปโดยไม่มีการวัด ความไม่แน่นอนจะเพิ่มขึ้นอีกครั้ง
- คาดการณ์เวลา (t_2) ถัดไป
-
สรุป Iteration 1
- ขั้นตอนการอัปเดต: รวมการคาดการณ์กับการวัดด้วย Kalman Gain
- ขั้นตอนการคาดการณ์: ส่งต่อสถานะที่อัปเดตแล้วไปยังเวลาถัดไป
- สมการสำคัญ
- การอัปเดตสถานะ: (\hat{\boldsymbol{x}}{n,n} = \hat{\boldsymbol{x}}{n,n-1} + \boldsymbol{K}_n(\boldsymbol{z}n - \boldsymbol{H}\hat{\boldsymbol{x}}{n,n-1}))
- การอัปเดตโคเวเรียนซ์ (Joseph form): (\boldsymbol{P}_{n,n} = (\boldsymbol{I} - \boldsymbol{K}n\boldsymbol{H})\boldsymbol{P}{n,n-1}(\boldsymbol{I} - \boldsymbol{K}_n\boldsymbol{H})^T + \boldsymbol{K}_n\boldsymbol{R}_n\boldsymbol{K}_n^T)
- Kalman Gain: (\boldsymbol{K}n = \boldsymbol{P}{n,n-1}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T + \boldsymbol{R}_n)^{-1})
สรุปตัวอย่าง
- Kalman Filter มีสามขั้นตอน: กำหนดค่าเริ่มต้น → คาดการณ์ → อัปเดต
- หลังจากนั้นจะทำซ้ำ ลูปคาดการณ์-อัปเดต ต่อเนื่อง
- ทุกครั้งที่มีการวัดใหม่เข้ามา ความไม่แน่นอนจะลดลง และการประมาณสถานะของระบบจะละเอียดแม่นยำขึ้นเรื่อย ๆ
- แหล่งเรียนรู้เพิ่มเติม
- ทิวทอเรียล ออนไลน์ฟรี: มีตัวอย่างเชิงตัวเลขแบบเป็นขั้นตอน
- หนังสือ Kalman Filter from the Ground Up: ครอบคลุมฟิลเตอร์เชิงเส้น·ไม่เชิงเส้น แนวทางการนำไปใช้จริง และโค้ด Python/MATLAB
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมเป็นผู้เขียนเอง เพิ่งอัปเดตหน้าโฮมของ Kalman Filter tutorial ของผมเมื่อไม่นานนี้ เพิ่ม ตัวอย่างการติดตามด้วยเรดาร์ แบบง่าย ๆ เข้าไป เพื่อให้คนที่มีพื้นฐานแค่สถิติและพีชคณิตเชิงเส้นก็พอจะเข้าใจได้
ผมพยายามลดการไล่อนุมานสมการให้น้อยที่สุด แต่ยังคงแสดงให้เห็นอย่างเป็นสัญชาตญาณถึง noise ของการวัด, โมเดลการพยากรณ์, และกระบวนการรวมกันของฟิลเตอร์ อยากได้ฟีดแบ็กเกี่ยวกับระดับคณิตศาสตร์และความชัดเจนของคำอธิบาย
ไกด์เชิงสัญชาตญาณ ที่ผมคิดไว้มีดังนี้
สุดท้ายแล้วแก่นสำคัญคือ least squares และภายใต้สมมติฐานบางอย่างก็สามารถพิสูจน์ได้ว่านี่คือวิธีที่เหมาะที่สุด
บทความ “How a Kalman Filter Works in Pictures” ดีมากจริง ๆ
ตัวอย่างเช่น low-pass filter ก็ถือเป็น estimator แบบหนึ่งเหมือนกัน แต่ Kalman filter เพิ่ม process model และ การคำนวณ covariance เข้าไป ทำให้มันปรับตัวแบบไดนามิกได้
มันสะท้อนความสัมพันธ์ระหว่างตัวแปรที่สัมพันธ์กัน เช่น ตำแหน่งและความเร็ว ทำให้ค่าที่วัดเพียงค่าเดียวส่งผลต่อการประมาณค่าของตัวแปรอื่นได้ด้วย
อย่างไรก็ตาม เพราะมันอิงกับพีชคณิตเชิงเส้น จึงต้องสมมติ Gaussian noise และถ้าเป็นปัญหาไม่เชิงเส้นก็ต้องใช้ตัวแปรดัดแปลงอย่าง EKF หรือ UKF
ถ้าจะเข้าใจ Kalman filter ต้องรู้ 4 อย่างต่อไปนี้
ฟิลเตอร์นี้เป็นวิธีการทางคณิตศาสตร์สำหรับ ประมาณค่าอย่างเหมาะที่สุด ของสถานะภายในและ covariance ของระบบโดยอิงจากค่าที่วัดได้
ผมคิดว่าหนังสือของ Alex Becker เป็นหนังสือเริ่มต้นที่ยอดเยี่ยมสำหรับหัวข้อนี้ มีตัวอย่างเยอะและช่วยสร้างสัญชาตญาณได้ดีมาก
ตอนเรียน Kalman filter ผมรู้สึกว่า มันจะเข้าใจได้เป็นธรรมชาติมากขึ้นเมื่อมี อินพุตตั้งแต่สองตัวขึ้นไปที่มีคุณลักษณะของ noise ต่างกัน แต่ tutorial ส่วนใหญ่พูดถึงแค่อินพุตเดี่ยว
Kalman filter ถูกใช้งานจริงเยอะมาก เช่นที่ Sendspin ก็ใช้มันเพื่อซิงก์ลำโพง
สามารถดูได้จาก ไลฟ์เดโม และ เอกสารการพัฒนา
ผมสงสัยว่าแนวคิดของ Kalman filter จะเอาไปใช้กับ คำให้การของมนุษย์ ได้ไหม
ที่ thekalmanfilter.com ก็มีคำอธิบายแบบง่าย ๆ ให้ดูเหมือนกัน
บทความนี้ดูเหมือน โฆษณาหนังสือราคาแพง มากกว่า ทั้งที่ก็มีแหล่งข้อมูลฟรีอยู่เยอะแล้ว เช่น Kalman and Bayesian Filters in Python อยากรู้ว่าหนังสือเล่มนี้มีจุดเด่นเฉพาะอะไร