[項目]基于FreeRTOS的STM32四軸飛行器: 十二.角速度加速度濾波

基于FreeRTOS的STM32四軸飛行器: 十二.濾波

  • 一.濾波介紹
  • 二.對角速度進行一階低通濾波
  • 三.對加速度進行卡爾曼濾波

一.濾波介紹

模擬信號濾波:
最常用的濾波方法可以在信號和地之間并聯一個電容,因為電容通交隔直,信號突變會給電容充電,電容兩端電壓不會突變,電容越大越明顯。
電容濾電壓的毛刺,電感濾電流的毛刺。電感串聯進電路中,電流出現毛刺,因為通過電感兩端的電流不能突變,實現對電流的濾波。
數字信號濾波:
使用算法進行濾波。
1.均值濾波(滑動窗口濾波):每來一個值使用前四個值進行平均使用平均值
2.中值濾波:將數據排序,取數據奇數部分的中值代替取到的數值。
3.一階低通濾波:結果 = 系數 * 上次的值 + (1 - 系數)X 這次的值
4.卡爾曼濾波:核心5個公式。
5.互補濾波:
加速度對時間積分 速度:響應迅速,結果容易受到外界影響。
加速度對時間微分 速度:結果不容受影響,響應不及時。

二.對角速度進行一階低通濾波

編寫一階低通濾波函數:

#define ALPHA 0.8
/* 一階低通率波 */
int16_t Com_Filter_LowPass(int16_t newData, int16_t lastData)
{return ALPHA * lastData + (1 - ALPHA) * newData;
}

使用一階低通濾波:
記住讀取數據時使用臨界區。

    /* 1. 讀取原始數據 */taskENTER_CRITICAL();Inf_MPU6050_ReadGyroAccelCalibrated(gyroAccel);taskEXIT_CRITICAL();/* 2. 對角速度做一階低通低通濾波 */static int16_t lastDatas[3] = {0};gyroAccel->gyro.gyroX = Com_Filter_LowPass(gyroAccel->gyro.gyroX, lastDatas[0]);gyroAccel->gyro.gyroY = Com_Filter_LowPass(gyroAccel->gyro.gyroY, lastDatas[1]);gyroAccel->gyro.gyroZ = Com_Filter_LowPass(gyroAccel->gyro.gyroZ, lastDatas[2]);lastDatas[0] = gyroAccel->gyro.gyroX;lastDatas[1] = gyroAccel->gyro.gyroY;lastDatas[2] = gyroAccel->gyro.gyroZ;

一階低通濾波效果演示:
使用虛擬數字示波器觀察濾波前后數據波形,濾波效果明顯。
CH1(紅):濾波前
CH2(黃):濾波后
在這里插入圖片描述

三.對加速度進行卡爾曼濾波

直接移植下面的卡爾曼濾波代碼:
.c:
三個結構體分別是XYZ三軸的參數。
卡爾曼濾波函數參數分別為結構體,對誰做濾波。
返回值為濾波后結果。

/* 卡爾曼濾波參數 */
KalmanFilter_Struct kfs[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}};
double Common_Filter_KalmanFilter(KalmanFilter_Struct *kf, double input)
{kf->Now_P = kf->LastP + kf->Q;kf->Kg    = kf->Now_P / (kf->Now_P + kf->R);kf->out   = kf->out + kf->Kg * (input - kf->out);kf->LastP = (1 - kf->Kg) * kf->Now_P;return kf->out;
}

.h:

/* 卡爾曼濾波器結構體 */
typedef struct
{float LastP;   // 上一時刻的狀態方差(或協方差)float Now_P;   // 當前時刻的狀態方差(或協方差)float out;     // 濾波器的輸出值,即估計的狀態float Kg;      // 卡爾曼增益,用于調節預測值和測量值之間的權重float Q;       // 過程噪聲的方差,反映系統模型的不確定性float R;       // 測量噪聲的方差,反映測量過程的不確定性
} KalmanFilter_Struct;extern KalmanFilter_Struct kfs[3];

