動(dòng)識(shí)別系統(tǒng)設(shè)計(jì))
簡(jiǎn)介這份文檔面向電子信息、生物醫(yī)學(xué)工程等專業(yè)的學(xué)生與可穿戴設(shè)備開發(fā)者圍繞運(yùn)動(dòng)識(shí)別與生命體征監(jiān)測(cè)的實(shí)際需求給出了一套可落地的系統(tǒng)設(shè)計(jì)方案。內(nèi)容以三軸加速度傳感器ADXL345采集手腕加速度信號(hào)、經(jīng)MATLAB分析識(shí)別散步、跑步、跳繩、羽毛球、騎單車等運(yùn)動(dòng)為主線并結(jié)合MAX30100生物傳感器采集心率等體征配合STM32F103主控、藍(lán)牙與SD卡存儲(chǔ)模塊實(shí)現(xiàn)運(yùn)動(dòng)強(qiáng)度與身體狀況的實(shí)時(shí)監(jiān)測(cè)。文檔還涵蓋硬件總體框圖、傳感器接口電路、電源穩(wěn)壓設(shè)計(jì)及存儲(chǔ)電路等細(xì)節(jié)適合作為課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)或穿戴式健康監(jiān)測(cè)項(xiàng)目的參考藍(lán)本。資源包共1個(gè)docx文件大小約283KB結(jié)構(gòu)緊湊、便于查閱。目前已有187人學(xué)習(xí)可幫助讀者快速理解系統(tǒng)架構(gòu)與器件選型思路為自行搭建原型或撰寫相關(guān)論文提供借鑒。1. 手腕上的加速度為什么單顆三軸傳感器就能認(rèn)出你在做什么手腕上戴一顆三軸加速度傳感器采樣率不高、成本不高、功耗也不高卻能區(qū)分散步、跑步、跳繩、羽毛球、騎單車這五種動(dòng)作——這件事乍看有點(diǎn)反直覺(jué)。因?yàn)閺男盘?hào)角度看手腕處的加速度是全身運(yùn)動(dòng)、手臂擺動(dòng)、肌肉抖動(dòng)、設(shè)備機(jī)械振動(dòng)疊加后的混合物毛刺極多個(gè)體差異極大同一個(gè)人做同一種動(dòng)作兩次都不會(huì)完全一樣。如果按「先精確建模動(dòng)作軌跡」的思路去做這條路基本走不通。真正讓這件事成立的是把問(wèn)題從「還原動(dòng)作」換成「提取動(dòng)作的統(tǒng)計(jì)指紋」不同運(yùn)動(dòng)在水平速度、豎直頻率、極值分布上留下的痕跡是穩(wěn)定可分的。這套系統(tǒng)值得搞懂的地方不在于它用了什么傳感器而在于它如何用極低的硬件代價(jià)把一段連續(xù)、含噪、因人而異的時(shí)間序列壓縮成幾個(gè)能設(shè)定閾值的標(biāo)量特征再讓這些特征與心率信號(hào)在時(shí)間軸上對(duì)齊形成對(duì)運(yùn)動(dòng)強(qiáng)度的實(shí)時(shí)判斷。下面從硬件選型一路拆到分類器的閾值邏輯。2. 硬件鏈路三根線、兩顆芯片與一條 IIC 總線2.1 為什么主控、傳感器、存儲(chǔ)都?jí)涸?3.3V 上這套硬件的組成很克制STM32F103 最小系統(tǒng)、ADXL345 加速度傳感器、MAX30100 生物傳感器、藍(lán)牙模塊、SD 卡存儲(chǔ)外加一塊 5V 鋰電池配 LM1117-3.3 穩(wěn)壓。所有負(fù)載統(tǒng)一吃 3.3V這不是巧合而是刻意的設(shè)計(jì)收斂。穿戴設(shè)備最怕的是電源樹復(fù)雜多路電壓意味著多顆穩(wěn)壓芯片、多組濾波、更多布板面積和更多失效點(diǎn)。把主控、兩顆傳感器、通信模塊全部約束在 3.3V電源模塊就退化成「5V 進(jìn)、3.3V 出」的單級(jí) LDO 結(jié)構(gòu)穩(wěn)定性反而更容易保證。LM1117-3.3 是線性穩(wěn)壓效率不如開關(guān)電源但在這種毫安級(jí)負(fù)載下紋波小、外圍只需濾波電容對(duì)傳感器模擬前端更友好——MAX30100 內(nèi)部是低噪聲模擬信號(hào)處理器電源紋波會(huì)直接進(jìn)光學(xué)測(cè)量鏈路這一點(diǎn)在選型時(shí)不能只看效率數(shù)字。提示線性穩(wěn)壓的代價(jià)是壓差全部變成熱。5V 降到 3.3V、壓差 1.7V負(fù)載電流越大發(fā)熱越明顯這也是為什么這類設(shè)計(jì)必須把傳感器待機(jī)功耗壓到可忽略的量級(jí)。2.2 ADXL345 的接線為什么只要三根ADXL345 與 STM32F103 之間只走三根線SDA、SCL 和 3D INT 中斷輸出。前兩根是 IIC 總線的數(shù)據(jù)線與時(shí)鐘線第三根讓單片機(jī)能在數(shù)據(jù)就緒或觸發(fā)事件時(shí)被中斷喚醒而不是靠輪詢空轉(zhuǎn)——這對(duì)低功耗穿戴設(shè)備是剛需。選它而不是選模擬輸出的加速度計(jì)理由集中在幾個(gè)參數(shù)上13 位分辨率、±16g 量程、16 位二進(jìn)制補(bǔ)碼數(shù)字輸出、支持 SPI3/4 線或 IIC。分辨率決定了能否分辨散步和跑步之間那種細(xì)微的幅度差±16g 量程保證了跳繩落地、羽毛球揮拍這類沖擊不會(huì)削頂飽和數(shù)字輸出則省掉了外部 ADC 和配套的模擬調(diào)理電路。本設(shè)計(jì)走 IIC地址線 ADDR 接高電平器件地址為 0x1D不含最低位因此寫地址 0x3A、讀地址 0x3B。這里有個(gè)容易被忽略的工程細(xì)節(jié)IIC 是總線結(jié)構(gòu)如果系統(tǒng)里其他芯片占用了 STM32 的同一組 IO就不能同時(shí)通信只能分時(shí)復(fù)用。三根線的代價(jià)是總線共享收益是片上資源占用極小。原理圖里那顆濾波電容不是裝飾它壓的是電源上的高頻噪聲直接關(guān)系到靜態(tài)重力分量算得準(zhǔn)不準(zhǔn)。2.3 MAX30100 靠什么把心率從手腕里「讀」出來(lái)心率模塊選的是集成脈搏血氧測(cè)量與心臟監(jiān)測(cè)的 MAX30100內(nèi)部包含兩個(gè)發(fā)光二極管、一個(gè)光電探測(cè)器、優(yōu)化過(guò)的光學(xué)器件和低噪聲模擬信號(hào)處理器原理是光體積容積法PPGLED 發(fā)光穿透皮膚組織血液搏動(dòng)導(dǎo)致吸收量周期性變化光電探測(cè)器把這種變化轉(zhuǎn)成電流信號(hào)再經(jīng)內(nèi)部處理輸出脈搏與血氧數(shù)據(jù)。它同樣走 IIC同樣 3.3V 供電支持軟件關(guān)斷待機(jī)電流可忽略因此可以長(zhǎng)期保持電源連接而不拖垮續(xù)航。佩戴位置選手腕、手指、耳垂這類組織較薄的部位是因?yàn)楣庖艽┩覆庞行盘?hào)——手腕處信號(hào)弱于指尖但對(duì)穿戴形態(tài)最友好這是舒適性與信號(hào)質(zhì)量之間的取舍。2.4 SD 卡不是可有可無(wú)的配件系統(tǒng)要把一段時(shí)間內(nèi)的加速度數(shù)據(jù)和生理數(shù)據(jù)落盤用途很明確上傳到計(jì)算機(jī)做分析、訓(xùn)練分類器。這意味著 SD 卡存儲(chǔ)電路承擔(dān)的是「數(shù)據(jù)采集閉環(huán)」的角色而不是產(chǎn)品功能。沒(méi)有它分類器的閾值就只能拍腦袋定有了它才能拿真實(shí)佩戴數(shù)據(jù)去驗(yàn)證窗口長(zhǎng)度、重疊率、閾值邊界這些參數(shù)。很多穿戴類原型翻車恰恰是因?yàn)樘^(guò)了這一步直接拿實(shí)驗(yàn)室里擺拍的數(shù)據(jù)調(diào)參。3. 預(yù)處理流水線濾波、歸一化、加窗各自在解決什么3.1 卡爾曼濾波為什么同時(shí)用在加速度和脈搏上手腕處的信號(hào)有兩類噪聲源肌肉抖動(dòng)和設(shè)備機(jī)械抖動(dòng)。前者是生理性的后者是結(jié)構(gòu)性的兩者都會(huì)在加速度和脈搏信號(hào)上產(chǎn)生大量毛刺。系統(tǒng)對(duì)兩種信號(hào)統(tǒng)一采用卡爾曼濾波去噪??柭鼮V波的準(zhǔn)則是最小均方根誤差計(jì)算思想是遞推用前一時(shí)刻的估計(jì)值加上當(dāng)前時(shí)刻的觀測(cè)值算出當(dāng)前時(shí)刻的最優(yōu)估計(jì)。它不需要保存整段歷史只要維護(hù)狀態(tài)估計(jì)和誤差協(xié)方差非常適合在資源受限的 MCU 上跑。對(duì)加速度信號(hào)它壓的是高頻抖動(dòng)對(duì)脈搏信號(hào)它壓的是運(yùn)動(dòng)偽影帶來(lái)的基線漂移。同一套遞推框架能覆蓋兩種物理量這是選它的現(xiàn)實(shí)理由——省一套算法、省一份代碼空間。常見的實(shí)現(xiàn)思路是狀態(tài)方程按勻速模型建觀測(cè)方程直接取傳感器讀數(shù)過(guò)程噪聲和觀測(cè)噪聲的協(xié)方差按實(shí)測(cè)噪聲水平標(biāo)定。這兩個(gè)參數(shù)調(diào)不好濾波要么過(guò)度平滑把跳繩的沖擊峰值抹掉要么幾乎不起作用屬于典型的玄學(xué)參數(shù)必須拿 SD 卡里錄的真實(shí)數(shù)據(jù)反復(fù)試。3.2 歸一化到 [-1,1]讓一個(gè)分類器適配所有人個(gè)體差異是運(yùn)動(dòng)識(shí)別最硬的問(wèn)題不同人做同一動(dòng)作幅度、速度都不同同一個(gè)人不同次做也不一樣。如果不處理分類器學(xué)到的其實(shí)是「某個(gè)人的動(dòng)作幅度」換個(gè)人就失效。歸一化把原始加速度幅度統(tǒng)一映射到 [-1,1]。這一步的本質(zhì)是消除信號(hào)幅度對(duì)識(shí)別的影響只保留波形形狀和變化節(jié)奏。代價(jià)是丟失了絕對(duì)幅度信息——所以后續(xù)特征里必須保留「速度」這類帶量綱的量否則散步和跑步就分不開了。換句話說(shuō)歸一化解決的是「?jìng)€(gè)體差異」而速度特征解決的是「運(yùn)動(dòng)強(qiáng)度差異」兩者分工明確不能互相替代。3.3 滑動(dòng)窗口與 50% 重疊率傳感器持續(xù)采集輸入數(shù)據(jù)在時(shí)間域上很長(zhǎng)直接提特征計(jì)算量會(huì)爆。加窗把長(zhǎng)信號(hào)切成等長(zhǎng)片段既縮短了單次處理長(zhǎng)度也把不同實(shí)驗(yàn)體之間信號(hào)長(zhǎng)度不一致的問(wèn)題固定下來(lái)。常用兩種切法滑動(dòng)窗口分割和動(dòng)作窗口分割。動(dòng)作窗口要求先知道一個(gè)完整動(dòng)作的起止適合周期性明確、節(jié)奏穩(wěn)定的場(chǎng)景本系統(tǒng)要識(shí)別五種時(shí)序各異的運(yùn)動(dòng)動(dòng)作邊界根本切不準(zhǔn)所以選滑動(dòng)窗口——按固定時(shí)間長(zhǎng)度切相鄰窗口可重疊可不重疊。本設(shè)計(jì)取 50% 重疊率。重疊的意義在于窗口邊界處的動(dòng)作可能被切斷重疊讓每個(gè)動(dòng)作片段至少完整落在一個(gè)窗口里避免邊界效應(yīng)拉低識(shí)別率。相關(guān)研究給出的經(jīng)驗(yàn)值是 50% 效果最好代價(jià)是計(jì)算量翻倍——每段數(shù)據(jù)被處理兩次。這是一個(gè)典型的用算力換準(zhǔn)確率的取舍在離線分析階段完全劃算。還有一處容易被漏掉的約束為了同步監(jiān)測(cè)生命體征加速度和脈搏信號(hào)必須做同種加窗保證兩者在時(shí)間上對(duì)齊后續(xù)才能做數(shù)據(jù)融合。如果兩條鏈路窗口錯(cuò)位就會(huì)出現(xiàn)「用跑步的心率去配散步的加速度」這種荒謬結(jié)論。4. 特征與分類器幾個(gè)標(biāo)量如何切開五種運(yùn)動(dòng)4.1 特征選擇是從動(dòng)作差異反推出來(lái)的可提取的加速度特征有上百種但本系統(tǒng)只取滑動(dòng)窗口內(nèi)的平均值、最大值、最小值、最大頻率。這不是偷懶而是先分析動(dòng)作差異再倒推特征散步與跑步的區(qū)別在水平速度和手臂擺動(dòng)頻率騎單車水平速度更快但勻速騎行時(shí)幾乎沒(méi)有頻率變化跳繩水平速度接近 0頻率快且?guī)缀醪蛔冇鹈蛴卸虝红o止速度為 0揮拍時(shí)頻率快。對(duì)應(yīng)公式為平均值、最大值、最小值、最大頻率。平均值刻畫整體強(qiáng)度極值刻畫沖擊與靜止最大頻率刻畫節(jié)奏。四個(gè)標(biāo)量就能把這五種運(yùn)動(dòng)在特征空間里拉開距離這是「特征要服務(wù)于分類邊界」的典型做法——不是特征越多越好而是每個(gè)特征都要對(duì)應(yīng)一條可判定的差異。4.2 多層閾值分類器的判定順序分類器用的是基于多層閾值的方法本質(zhì)是一棵手工構(gòu)造的決策樹節(jié)點(diǎn)是特征閾值葉子是運(yùn)動(dòng)類型。判定順序如下# 多層閾值分類器輸入為單個(gè)滑動(dòng)窗口的特征 def classify(mean_horizontal, max_freq_vertical): # 第一層水平方向平均速度切分三種位移類運(yùn)動(dòng) if mean_horizontal 7: return walking # 散步低速 elif mean_horizontal 15: return running # 跑步中速 else: # 第二層高速段再按豎直頻率區(qū)分騎車與跳繩 if max_freq_vertical FREQ_THRESHOLD: return jump_rope # 跳繩頻率快且穩(wěn)定 else: return cycling # 騎車頻率幾乎無(wú)變化第一層用水平平均速度設(shè)兩個(gè)閾值小于 7 判散步7 到 15 判跑步大于 15 判騎車。第二層在高速區(qū)間用豎直方向運(yùn)動(dòng)頻率區(qū)分跳繩與騎車。羽毛球則依賴「短暫靜止 揮拍高頻」的組合特征單獨(dú)判定。這套邏輯的好處是可解釋、易實(shí)現(xiàn)、算力極低在 MCU 上幾乎零開銷壞處是閾值靠人工標(biāo)定換佩戴位置或換人群就要重調(diào)。參數(shù)說(shuō)明上7 和 15 這兩個(gè)速度閾值不是物理單位下的普適常數(shù)而是特定采樣與歸一化流程下的經(jīng)驗(yàn)分界改動(dòng)采樣率或窗口長(zhǎng)度后必須重新標(biāo)定否則整棵樹都會(huì)錯(cuò)位。4.3 心率與運(yùn)動(dòng)強(qiáng)度如何合成身體狀況判斷識(shí)別出運(yùn)動(dòng)狀態(tài)后系統(tǒng)把當(dāng)前心率與該運(yùn)動(dòng)對(duì)應(yīng)的合理心率區(qū)間比對(duì)超出范圍就輸出預(yù)警。不同運(yùn)動(dòng)對(duì)應(yīng)不同的心率范圍這是把運(yùn)動(dòng)學(xué)與生理學(xué)知識(shí)編碼進(jìn)判定邏輯的做法同樣 120 的心率在散步狀態(tài)下偏高在跑步狀態(tài)下正常。這里的關(guān)鍵設(shè)計(jì)是「運(yùn)動(dòng)狀態(tài)作為心率的上下文」。單看心率數(shù)值無(wú)法判斷是否異常必須知道人此刻在做什么。這也是為什么前面反復(fù)強(qiáng)調(diào)兩條信號(hào)鏈路要時(shí)間對(duì)齊——融合的前提是對(duì)齊對(duì)齊的前提是同種加窗。5. 避坑與排查這套鏈路最容易翻車的五個(gè)地方5.1 加速度削頂飽和跳繩被誤判成騎車現(xiàn)象跳繩數(shù)據(jù)在特征上表現(xiàn)為速度偏高分類器穩(wěn)定輸出騎車。原因跳繩落地沖擊瞬時(shí)加速度可能超過(guò)量程上限波形被削平平均值被抬高。解決確認(rèn)量程配置留足余量±16g 的意義就在這里并在預(yù)處理階段檢查原始數(shù)據(jù)是否存在連續(xù)貼頂?shù)牟蓸狱c(diǎn)有就先降幅度或換佩戴松緊度。5.2 歸一化后散步與跑步分不開現(xiàn)象歸一化做完兩類運(yùn)動(dòng)的波形幾乎重合分類器失效。原因歸一化把幅度信息抹掉了而散步與跑步的核心差異恰恰在速度幅度上。解決歸一化只用于穩(wěn)定波形形狀速度類特征必須從歸一化之前的原始數(shù)據(jù)計(jì)算兩條數(shù)據(jù)通路要分開維護(hù)。5.3 窗口重疊率改了閾值全部失準(zhǔn)現(xiàn)象把重疊率從 50% 調(diào)到 0 或 75%原本好用的 7 和 15 兩個(gè)閾值開始大量誤判。原因重疊率改變了單位時(shí)間內(nèi)窗口數(shù)量與邊界采樣分布特征統(tǒng)計(jì)量隨之漂移。解決閾值必須與窗口長(zhǎng)度、重疊率綁定成一組參數(shù)一起標(biāo)定任何一項(xiàng)改動(dòng)都要用 SD 卡錄制的數(shù)據(jù)重新跑一遍分布。5.4 心率與加速度時(shí)間錯(cuò)位現(xiàn)象預(yù)警頻繁誤報(bào)明明在散步卻報(bào)心率過(guò)高。原因兩條鏈路加窗不同步融合時(shí)把不同時(shí)刻的數(shù)據(jù)配到了一起。解決統(tǒng)一窗口長(zhǎng)度與起始時(shí)刻在數(shù)據(jù)落盤時(shí)就打上同一時(shí)間戳融合前先做對(duì)齊校驗(yàn)。5.5 IIC 地址或總線沖突導(dǎo)致傳感器讀不到數(shù)現(xiàn)象初始化正常但讀回全 0 或固定值。原因ADDR 接高電平對(duì)應(yīng)地址 0x1D寫 0x3A、讀 0x3B地址配錯(cuò)或總線上其他器件占用同一組 IO 都會(huì)導(dǎo)致通信失敗。解決先用單器件最小系統(tǒng)驗(yàn)證讀寫再逐步并入總線共享 IO 時(shí)嚴(yán)格分時(shí)復(fù)用避免同時(shí)發(fā)起通信。6. 手工閾值與機(jī)器學(xué)習(xí)的取舍這套方案的天花板在哪這套系統(tǒng)的分類器是手工多層閾值而不是訓(xùn)練出來(lái)的模型。放在今天看很多人第一反應(yīng)是「為什么不用 SVM 或神經(jīng)網(wǎng)絡(luò)」。但把設(shè)計(jì)約束擺出來(lái)這個(gè)選擇是自洽的主控是 STM32F103算力和內(nèi)存都緊閾值判定幾乎零開銷五種運(yùn)動(dòng)差異明確特征空間可分復(fù)雜模型帶來(lái)的邊際收益有限更重要的是閾值邏輯可解釋出問(wèn)題時(shí)能直接定位到是哪一層判錯(cuò)而黑匣子模型在穿戴設(shè)備上排查成本極高。它的天花板也很清楚。第一閾值是人群和佩戴位置相關(guān)的經(jīng)驗(yàn)值換一批受試者或換到另一只手腕分布就會(huì)漂移需要重新標(biāo)定。第二多層閾值本質(zhì)是軸對(duì)齊的切分遇到特征空間里斜向分布的類別就切不干凈比如快走與慢跑的邊界地帶。第三特征只有四個(gè)標(biāo)量信息壓縮得太狠對(duì)過(guò)渡態(tài)動(dòng)作起步、停下、換動(dòng)作識(shí)別會(huì)抖動(dòng)。如果要往上走常見的路徑是把 SD 卡采集的真實(shí)數(shù)據(jù)做成帶標(biāo)簽數(shù)據(jù)集用滑動(dòng)窗口特征訓(xùn)練一個(gè)輕量分類器再量化部署回 MCU或者保留閾值框架做粗分類用一個(gè)小模型只處理邊界樣本。但無(wú)論走哪條路預(yù)處理流水線——卡爾曼去噪、歸一化、50% 重疊加窗、雙鏈路時(shí)間對(duì)齊——都不會(huì)變因?yàn)槟鞘切盘?hào)層面的地基換模型換不掉。我自己的血淚經(jīng)驗(yàn)是這類穿戴原型最容易被低估的不是算法而是數(shù)據(jù)采集閉環(huán)。沒(méi)有 SD 卡里那批真實(shí)佩戴數(shù)據(jù)閾值就是拍腦袋濾波參數(shù)就是玄學(xué)任何「識(shí)別率較高」的說(shuō)法都站不住。從那以后我每次碰這類項(xiàng)目都強(qiáng)制先把落盤鏈路和雙信號(hào)時(shí)間戳跑通再去談分類器——希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取