新聞中心

EEPW首頁 > 智能計算 > 設(shè)計應(yīng)用 > 部署邊緣檢測AI與卡爾曼濾波,實現(xiàn)自鎖與打嗝模式

部署邊緣檢測AI與卡爾曼濾波,實現(xiàn)自鎖與打嗝模式

作者:OrangeBig 時間:2025-08-20 來源:EEPW 收藏

1   濾波

是一種利用線性系統(tǒng)狀態(tài)方程,通過系統(tǒng)輸入輸出觀測數(shù)據(jù),對系統(tǒng)狀態(tài)進(jìn)行最優(yōu)估計的算法。它在信號處理、控制理論、導(dǎo)航等領(lǐng)域有著廣泛應(yīng)用。

1.1 核心思想與基本假設(shè)

核心思想:通過融合系統(tǒng)的動態(tài)模型(預(yù)測)和實際觀測數(shù)據(jù)(校正),以遞歸方式估計系統(tǒng)狀態(tài),最小化估計誤差的方差。

基本假設(shè):系統(tǒng)是線性的(或可近似線性化)。噪聲符合高斯分布(過程噪聲和觀測噪聲均為白噪聲)。初始狀態(tài)的估計誤差已知。

1.2 數(shù)學(xué)模型與遞歸過程

基于兩個關(guān)鍵方程:預(yù)測方程和校正方程,通過迭代更新實現(xiàn)最優(yōu)估計。

1>狀態(tài)空間模型

狀態(tài)方程(系統(tǒng)動態(tài)模型):(x_k = A_kx_{k-1}+B_ku_k+w_k)其中:

(x_k)為k時刻的狀態(tài)向量;

(A_k)為狀態(tài)轉(zhuǎn)移矩陣;

(u_k)為控制輸入向量,(B_k)為控制矩陣;

(w_k)為過程噪聲,服從高斯分布(w_k sim N(0,Q_k))。

觀測方程(測量模型):(z_k = H_kx_k + v_k)其中:

(z_k)為觀測向量;

(H_k)為觀測矩陣;

(v_k)為觀測噪聲,服從高斯分布(v_k sim N(0,R_k))。

2> 遞歸過程(兩個階段)

階段1:預(yù)測(時間更新)

狀態(tài)預(yù)測:(hat{x}_{k|k-1} = A_khat{x}_{k-1|k-1} +B_ku_k)(基于前一時刻的最優(yōu)估計預(yù)測當(dāng)前狀態(tài))。

誤差協(xié)方差預(yù)測:(P_{k|k-1} = A_kP_{k-1|k-1}A_k^T + Q_k)(預(yù)測當(dāng)前狀態(tài)估計的不確定性)。

階段2:校正(測量更新)

卡爾曼增益計算:(K_k = P_{k|k-1}H_k^T(H_kP_{k|k-1}H_k^T + R_k)^{-1})(確定觀測數(shù)據(jù)對狀態(tài)估計的權(quán)重,平衡預(yù)測與觀測的不確定性)。

狀態(tài)更新:(hat{x}_{k|k} = hat{x}_{k|k-1} + K_k(z_k -H_khat{x}_{k|k-1}))(結(jié)合觀測數(shù)據(jù)修正預(yù)測狀態(tài),得到最優(yōu)估計)。誤差協(xié)方差更新:(P_{k|k} = (I - K_kH_k)P_{k|k-1})(更新當(dāng)前狀態(tài)估計的不確定性,為下一時刻做準(zhǔn)備)。

1.3 優(yōu)勢

1> 無需存儲歷史數(shù)據(jù),僅需當(dāng)前觀測和前一時刻的估計,計算效率高,適合實時應(yīng)用。

2> 可處理噪聲統(tǒng)計特性已知的系統(tǒng),通過調(diào)整噪聲協(xié)方差矩陣(Q、R)適應(yīng)不同場景。

1.4 使用

1> 添加程序,這里我放在了SOFTWARE 目錄下,將其添加到路徑下,與屏幕驅(qū)動引入相同,頭文件引入等,這里不贅述。

2> 變量聲明,首先需要聲明變量,每個數(shù)據(jù)源設(shè)置一個變量,若使用一個,各個數(shù)據(jù)會相互影響,

