卡爾曼濾波算法(C語言)

此處感謝華南虎和互聯網的眾多大佬的無償分享。

入門常識

先簡單了解以下概念:疊加性,齊次性。

用大白話講,疊加性:多個輸入對輸出有影響。齊次性:輸入放大多少倍,輸出也跟著放大多少倍

卡爾曼濾波符合這兩個特性。

卡爾曼濾波 :修正值 = 估計值 + 觀測值。符合疊加性和齊次性。

協方差的基礎知識

把Xt代入,然后將式子進行化簡。

公式推導

基礎公式理解

對于卡爾曼濾波,我們可以先從狀態方程和觀測方程開始理解,重點搞懂重點是狀態方程和觀測方程的實際含義。
?

狀態方程公式的參數解析。Xk:當前狀態值,Uk:輸入值, Wk:過程噪聲。A,B為系數。

觀測方程公式的參數解析。Yk:觀測值。Xk:當前狀態值。Vk:觀測噪聲

簡單理解:Vk是不可避免的儀器系統誤差,Wk是由外界因素引起的誤差。

Q:過程噪聲的方差。R:觀測噪聲的方差。

最優估計值,先驗估計值,(觀測值)后驗估計值。

卡爾曼濾波其實就是取估計值和測量值之間重合的部分。兩個概率之間重合的部分。

卡爾曼的實現過程

使用上一次的最優結果預測當前值,同時使用觀測值修正之前預測的當前值,得到最終結果(修正后的結果叫做最優估計)。

不需要嚴格推導,了解是什么意思,怎么用即可。

狀態更新方程

卡爾曼增益化簡后

過程噪聲少,Q可以取小一點。反之,過程噪聲大,Q取大一點。

傳感器誤差小,R可以取小一點。反之,傳感器誤差大,R取大一點。

執行流程

卡爾曼濾波算法介紹

基本思想:通過不精確的測量來估測真實值。測出來的是不精確的測量值,再利用數學模型和不精確的測量來估測真實值。

一句話概括:根據系統模型和現有狀態預測下一刻的狀態,然后根據實際的測量結果進行校正。

使用場景:卡爾曼主要用來多傳感器的數據融合,單一傳感器建議用其他濾波算法。

如何使用?

以下面的代碼為例:先定義好卡爾曼濾波結構體,并為其賦值。之后把結構體參數傳入,把要過濾的數據傳入。卡爾曼濾波算法就會把過濾好的數據,放在其結構體的輸出成員中存儲好。我們再用變量把卡爾曼濾波結構體中的輸出成員的值接收到就行了。

代碼

kalman.c

/*** 一維卡爾曼濾波器實現* @param ekf 卡爾曼濾波器結構體指針,包含濾波所需參數* @param input 當前時刻的測量值* * 算法流程說明:* 1. 預測階段:根據上一時刻的狀態估計當前狀態* 2. 計算卡爾曼增益:確定測量值和預測值的權重* 3. 更新估計:結合預測值和測量值得到最優估計* 4. 更新協方差:為下一時刻的預測做準備*/
void kalman_1(struct _1_ekf_filter *ekf, float input)
{// 1. 預測協方差矩陣(時間更新)// Now_P = LastP + Q// 預測誤差 = 上一時刻誤差 + 過程噪聲// Q值越大,表明系統模型越不可靠,濾波器對新測量值更敏感ekf->Now_P = ekf->LastP + ekf->Q;// 2. 計算卡爾曼增益// Kg = Now_P / (Now_P + R)// 卡爾曼增益權衡預測值和測量值的權重// R值越大(測量噪聲大),增益越小,更信任預測值ekf->Kg = ekf->Now_P / (ekf->Now_P + ekf->R);// 3. 狀態更新方程(測量更新)// out = out + Kg * (input - out)// 本質是預測值與測量值的加權融合// 當Kg=1時完全信任測量值,當Kg=0時完全信任預測值ekf->out = ekf->out + ekf->Kg * (input - ekf->out);// 4. 更新誤差協方差矩陣// LastP = (1-Kg) * Now_P// 更新當前估計誤差,用于下一時刻的預測// 隨著迭代進行,P值會收斂到穩態ekf->LastP = (1 - ekf->Kg) * ekf->Now_P;
}

kalman.h

