LSM6DSV16X基于MLC智能笔动作识别.2--MLC数据采集
概述
MLC 是“机器学习核心”(Machine Learning Core)的缩写。在 LSM6DSV16X 传感器 中,MLC 是一种嵌入式功能,它使传感器能够直接运行基于决策树的机器学习算法。通过这种功能,传感器可以独立完成诸如活动识别、运动强度检测和误报过滤等任务,而无需将数据处理转交给外部的微控制器。MLC 通过处理来自加速度计、陀螺仪或外部传感器的数据,计算统计参数、应用滤波器,并将分类结果输出到专用寄存器中(AN5804)。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。
视频教学
https://www.bilibili.com/video/BV14V45eyEh9/
LSM6DSV16X基于MLC智能笔动作识别(2)----MLC数据采集
样品申请
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 的输出数据速率决定了机器学习核心处理传感器数据并输出结果的频率。不同的应用场景可能需要不同的速率来平衡功耗和性能。这个表格的目的是让用户根据应用需求选择合适的输出数据速率。
执行流程
根据 AN5804 第三页的描述,LSM6DSV16X 传感器的 机器学习核心(MLC) 的流程可以分为以下几个步骤:
- 收集传感器数据:
○ MLC 从内置的加速度计、陀螺仪以及通过 I²C 接口连接的外部传感器(如磁力计)中收集三轴传感器数据。这些数据包括 X、Y、Z 轴的加速度和角速度。 - 处理传感器数据(计算块):
○ 在这一阶段,传感器数据经过预处理。MLC 会应用一些滤波器(如高通、低通或带通滤波器),并计算出用户配置的统计特征(例如均值、方差、能量、峰值等)。这些特征基于用户定义的时间窗口(window length)进行计算,时间窗口的长度决定了统计数据的覆盖范围。 - 构建决策树:
○ 处理后的特征作为输入被传递到决策树。决策树是一个二叉树结构,在每个节点中,特征值被与某个阈值进行比较,以决定继续走向下一节点的哪一条路径。这个过程会在决策树的各个节点中重复,直到生成最终的分类结果(例如:静止、行走、跑步等)。 - 输出分类结果:
○ 当决策树到达叶节点时,它会输出一个分类结果,这个结果表示所检测的动作或状态。结果会被存储在 MLC 的专用输出寄存器中,供外部微处理器读取。 - 可选的元分类器过滤:
○ 输出的分类结果还可以通过一种称为 meta-classifier(元分类器) 的过滤器进行处理。元分类器会根据多个分类结果的统计情况,减少短时的错误分类或不稳定的输出。例如,如果短时间内结果频繁变化,元分类器会稳定输出。
速率设置
设置了加速度计和陀螺仪的输出数据速率(ODR)为480Hz,这将使传感器以较高的速率采样数据。这种设置适用于需要高动态精度的应用场景,比如需要精确跟踪快速运动的应用。
lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_480Hz);
lsm6dsv16x_gy_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_480Hz);
量程设置
量程和分辨率的平衡:较大的量程适合高速动态的应用,但会降低测量的分辨率。如果你需要检测较小的变化或在低动态场景下使用,建议选择较小的量程,以获得更高的精度。
与MLC配合使用:如果你使用这些数据进行机器学习核心(MLC)的处理,确保量程设置适当,以便捕捉到足够的动态数据,同时保持数据的分辨率。
lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);
lsm6dsv16x_gy_full_scale_set(&dev_ctx, LSM6DSV16X_125dps);
检测状态
铅笔运动检测应用的构建,检测的四种不同场景(类别)。
- 静止(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.2f\t%4.2f\t%4.2f\t%4.2f\t%4.2f\t%4.2f\t\r\n",
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组数据。