image.png

image.png

3>初始化,將我們上一步聲明的變量取地址,后面跟參數(shù),

image.png

4>濾波,調(diào)用函數(shù)

image.png

代碼如下

image.png

image.png

1755739728247745.png

image.png

這個函數(shù)以用于多種單片機中,可自行移植嘗試。

2   串口發(fā)送

這里和串口接收分開寫,前期還用不到接收,就不寫明。如果使用官方板卡建立工程,那么可以跳過第一步的cubemx 配置。

2.1 cubemx配置

1755656097506530.png

使能串口2,設(shè)置為異步模式,其他保持默認(rèn),而后更新代碼。

2.2 重映射到printf函數(shù)

image.png

image.png

2.3 濾波后發(fā)送到串口

將下列放置在while中,cureer為浮點數(shù),請確保已經(jīng)打開浮點數(shù)pritf。

image.png

3   VOFA簡單配置

此時可以打開VOfa+進(jìn)行數(shù)據(jù)收集選擇當(dāng)前對應(yīng)端口號,串口,波特率115 200。

1755656367996238.png

1755656392715460.png

其他默認(rèn)即可,按左上角按鈕開啟串口:

1755656421616379.png

查看有無數(shù)據(jù)進(jìn)入:

1755656440226853.png

左側(cè)選擇第四項控件,第一個就是示波器。

1755656467309928.png

拖動到右側(cè)tab欄,右擊全部填充。

1755656511957925.png

再右擊,如圖將數(shù)據(jù)引入Y軸。

1755656551472548.png

可以通過修改輸入傳入是否濾波,觀察對比濾波前后的樣子。

1755656588228443.png

4   模型訓(xùn)練

完成上兩部分準(zhǔn)備工作后,我們就可以進(jìn)行模型的訓(xùn)練了新建項目需要通過串口進(jìn)行數(shù)據(jù)采集,簡單介紹一下Nanoedge AI Studio是用于STM32部署邊緣AI的軟件,Studio可生成四種類型的庫:異常檢測、單分類、多分類、預(yù)測。

它支持所有類型的傳感器,所生成的庫不需要任何云連接,可以直接在本地學(xué)習(xí)與部署,支持STM32所有MCU系列。

1755656672895120.png

意味著你可以將模型部署在任意的MCU,大小限制可以自行選擇。

其他廠商的MCU不確定能否支持這里的模型。

正式開始前請先關(guān)閉VOfa+的串口連接。

4.1 新建模型訓(xùn)練工程

打開NanoEdge AI Studio,點擊NEW PROJECT:

1755657488409924.png

選擇第一項,大意是使用設(shè)備學(xué)習(xí)檢測信號中的異常使用模型識別數(shù)據(jù)中的異常模式。

該模型可以在學(xué)習(xí)階段適應(yīng)并逐步收集知識,以預(yù)測潛在的異常行為。

我們需要用到檢測,選擇這個即可:

1755657533645569.png

設(shè)置工程名稱,選擇MCU或板卡等,數(shù)據(jù)類型選第二項Current電流:

1755657605705696.png

4.2 信號采集

進(jìn)入這個界面,上面是正常信號,下面是異常信號,配置方式相同。

1755657660841802.png

以正常信號為例。

1755657715651702.png

串行USB信號,文件導(dǎo)入和采集器。

我們剛剛使用串口發(fā)送電流信號,因此選擇串行USB信號。

image.png

其他默認(rèn),如果你只想采集需要的數(shù)據(jù)條數(shù),勾選最多數(shù)據(jù)限制。

確保你的電機正常運轉(zhuǎn),點擊START開始。

1755657778426590.png

采集完成導(dǎo)入數(shù)據(jù)。

完成后再進(jìn)行異常信號采集。

需要注意一點,請將電機在故障狀態(tài)下運行,例如負(fù)載過大限制轉(zhuǎn)速等。

其他步驟與上述正常采集相同,這里不在贅述。

4.3 模型訓(xùn)練

選擇左上角添加,打開如下界面,勾選正常與異常數(shù)據(jù)后開始訓(xùn)練。

1755657825404119.png

整個過程相對較慢。

1755657856568896.png