使用卡爾曼濾波:
傳入結構體和濾波的對象。

    /* 3. 對加速度做卡爾曼濾波 */// OutData[0] = gyroAccel->accel.accelX ;gyroAccel->accel.accelX = Common_Filter_KalmanFilter(&kfs[0], gyroAccel->accel.accelX);gyroAccel->accel.accelY = Common_Filter_KalmanFilter(&kfs[1], gyroAccel->accel.accelY);gyroAccel->accel.accelZ = Common_Filter_KalmanFilter(&kfs[2], gyroAccel->accel.accelZ);// OutData[1] = gyroAccel->accel.accelX ;// OutPut_Data();

觀察濾波前后效果:
效果良好
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

UNIX網絡編程筆記:TCP、UDP、SCTP編程的區別

一、核心特性對比 特性TCPUDPSCTP連接方式面向連接(三次握手)無連接面向連接(四次握手)可靠性可靠傳輸(重傳、確認機制)不可靠傳輸可靠傳輸(多路徑冗余)傳輸單位字節流(…

Python爬蟲異常處理:自動跳過無效URL

爬蟲在運行過程中常常會遇到各種異常情況,其中無效URL的出現是較為常見的問題之一。無效URL可能導致爬蟲程序崩潰或陷入無限等待狀態,嚴重影響爬蟲的穩定性和效率。因此,掌握如何在Python爬蟲中自動跳過無效URL的異常處理技巧,對于…

C++語法學習的主要內容

科技特長生方向,主要學習的內容為 一,《C語法》 二,《數據結構》 三,《算法》 四,《計算機基礎知識》 五,《初高中的數學知識》 其中,《C語法》學習的主要內容如下: 1,cout輸出語句和鍵盤…

3、孿生網絡/連體網絡(Siamese Network)

目的: 用Siamese Network (孿生網絡) 解決Few-shot learning (小樣本學習)。 Siamese Network并不是Meta Learning最好的方法, 但是通過學習Siamese Network,非常有助于理解其他Meta Learning算法。 這里介紹了兩種方法:Siamese Network (孿生網絡)、Trplet Loss Siam…

從零構建大語言模型全棧開發指南:第二部分:模型架構設計與實現-2.2.1從零編寫類GPT-2模型架構(規劃模塊與代碼組織)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 2.2.1 從零編寫類GPT-2模型架構(規劃模塊與代碼組織)1. 模型架構設計規劃1.1 架構核心組件2. 模塊化設計實現2.1 輸入處理模塊2.1.1 分詞與嵌入2.1.2 位置編碼2.2 解碼塊設計2.2.1 多頭注意力子層2.2.…

消息隊列(Kafka及RocketMQ等對比聯系)

目錄 消息隊列 一、為什么使用消息隊列?消息隊列有什么優點/缺點?介紹下Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么優點缺點,如何取舍? 1.公司業務場景是什么,這個業務場景有什么挑戰,如果不用MQ有什么麻…

Android 13系統定制實戰:基于系統屬性的音量鍵動態屏蔽方案解析

1. 需求背景與實現原理 在Android 13系統定制化開發中,需根據設備場景動態屏蔽音量鍵(VOLUME_UP/VOLUME_DOWN)功能。其核心訴求是通過系統屬性(persist.sys.roco.volumekey.enable)控制音量鍵的響應邏輯,確…

解鎖DeepSeek潛能:Docker+Ollama打造本地大模型部署新范式

🐇明明跟你說過:個人主頁 🏅個人專欄:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目錄 一、引言 1、什么是Docker 2、什么是Ollama 二、準備工作 1、操…

uv - Guides 指南 [官方文檔翻譯]

文章目錄 Guides 指南概述安裝 Python入門安裝特定版本重新安裝 Python查看 Python 安裝自動 Python 下載使用現有的 Python 版本 運行腳本在沒有依賴的情況下運行腳本運行帶有依賴的腳本創建一個Python腳本聲明腳本依賴使用替代包索引鎖定依賴提高可重復性使用不同的 Python 版…

根據模板將 Excel 明細數據生成 PDF 文檔 | PDF實現郵件合并功能

在日常辦公中,我們常常會面臨這樣的需求:依據特定的模板,把 Excel 里的每一條數據轉化為單獨的 PDF 文檔,且這些 PDF 文檔中的部分內容會根據 Excel 數據動態變化。這一功能不僅能高效完成任務,還支持圖片的動態替換&a…

apache安裝腳本使用shell建立

注意防火墻,yum,網絡連接等 以下是具體的apache安裝腳本 #!/bin/bash # Set Apache version to install ## author: yuan # 檢查外網連接 echo "檢查外網連接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; …

wordpress主題使用中常見錯誤匯總

在WordPress主題的使用過程中,開發者可能會遇到各種問題。下面是一些常見錯誤的匯總,并給出了相應的解決方法。 一、主題安裝與激活錯誤 無法激活主題:檢查主題文件是否完整,以及是否符合WordPress的主題規范。 激活主題后出現…

如何設計一個訂單號生成服務?應該考慮那些問題?

如何設計一個訂單號生成服務?應該考慮那些問題? description: 在高并發的電商系統中,生成全局唯一的訂單編號是關鍵。本文探討了幾種常見的訂單編號生成方法,包括UUID、數據庫自增、雪花算法和基于Redis的分布式組件,并…

Springboot 集成 Flowable 6.8.0

1. 創建 Spring Boot 項目 通過 Spring Initializr(https://start.spring.io/ )創建一個基礎的 Spring Boot 項目,添加以下依賴: Spring WebSpring Data JPAMySQL DriverLombok(可選,用于簡化代碼&#x…

《TCP/IP網絡編程》學習筆記 | Chapter 22:重疊 I/O 模型

《TCP/IP網絡編程》學習筆記 | Chapter 22:重疊 I/O 模型 《TCP/IP網絡編程》學習筆記 | Chapter 22:重疊 I/O 模型理解重疊 I/O 模型重疊 I/O本章討論的重疊 I/O 的重點不在于 I/O 創建重疊 I/O 套接字執行重疊 I/O 的 WSASend 函數進行重疊 I/O 的 WSA…

搭建Redis哨兵集群

停掉現有的redis集群 因為這篇文章我是在 搭建完redis主從集群之后寫的,如果要是沒有搭建過這些,可以直接略過。要是從我上一篇 搭建redis主從集群過來的,可以執行下。 docker compose down 查找下redis相關進程 ps -ef | grep redis 可以看…

MySQL中,聚集索引和非聚集索引到底有什么區別?

文章目錄 1. 數據存儲方式2. 索引結構3. 查詢效率4. 索引數量5. 適用場景6. 示例說明7. 總結 在MySQL中,聚集索引和非聚集索引(也稱二級索引)的區別主要體現在數據存儲方式、索引結構和查詢效率等方面。以下是詳細對比: 1. 數據存…

看 MySQL InnoDB 和 BoltDB 的事務實現

BoltDB 事務實現 BoltDB 支持多讀單寫方式的并發級別 事務操作會鎖表 它的 MVCC 為 2 個版本,當前版本和正在寫的版本 多讀:可以并發讀當前版本 單寫(串行寫):寫時拷貝當前 B 樹,構建新 B 樹&#xff…

08_JavaScript數據操作方法_數組

目錄 一、創建一個數組 1.1 數組如何創建 字面量創建 構造函數創建 1.2 數組的長度 數組名.length 1.3 數組的索引 1.4 數組如何循環遍歷 for 循環遍歷 for in for of 二、數組的常用方法 (重點 面試) push 方法 unshift 方法 pop shif…

2025.3.25總結

工作:這兩天工作都沒啥產出,主要是工作狀態不太好,周日晚上兩點睡,周一晚上一點睡。熬夜傷身,但就是控制不住自己,睡前總要刷刷手機。本來想睡前看會書的,但這行為及其不穩定,抖音也…