部署邊緣檢測(cè)AI與卡爾曼濾波,實(shí)現(xiàn)自鎖與打嗝模式
1 濾波
這里用到了卡爾曼濾波,卡爾曼濾波是一種利用線性系統(tǒng)狀態(tài)方程,通過(guò)系統(tǒng)輸入輸出觀測(cè)數(shù)據(jù),對(duì)系統(tǒng)狀態(tài)進(jìn)行最優(yōu)估計(jì)的算法。它在信號(hào)處理、控制理論、導(dǎo)航等領(lǐng)域有著廣泛應(yīng)用。
1.1 核心思想與基本假設(shè)
核心思想:通過(guò)融合系統(tǒng)的動(dòng)態(tài)模型(預(yù)測(cè))和實(shí)際觀測(cè)數(shù)據(jù)(校正),以遞歸方式估計(jì)系統(tǒng)狀態(tài),最小化估計(jì)誤差的方差。
基本假設(shè):系統(tǒng)是線性的(或可近似線性化)。噪聲符合高斯分布(過(guò)程噪聲和觀測(cè)噪聲均為白噪聲)。初始狀態(tài)的估計(jì)誤差已知。
1.2 數(shù)學(xué)模型與遞歸過(guò)程
卡爾曼濾波基于兩個(gè)關(guān)鍵方程:預(yù)測(cè)方程和校正方程,通過(guò)迭代更新實(shí)現(xiàn)最優(yōu)估計(jì)。
1>狀態(tài)空間模型
狀態(tài)方程(系統(tǒng)動(dòng)態(tài)模型):(x_k = A_kx_{k-1}+B_ku_k+w_k)其中:
(x_k)為k時(shí)刻的狀態(tài)向量;
(A_k)為狀態(tài)轉(zhuǎn)移矩陣;
(u_k)為控制輸入向量,(B_k)為控制矩陣;
(w_k)為過(guò)程噪聲,服從高斯分布(w_k sim N(0,Q_k))。
觀測(cè)方程(測(cè)量模型):(z_k = H_kx_k + v_k)其中:
(z_k)為觀測(cè)向量;
(H_k)為觀測(cè)矩陣;
(v_k)為觀測(cè)噪聲,服從高斯分布(v_k sim N(0,R_k))。
2> 遞歸過(guò)程(兩個(gè)階段)
階段1:預(yù)測(cè)(時(shí)間更新)
狀態(tài)預(yù)測(cè):(hat{x}_{k|k-1} = A_khat{x}_{k-1|k-1} +B_ku_k)(基于前一時(shí)刻的最優(yōu)估計(jì)預(yù)測(cè)當(dāng)前狀態(tài))。
誤差協(xié)方差預(yù)測(cè):(P_{k|k-1} = A_kP_{k-1|k-1}A_k^T + Q_k)(預(yù)測(cè)當(dāng)前狀態(tài)估計(jì)的不確定性)。
階段2:校正(測(cè)量更新)
卡爾曼增益計(jì)算:(K_k = P_{k|k-1}H_k^T(H_kP_{k|k-1}H_k^T + R_k)^{-1})(確定觀測(cè)數(shù)據(jù)對(duì)狀態(tài)估計(jì)的權(quán)重,平衡預(yù)測(cè)與觀測(cè)的不確定性)。
狀態(tài)更新:(hat{x}_{k|k} = hat{x}_{k|k-1} + K_k(z_k -H_khat{x}_{k|k-1}))(結(jié)合觀測(cè)數(shù)據(jù)修正預(yù)測(cè)狀態(tài),得到最優(yōu)估計(jì))。誤差協(xié)方差更新:(P_{k|k} = (I - K_kH_k)P_{k|k-1})(更新當(dāng)前狀態(tài)估計(jì)的不確定性,為下一時(shí)刻做準(zhǔn)備)。
1.3 優(yōu)勢(shì)
1> 無(wú)需存儲(chǔ)歷史數(shù)據(jù),僅需當(dāng)前觀測(cè)和前一時(shí)刻的估計(jì),計(jì)算效率高,適合實(shí)時(shí)應(yīng)用。
2> 可處理噪聲統(tǒng)計(jì)特性已知的系統(tǒng),通過(guò)調(diào)整噪聲協(xié)方差矩陣(Q、R)適應(yīng)不同場(chǎng)景。
1.4 使用
1> 添加程序,這里我放在了SOFTWARE 目錄下,將其添加到路徑下,與屏幕驅(qū)動(dòng)引入相同,頭文件引入等,這里不贅述。
2> 變量聲明,首先需要聲明變量,每個(gè)數(shù)據(jù)源設(shè)置一個(gè)變量,若使用一個(gè),各個(gè)數(shù)據(jù)會(huì)相互影響,
3>初始化,將我們上一步聲明的變量取地址,后面跟參數(shù),
4>濾波,調(diào)用函數(shù)
代碼如下
這個(gè)函數(shù)以用于多種單片機(jī)中,可自行移植嘗試。
2 串口發(fā)送
這里和串口接收分開(kāi)寫(xiě),前期還用不到接收,就不寫(xiě)明。如果使用官方板卡建立工程,那么可以跳過(guò)第一步的cubemx 配置。
2.1 cubemx配置
使能串口2,設(shè)置為異步模式,其他保持默認(rèn),而后更新代碼。
2.2 重映射到printf函數(shù)
2.3 濾波后發(fā)送到串口
將下列放置在while中,cureer為浮點(diǎn)數(shù),請(qǐng)確保已經(jīng)打開(kāi)浮點(diǎn)數(shù)pritf。
3 VOFA簡(jiǎn)單配置
此時(shí)可以打開(kāi)VOfa+進(jìn)行數(shù)據(jù)收集選擇當(dāng)前對(duì)應(yīng)端口號(hào),串口,波特率115200。
其他默認(rèn)即可,按左上角按鈕開(kāi)啟串口:
查看有無(wú)數(shù)據(jù)進(jìn)入:
左側(cè)選擇第四項(xiàng)控件,第一個(gè)就是示波器。
拖動(dòng)到右側(cè)tab欄,右擊全部填充。
再右擊,如圖將數(shù)據(jù)引入Y軸。
可以通過(guò)修改輸入傳入是否濾波,觀察對(duì)比濾波前后的樣子。
4 模型訓(xùn)練
完成上兩部分準(zhǔn)備工作后,我們就可以進(jìn)行模型的訓(xùn)練了新建項(xiàng)目需要通過(guò)串口進(jìn)行數(shù)據(jù)采集,簡(jiǎn)單介紹一下Nanoedge AI Studio是用于STM32部署邊緣AI的軟件,Studio可生成四種類型的庫(kù):異常檢測(cè)、單分類、多分類、預(yù)測(cè)。
它支持所有類型的傳感器,所生成的庫(kù)不需要任何云連接,可以直接在本地學(xué)習(xí)與部署,支持STM32所有MCU系列。
意味著你可以將模型部署在任意的MCU,大小限制可以自行選擇。
其他廠商的MCU不確定能否支持這里的模型。
正式開(kāi)始前請(qǐng)先關(guān)閉VOfa+的串口連接。
4.1 新建模型訓(xùn)練工程
打開(kāi)NanoEdge AI Studio,點(diǎn)擊NEW PROJECT:
選擇第一項(xiàng),大意是使用設(shè)備學(xué)習(xí)檢測(cè)信號(hào)中的異常使用模型識(shí)別數(shù)據(jù)中的異常模式。
該模型可以在學(xué)習(xí)階段適應(yīng)并逐步收集知識(shí),以預(yù)測(cè)潛在的異常行為。
我們需要用到檢測(cè),選擇這個(gè)即可:
設(shè)置工程名稱,選擇MCU或板卡等,數(shù)據(jù)類型選第二項(xiàng)Current電流:
4.2 信號(hào)采集
進(jìn)入這個(gè)界面,上面是正常信號(hào),下面是異常信號(hào),配置方式相同。
以正常信號(hào)為例。
串行USB信號(hào),文件導(dǎo)入和采集器。
我們剛剛使用串口發(fā)送電流信號(hào),因此選擇串行USB信號(hào)。
其他默認(rèn),如果你只想采集需要的數(shù)據(jù)條數(shù),勾選最多數(shù)據(jù)限制。
確保你的電機(jī)正常運(yùn)轉(zhuǎn),點(diǎn)擊START開(kāi)始。
采集完成導(dǎo)入數(shù)據(jù)。
完成后再進(jìn)行異常信號(hào)采集。
需要注意一點(diǎn),請(qǐng)將電機(jī)在故障狀態(tài)下運(yùn)行,例如負(fù)載過(guò)大限制轉(zhuǎn)速等。
其他步驟與上述正常采集相同,這里不在贅述。
4.3 模型訓(xùn)練
選擇左上角添加,打開(kāi)如下界面,勾選正常與異常數(shù)據(jù)后開(kāi)始訓(xùn)練。
整個(gè)過(guò)程相對(duì)較慢。
運(yùn)行時(shí)主要使用CPU,設(shè)置中也沒(méi)有GPU 的相關(guān)選項(xiàng),此過(guò)程大概不需要顯卡(截至2025 年5 月23 日5.02 版本)。筆者的配置如下:
13th Gen Intel(R) Core(TM)i9-13900H 加32G 內(nèi)存
105 條正常信號(hào),229 條異常信號(hào)。
總共用時(shí)兩2 小時(shí)12 分25 秒。
先看一下跑完的樣子,這是整個(gè)模型的參數(shù),質(zhì)量指數(shù)99.3 分,質(zhì)量高還是很高的,準(zhǔn)確率99.8%,占用RAM 0.1 kB,占用flash 1.9 kB。
這個(gè)是演變圖,藍(lán)色是質(zhì)量指數(shù),綠色是精準(zhǔn)度,藍(lán)色是RAM,紅色是flash。
這里能實(shí)時(shí)且直觀的展示整個(gè)模型訓(xùn)練的狀態(tài)。
訓(xùn)練軌跡:
歷史迭代:
還有其他圖像這里就不展示了,如果你訓(xùn)練過(guò)yolo模型會(huì)發(fā)現(xiàn)這個(gè)過(guò)程的演變和迭代是很相似的。
4.4 模型測(cè)試與繼續(xù)訓(xùn)練
這個(gè)過(guò)程可以繼續(xù)對(duì)模型進(jìn)行訓(xùn)練,也可以進(jìn)行測(cè)試,模型訓(xùn)練結(jié)果我比較滿意,就不繼續(xù)訓(xùn)練了。
測(cè)試
點(diǎn)擊本地運(yùn)行:
先是對(duì)正常信號(hào)進(jìn)行采集學(xué)習(xí),確保電機(jī)正常工作后,點(diǎn)擊開(kāi)始:
采集足夠的信號(hào)后,點(diǎn)擊進(jìn)行GO TO DETECTION轉(zhuǎn)到檢測(cè):
整個(gè)過(guò)程很準(zhǔn)確,效果如下:
4.5 獲取模型與部署
按照如下勾選,我們是單模型,需要程序接口,數(shù)據(jù)類型是浮點(diǎn)數(shù)。
而后點(diǎn)擊部署庫(kù):
將得到的壓縮包解壓后得到如下文件,主要用到這兩個(gè)文件,一個(gè)是庫(kù),另一個(gè)是調(diào)用的API接口。
5 工程構(gòu)建
5.1 文件配置
如圖所示。這樣放置是個(gè)人習(xí)慣,你也可以將它放置在任意順眼的地方。
添加路徑到源文件。
包含:
庫(kù)路徑。
庫(kù)名稱,命名為neai。
5.2 添加必要程序
參考生成偽代碼:
引用頭文件后和定義后,添加必要參數(shù),寫(xiě)入緩存。
學(xué)習(xí),這里我用OLED顯示進(jìn)行的過(guò)程,由于學(xué)習(xí)速度太快,我這里用了延時(shí)。
更新事件:
串口回傳數(shù)據(jù):
printf(“%d,%.2f,%.2f,%.2frn”,similarity,current,busVoltage,power);
整個(gè)工程框架構(gòu)建完成。
詳細(xì)過(guò)程請(qǐng)參考附件的工程。
6 加入中斷接收
回到cubeMX,找到串口,使能串口中斷。
重新生成后在while前添加開(kāi)啟中斷。
重新定義中斷回傳函數(shù),先判斷是不是我們的串口2發(fā)送過(guò)來(lái)的,然后在里面寫(xiě)入我們的需求。
其中回傳末尾重新開(kāi)啟中斷:
這里我以rn作為判斷。
判斷前需要將rn去除掉,否則會(huì)判斷失敗。
串口結(jié)束與清除位數(shù):
中斷接收完成。
7 自鎖模式與打嗝模式
以下是自鎖模式與打嗝模式,請(qǐng)分別注釋后使用。
其中switch_clocks 是全局變量,會(huì)根據(jù)中斷接收到的字符進(jìn)行更新,從而實(shí)現(xiàn)自鎖或打嗝。
繼電器函數(shù)定義
定義的繼電器GPIO。
(本文來(lái)源于《EEPW》202508)
評(píng)論