概述
MLC 是“機器學習核心”(Machine Learning Core)的縮寫。在 LSM6DSV16X 傳感器 中,MLC 是一種嵌入式功能,它使傳感器能夠直接運行基于決策樹的機器學習算法。通過這種功能,傳感器可以獨立完成諸如活動識別、運動強度檢測和誤報過濾等任務,而無需將數據處理轉交給外部的微控制器。MLC 通過處理來自加速度計、陀螺儀或外部傳感器的數據,計算統(tǒng)計參數、應用濾波器,并將分類結果輸出到專用寄存器中(AN5804)。
最近在弄ST的課程,需要樣片的可以加群申請:615061293 。
視頻教學
[https://www.bilibili.com/video/BV14V45eyEh9/]
樣品申請
[https://www.wjx.top/vm/OhcKxJk.aspx#]
源碼下載
[https://download.csdn.net/download/qq_24312945/89838597]
輸出速率
在 AN5804 文檔的 Table 1. Machine learning core output data rates 中,表格列出了機器學習核心(MLC)的輸出數據速率(ODR),用于配置 MLC 數據生成的頻率。
具體來說,MLC 的輸出數據速率決定了機器學習核心處理傳感器數據并輸出結果的頻率。不同的應用場景可能需要不同的速率來平衡功耗和性能。這個表格的目的是讓用戶根據應用需求選擇合適的輸出數據速率。
執(zhí)行流程
根據 AN5804 第三頁的描述,LSM6DSV16X 傳感器的 機器學習核心(MLC) 的流程可以分為以下幾個步驟:
- 收集傳感器數據:
- ○ MLC 從內置的加速度計、陀螺儀以及通過 I2C 接口連接的外部傳感器(如磁力計)中收集三軸傳感器數據。這些數據包括 X、Y、Z 軸的加速度和角速度。
- 處理傳感器數據(計算塊):
- ○ 在這一階段,傳感器數據經過預處理。MLC 會應用一些濾波器(如高通、低通或帶通濾波器),并計算出用戶配置的統(tǒng)計特征(例如均值、方差、能量、峰值等)。這些特征基于用戶定義的時間窗口(window length)進行計算,時間窗口的長度決定了統(tǒng)計數據的覆蓋范圍。
- 構建決策樹:
- ○ 處理后的特征作為輸入被傳遞到決策樹。決策樹是一個二叉樹結構,在每個節(jié)點中,特征值被與某個閾值進行比較,以決定繼續(xù)走向下一節(jié)點的哪一條路徑。這個過程會在決策樹的各個節(jié)點中重復,直到生成最終的分類結果(例如:靜止、行走、跑步等)。
- 輸出分類結果:
- ○ 當決策樹到達葉節(jié)點時,它會輸出一個分類結果,這個結果表示所檢測的動作或狀態(tài)。結果會被存儲在 MLC 的專用輸出寄存器中,供外部微處理器讀取。
- 可選的元分類器過濾:
- ○ 輸出的分類結果還可以通過一種稱為 meta-classifier(元分類器) 的過濾器進行處理。元分類器會根據多個分類結果的統(tǒng)計情況,減少短時的錯誤分類或不穩(wěn)定的輸出。例如,如果短時間內結果頻繁變化,元分類器會穩(wěn)定輸出。
速率設置
設置了加速度計和陀螺儀的輸出數據速率(ODR)為480Hz,這將使傳感器以較高的速率采樣數據。這種設置適用于需要高動態(tài)精度的應用場景,比如需要精確跟蹤快速運動的應用。
lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_480Hz);
lsm6dsv16x_gy_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_480Hz);
量程設置
量程和分辨率的平衡:較大的量程適合高速動態(tài)的應用,但會降低測量的分辨率。如果你需要檢測較小的變化或在低動態(tài)場景下使用,建議選擇較小的量程,以獲得更高的精度。
與MLC配合使用:如果你使用這些數據進行機器學習核心(MLC)的處理,確保量程設置適當,以便捕捉到足夠的動態(tài)數據,同時保持數據的分辨率。
lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);
lsm6dsv16x_gy_full_scale_set(&dev_ctx, LSM6DSV16X_125dps);
檢測狀態(tài)
鉛筆運動檢測應用的構建,檢測的四種不同場景(類別)。
- 靜止(Steady):筆在桌子上,不在手中。
- 閑置(Idle):筆在手中但未書寫。
- 書寫(Writing):筆在手中并在書寫。
- 其他(other):未被其他類別覆蓋的情況。
數據單位
加速度計 的數據單位為 mg。
陀螺儀 的數據單位為 dps。
陀螺儀數據也可以導入mdps。
采集數據
輪詢獲取數據,使用串口打印傳感器的數據,依次是ACC_X、ACC_Y 、ACC_Z、GYR_X、GYR_Y、GYR_Z。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
lsm6dsv16x_data_ready_t drdy;
/* Read output only if new xl value is available */
lsm6dsv16x_flag_data_ready_get(&dev_ctx, &drdy);
if (drdy.drdy_xl & drdy.drdy_gy)
{
memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
memset(data_raw_angular_rate, 0x00, 3 * sizeof(int16_t));
lsm6dsv16x_acceleration_raw_get(&dev_ctx, data_raw_acceleration);
lsm6dsv16x_angular_rate_raw_get(&dev_ctx, data_raw_angular_rate);
acceleration_mg[0] = lsm6dsv16x_from_fs2_to_mg(data_raw_acceleration[0]);
acceleration_mg[1] = lsm6dsv16x_from_fs2_to_mg(data_raw_acceleration[1]);
acceleration_mg[2] = lsm6dsv16x_from_fs2_to_mg(data_raw_acceleration[2]);
angular_rate_mdps[0] = lsm6dsv16x_from_fs125_to_mdps(data_raw_angular_rate[0]);
angular_rate_mdps[1] = lsm6dsv16x_from_fs125_to_mdps(data_raw_angular_rate[1]);
angular_rate_mdps[2] = lsm6dsv16x_from_fs125_to_mdps(data_raw_angular_rate[2]);
printf("%4.2ft%4.2ft%4.2ft%4.2ft%4.2ft%4.2ftrn",
acceleration_mg[0], acceleration_mg[1], acceleration_mg[2],
angular_rate_mdps[0], angular_rate_mdps[1], angular_rate_mdps[2]);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
將采集到的數據保存。
靜止(Steady)
器件放置在桌子上。
最好多幾個方向。
這里采集4組數據。
閑置(Idle)
器件在手中不動。
采集多幾個方位數據。
這里采集4組數據。
書寫(Writing)
筆在手中并在書寫。
這里采集4組數據。
其他(other)
未被其他類別覆蓋的情況。
可以采集例如逆時針數據。
這里采集4組數據。
審核編輯 黃宇
-
數據采集
+關注
關注
39文章
6090瀏覽量
113646 -
機器學習
+關注
關注
66文章
8416瀏覽量
132619 -
MLC
+關注
關注
0文章
41瀏覽量
17304
發(fā)布評論請先 登錄
相關推薦
評論