部署邊緣檢測AI與卡爾曼濾波,實現(xiàn)自鎖與打嗝模式
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ù)會相互影響,
3>初始化,將我們上一步聲明的變量取地址,后面跟參數(shù),
4>濾波,調(diào)用函數(shù)
代碼如下
這個函數(shù)以用于多種單片機中,可自行移植嘗試。
2 串口發(fā)送
這里和串口接收分開寫,前期還用不到接收,就不寫明。如果使用官方板卡建立工程,那么可以跳過第一步的cubemx 配置。
2.1 cubemx配置
使能串口2,設(shè)置為異步模式,其他保持默認(rèn),而后更新代碼。
2.2 重映射到printf函數(shù)
2.3 濾波后發(fā)送到串口
將下列放置在while中,cureer為浮點數(shù),請確保已經(jīng)打開浮點數(shù)pritf。
3 VOFA簡單配置
此時可以打開VOfa+進(jìn)行數(shù)據(jù)收集選擇當(dāng)前對應(yīng)端口號,串口,波特率115 200。
其他默認(rèn)即可,按左上角按鈕開啟串口:
查看有無數(shù)據(jù)進(jìn)入:
左側(cè)選擇第四項控件,第一個就是示波器。
拖動到右側(cè)tab欄,右擊全部填充。
再右擊,如圖將數(shù)據(jù)引入Y軸。
可以通過修改輸入傳入是否濾波,觀察對比濾波前后的樣子。
4 模型訓(xùn)練
完成上兩部分準(zhǔn)備工作后,我們就可以進(jìn)行模型的訓(xùn)練了新建項目需要通過串口進(jìn)行數(shù)據(jù)采集,簡單介紹一下Nanoedge AI Studio是用于STM32部署邊緣AI的軟件,Studio可生成四種類型的庫:異常檢測、單分類、多分類、預(yù)測。
它支持所有類型的傳感器,所生成的庫不需要任何云連接,可以直接在本地學(xué)習(xí)與部署,支持STM32所有MCU系列。
意味著你可以將模型部署在任意的MCU,大小限制可以自行選擇。
其他廠商的MCU不確定能否支持這里的模型。
正式開始前請先關(guān)閉VOfa+的串口連接。
4.1 新建模型訓(xùn)練工程
打開NanoEdge AI Studio,點擊NEW PROJECT:
選擇第一項,大意是使用設(shè)備學(xué)習(xí)檢測信號中的異常使用模型識別數(shù)據(jù)中的異常模式。
該模型可以在學(xué)習(xí)階段適應(yīng)并逐步收集知識,以預(yù)測潛在的異常行為。
我們需要用到檢測,選擇這個即可:
設(shè)置工程名稱,選擇MCU或板卡等,數(shù)據(jù)類型選第二項Current電流:
4.2 信號采集
進(jìn)入這個界面,上面是正常信號,下面是異常信號,配置方式相同。
以正常信號為例。
串行USB信號,文件導(dǎo)入和采集器。
我們剛剛使用串口發(fā)送電流信號,因此選擇串行USB信號。
其他默認(rèn),如果你只想采集需要的數(shù)據(jù)條數(shù),勾選最多數(shù)據(jù)限制。
確保你的電機正常運轉(zhuǎn),點擊START開始。
采集完成導(dǎo)入數(shù)據(jù)。
完成后再進(jìn)行異常信號采集。
需要注意一點,請將電機在故障狀態(tài)下運行,例如負(fù)載過大限制轉(zhuǎn)速等。
其他步驟與上述正常采集相同,這里不在贅述。
4.3 模型訓(xùn)練
選擇左上角添加,打開如下界面,勾選正常與異常數(shù)據(jù)后開始訓(xùn)練。
整個過程相對較慢。
運行時主要使用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 秒。
先看一下跑完的樣子,這是整個模型的參數(shù),質(zhì)量指數(shù)99.3 分,質(zhì)量高還是很高的,準(zhǔn)確率99.8%,占用RAM 0.1 kB,占用flash 1.9 kB。
這個是演變圖,藍(lán)色是質(zhì)量指數(shù),綠色是精準(zhǔn)度,藍(lán)色是RAM,紅色是flash。
這里能實時且直觀的展示整個模型訓(xùn)練的狀態(tài)。
訓(xùn)練軌跡:
歷史迭代:
還有其他圖像這里就不展示了,如果你訓(xùn)練過yolo模型會發(fā)現(xiàn)這個過程的演變和迭代是很相似的。
4.4 模型測試與繼續(xù)訓(xùn)練
這個過程可以繼續(xù)對模型進(jìn)行訓(xùn)練,也可以進(jìn)行測試,模型訓(xùn)練結(jié)果我比較滿意,就不繼續(xù)訓(xùn)練了。
測試
點擊本地運行:
先是對正常信號進(jìn)行采集學(xué)習(xí),確保電機正常工作后,點擊開始:
采集足夠的信號后,點擊進(jìn)行GO TO DETECTION轉(zhuǎn)到檢測:
整個過程很準(zhǔn)確,效果如下:
4.5 獲取模型與部署
按照如下勾選,我們是單模型,需要程序接口,數(shù)據(jù)類型是浮點數(shù)。
而后點擊部署庫:
將得到的壓縮包解壓后得到如下文件,主要用到這兩個文件,一個是庫,另一個是調(diào)用的API接口。
5 工程構(gòu)建
5.1 文件配置
如圖所示。這樣放置是個人習(xí)慣,你也可以將它放置在任意順眼的地方。
添加路徑到源文件。
包含:
庫路徑。
庫名稱,命名為neai。
5.2 添加必要程序
參考生成偽代碼:
引用頭文件后和定義后,添加必要參數(shù),寫入緩存。
學(xué)習(xí),這里我用OLED顯示進(jìn)行的過程,由于學(xué)習(xí)速度太快,我這里用了延時。
更新事件:
串口回傳數(shù)據(jù):
printf(“%d,%.2f,%.2f,%.2frn”,similarity,current,busVoltage,power);
整個工程框架構(gòu)建完成。
詳細(xì)過程請參考附件的工程。
6 加入中斷接收
回到cubeMX,找到串口,使能串口中斷。
重新生成后在while前添加開啟中斷。
重新定義中斷回傳函數(shù),先判斷是不是我們的串口2發(fā)送過來的,然后在里面寫入我們的需求。
其中回傳末尾重新開啟中斷:
串口結(jié)束與清除位數(shù):
中斷接收完成。
7 自鎖模式與打嗝模式
以下是自鎖模式與打嗝模式,請分別注釋后使用。
其中switch_clocks 是全局變量,會根據(jù)中斷接收到的字符進(jìn)行更新,從而實現(xiàn)自鎖或打嗝。
繼電器函數(shù)定義
定義的繼電器GPIO。
(本文來源于《EEPW》202508)
評論