運行時主要使用CPU,設(shè)置中也沒有GPU 的相關(guān)選項,此過程大概不需要顯卡(截至2025 年5 月23 日5.02 版本)。筆者的配置如下:

13th Gen Intel(R) Core(TM)i9-13900H 加32G 內(nèi)存

105 條正常信號,229 條異常信號。

總共用時兩2 小時12 分25 秒。

image.png

先看一下跑完的樣子,這是整個模型的參數(shù),質(zhì)量指數(shù)99.3 分,質(zhì)量高還是很高的,準(zhǔn)確率99.8%,占用RAM 0.1 kB,占用flash 1.9 kB。

image.png

這個是演變圖,藍(lán)色是質(zhì)量指數(shù),綠色是精準(zhǔn)度,藍(lán)色是RAM,紅色是flash。

這里能實時且直觀的展示整個模型訓(xùn)練的狀態(tài)。

1755661206790763.png

訓(xùn)練軌跡:

1755661242259276.png

歷史迭代:

1755661275315938.png

還有其他圖像這里就不展示了,如果你訓(xùn)練過yolo模型會發(fā)現(xiàn)這個過程的演變和迭代是很相似的。

4.4 模型測試與繼續(xù)訓(xùn)練

1755662162756681.png

這個過程可以繼續(xù)對模型進(jìn)行訓(xùn)練,也可以進(jìn)行測試,模型訓(xùn)練結(jié)果我比較滿意,就不繼續(xù)訓(xùn)練了。

測試

點擊本地運行:

1755662192428040.png

先是對正常信號進(jìn)行采集學(xué)習(xí),確保電機正常工作后,點擊開始:

1755662219496391.png

采集足夠的信號后,點擊進(jìn)行GO TO DETECTION轉(zhuǎn)到檢測:

1755662248495941.png

整個過程很準(zhǔn)確,效果如下:

1755662274378567.png

4.5 獲取模型與部署

按照如下勾選,我們是單模型,需要程序接口,數(shù)據(jù)類型是浮點數(shù)。

而后點擊部署庫:

1755662316439693.png

將得到的壓縮包解壓后得到如下文件,主要用到這兩個文件,一個是庫,另一個是調(diào)用的API接口。

1755662348670160.png

image.png

5   工程構(gòu)建

5.1 文件配置

如圖所示。這樣放置是個人習(xí)慣,你也可以將它放置在任意順眼的地方。

image.png

添加路徑到源文件。

1755662412518982.png

包含:

1755662454494081.png

庫路徑。

1755662481488687.png

庫名稱,命名為neai。

1755662506600070.png

5.2 添加必要程序

參考生成偽代碼:

image.png

image.png

image.png

引用頭文件后和定義后,添加必要參數(shù),寫入緩存。

1755662633542539.png

學(xué)習(xí),這里我用OLED顯示進(jìn)行的過程,由于學(xué)習(xí)速度太快,我這里用了延時。

1755662666241445.png

更新事件:

1755662693327137.png

串口回傳數(shù)據(jù):

printf(“%d,%.2f,%.2f,%.2frn”,similarity,current,busVoltage,power);

整個工程框架構(gòu)建完成。

詳細(xì)過程請參考附件的工程。

6   加入中斷接收

回到cubeMX,找到串口,使能串口中斷。

1755662729496517.png

重新生成后在while前添加開啟中斷。

1755662766109001.png

重新定義中斷回傳函數(shù),先判斷是不是我們的串口2發(fā)送過來的,然后在里面寫入我們的需求。

1755746168437602.png

1755746235956375.png

1755746291784763.png

其中回傳末尾重新開啟中斷:

1755662876621088.png

1755742505423143.png

1755662912265334.png

1755742571741329.png

串口結(jié)束與清除位數(shù):

1755662940620767.png

1755662955280915.png

中斷接收完成。

7   自鎖模式與

以下是自鎖模式與,請分別注釋后使用。

1755741555464753.png

image.png

其中switch_clocks 是全局變量,會根據(jù)中斷接收到的字符進(jìn)行更新,從而實現(xiàn)自鎖或打嗝。

繼電器函數(shù)定義

1755663052598507.png

image.png

定義的繼電器GPIO。

(本文來源于《EEPW》


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