#ifndef _KALMAN_H    // 防止頭文件被重復包含
#define _KALMAN_H// 定義一維擴展卡爾曼濾波器結構體
struct _1_ekf_filter
{float LastP;    // 上一時刻的協方差(預測誤差)float Now_P;    // 當前時刻的協方差(估計誤差)float out;      // 濾波器輸出值(最優估計值)float Kg;       // 卡爾曼增益,權衡預測值和測量值的權重float Q;        // 過程噪聲協方差,反映系統模型的不確定性float R;        // 測量噪聲協方差,反映測量設備的不確定性
};// 一維卡爾曼濾波器函數
// 參數:ekf-卡爾曼濾波器結構體指針,input-當前時刻的測量值
extern void kalman_1(struct _1_ekf_filter *ekf, float input);#endif // _KALMAN_H

調用示例

最后我們要使用的數據在結構體的.out中

for (i = 0; i < 6; i++) // 處理讀取的數據{pMpu[i] = (((int16_t)buffer[i << 1] << 8) | buffer[(i << 1) + 1]) - MpuOffset[i]; // 整合為16bit,并減去水平靜止校準值if (i < 3)																		  // 以下對加速度做卡爾曼濾波{{static struct _1_ekf_filter ekf[3] = {{0.02, 0, 0, 0, 0.001, 0.543}, {0.02, 0, 0, 0, 0.001, 0.543}, {0.02, 0, 0, 0, 0.001, 0.543}};kalman_1(&ekf[i], (float)pMpu[i]); // 一維卡爾曼pMpu[i] = (int16_t)ekf[i].out;}}// 如果是陀螺儀數據,進行低通濾波if (i > 2) // 以下對角速度做一階低通濾波{uint8_t k = i - 3;const float factor = 0.15f; // 濾波系數static float tBuff[3];		// 濾波緩沖區pMpu[i] = tBuff[k] = tBuff[k] * (1 - factor) + pMpu[i] * factor;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79354.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標

vue 組件函數式調用實戰:以身份驗證彈窗為例

通常我們在 Vue 中使用組件&#xff0c;是像這樣在模板中寫標簽&#xff1a; <MyComponent :prop"value" event"handleEvent" />而函數式調用&#xff0c;則是讓我們像調用一個普通 JavaScript 函數一樣來使用這個組件&#xff0c;例如&#xff1a;…

Vite Proxy配置詳解:從入門到實戰應用

Vite Proxy配置詳解&#xff1a;從入門到實戰應用 一、什么是Proxy代理&#xff1f; Proxy&#xff08;代理&#xff09;是開發中常用的解決跨域問題的方案。Vite內置了基于http-proxy的代理功能&#xff0c;可以輕松配置API請求轉發。 二、基礎配置 在vite.config.js中配置…

圖像畫質算法記錄(前言)

一、背景介紹 本篇主要是對圖像畫質增強相關&#xff0c;進行簡單整理和記錄。 二、整體流程 整體效果主要受到兩部分影響&#xff1a; 1、前端isp處理。 2、后端畫質增強。 三、isp常規流程 可以參考&#xff1a;劉斯寧&#xff1a;Understanding ISP Pipeline 四、后端畫質…

Qt 中信號與槽(signal-slot)機制支持 多種連接方式(ConnectionType)

Qt 中信號與槽&#xff08;signal-slot&#xff09;機制支持 多種連接方式&#xff08;ConnectionType&#xff09; Qt 中信號與槽&#xff08;signal-slot&#xff09;機制支持 多種連接方式&#xff08;ConnectionType&#xff09;&#xff0c;用于控制信號發出后如何調用槽…

卷積神經網絡實戰(4)代碼詳解

目錄 一、導包 二、數據準備 1.數據集 2. 標準化轉換(Normalize) 3.設置dataloader 三、定義模型 四、可視化計算圖&#xff08;不重要&#xff09; 五、評估函數 六、Tensorboard 一、導包 import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib i…

深入解析進程地址空間:從虛擬到物理的奇妙之旅

深入解析進程地址空間&#xff1a;從虛擬到物理的奇妙之旅 前言 各位小伙伴&#xff0c;還記得我們之前探討的 fork 函數嗎&#xff1f;當它返回兩次時&#xff0c;父子進程中同名變量卻擁有不同值的現象&#xff0c;曾讓我們驚嘆于進程獨立性與寫時拷貝的精妙設計。但你是否…

opencv處理圖像(二)

接下來進入到程序線程設計部分 我們主線程負責圖形渲染等操作&#xff0c;OpenGL的限制&#xff0c;opencv技術對傳入圖像加以處理&#xff0c;輸出預期圖像給主線程 QThread 我之前也是在想給opencv開一個專門的線程&#xff0c;但經過了解有幾個弊端&#xff0c;第一資源浪…

學習threejs,使用Physijs物理引擎

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??Physijs 物理引擎1.1.1 ??…

ARCGIS PRO DSK 選擇坐標系控件(CoordinateSystemsControl )的調用

在WPF窗體上使用 xml&#xff1a;加入空間命名引用 xmlns:mapping"clr-namespace:ArcGIS.Desktop.Mapping.Controls;assemblyArcGIS.Desktop.Mapping" 在控件區域加入&#xff1a; <mapping:CoordinateSystemsControl x:Name"CoordinateSystemsControl&q…

LangGraph(三)——添加記憶

目錄 1. 創建MemorySaver檢查指針2. 構建并編譯Graph3. 與聊天機器人互動4. 問一個后續問題5. 檢查State參考 1. 創建MemorySaver檢查指針 創建MemorySaver檢查指針&#xff1a; from langgraph.checkpoint.memory import MemorySavermemory MemorySaver()這是位于內存中的檢…

深入理解Mysql

BufferPool和Changebuffer是如何加快讀寫速度的? BufferPool 在Mysql啟動的時候 Mysql會申請連續的空間來存儲BufferPool 每個頁16kb 當控制塊不足以存儲信息的時候就會向后申請一個新的頁 每個控制塊都對應了一個緩存頁 控制塊占chunk的百分之5左右 LRU鏈表 Changebuffer …

Python核心編程深度解析:作用域、遞歸與匿名函數的工程實踐

引言 Python作為現代編程語言的代表&#xff0c;其作用域管理、遞歸算法和匿名函數機制是構建高質量代碼的核心要素。本文基于Python 3.11環境&#xff0c;結合工業級開發實踐&#xff0c;深入探討變量作用域的內在邏輯、遞歸算法的優化策略以及匿名函數的高效應用&#xff0c…

《用MATLAB玩轉游戲開發》貪吃蛇的百變玩法:從命令行到AI對戰

《用MATLAB玩轉游戲開發&#xff1a;從零開始打造你的數字樂園》基礎篇&#xff08;2D圖形交互&#xff09;-&#x1f40d; 貪吃蛇的百變玩法&#xff1a;從命令行到AI對戰 &#x1f3ae; 歡迎來到這篇MATLAB貪吃蛇編程全攻略&#xff01;本文將帶你從零開始&#xff0c;一步步…

Android平臺FFmpeg音視頻開發深度指南

一、FFmpeg在Android開發中的核心價值 FFmpeg作為業界領先的多媒體處理框架&#xff0c;在Android音視頻開發中扮演著至關重要的角色。它提供了&#xff1a; 跨平臺支持&#xff1a;統一的API處理各種音視頻格式完整功能鏈&#xff1a;從解碼、編碼到濾鏡處理的全套解決方案靈…

AI大模型驅動的智能座艙研發體系重構

隨著AI大模型&#xff08;如LLM、多模態模型&#xff09;的快速發展&#xff0c;傳統智能座艙研發流程面臨巨大挑戰。傳統座艙研發以需求驅動、功能固定、架構封閉為特點&#xff0c;而AI大模型的引入使得座艙系統向自主決策、動態適應、持續進化的方向發展。 因此思考并提出一…

Day20 常見降維算法分析

一、常見的降維算法 LDA線性判別PCA主成分分析t-sne降維 二、降維算法原理 2.1 LDA 線性判別 原理 &#xff1a;LDA&#xff08;Linear Discriminant Analysis&#xff09;線性判別分析是一種有監督的降維方法。它的目標是找到一個投影方向&#xff0c;使得不同類別的數據在…

Python----機器學習(模型評估:準確率、損失函數值、精確度、召回率、F1分數、混淆矩陣、ROC曲線和AUC值、Top-k精度)

一、模型評估 1. 準確率&#xff08;Accuracy&#xff09;&#xff1a;這是最基本的評估指標之一&#xff0c;表示模型在測試集上正確 分類樣本的比例。對于分類任務而言&#xff0c;準確率是衡量模型性能的直觀標準。 2. 損失函數值&#xff08;Loss&#xff09;&#xff1…

cdn 是什么?

內容分發網絡&#xff0c;Content Delivery Network 介紹 CDN&#xff08;Content Delivery Network&#xff09;是一種將內容分發到靠近用戶的邊緣服務器&#xff0c;以加速訪問速度、減少延遲、降低源站壓力的網絡系統。 CDN 把網站的靜態資源&#xff08;如 HTML、JS、CSS、…

BUCK基本原理學習總結-20250509

一、電感伏秒平衡特性 處于穩定狀態的電感,開關導通時間(電流上升段)的伏秒數須與開關關斷(電流下降段)時的伏秒數在數值上相等,盡管兩者符號相反。這也表示,繪出電感電壓對時間的曲線,導通時段曲線的面積必須等于關斷時段曲線的面積。 二、BUCK的基本概念和原理 基…