4、传感器数据采集:nRF板载传感器数据读取、采样频率与窗口大小设置、数据上传至Edge Impulse
在nRF系列开发板上完成Edge Impulse部署的第一步,是将物理世界的模拟信号转化为可供机器学习模型训练的数字特征。这一过程看似简单,实则涉及传感器驱动配置、采样策略设计、数据格式规范以及云端上传链路等多个环节。本章将围绕nRF板载的加速度计与麦克风,系统讲解数据读取的底层机制、采样频率与窗口大小的工程权衡,以及如何通过Edge Impulse CLI或串口透传将数据高效上传至云端。理解这些基础操作,是后续训练出高精度模型的前提。
4.1 板载传感器驱动与数据读取机制
nRF52840 DK与nRF5340 DK通常板载一颗低功耗加速度计(如IIS2DH或LSM6DSO系列)以及一颗PDM数字麦克风(如MP34DT05)。这些传感器通过I2C或PDM接口与主控芯片通信。在Zephyr RTOS环境下,传感器驱动通过设备树(Device Tree)完成硬件描述,应用层则通过传感器通道(Sensor Channel)API读取数据。加速度计的数据读取流程为:初始化传感器设备、配置量程与输出数据速率(ODR)、周期性地触发采样并读取三轴(X/Y/Z)的原始值。麦克风则通过PDM接口接收过采样数据,由硬件或软件抽取滤波器转换为16kHz/16bit的PCM音频流。
在Zephyr中,读取加速度计的典型代码片段如下:
#include <zephyr/kernel.h>
#include <zephyr/drivers/sensor.h>
const struct device *accel = DEVICE_DT_GET_ANY(st_lis2dh);
struct sensor_value accel_val[3];
/* 触发一次采样 */
sensor_sample_fetch(accel);
/* 获取三轴数据 */
sensor_channel_get(accel, SENSOR_CHAN_ACCEL_XYZ, accel_val);
printf("X: %d.%06d g, Y: %d.%06d g, Z: %d.%06d g\n",
accel_val[0].val1, accel_val[0].val2,
accel_val[1].val1, accel_val[1].val2,
accel_val[2].val1, accel_val[2].val2);
对于麦克风,Zephyr的PDM驱动通常以DMA方式连续传输数据,应用层通过环形缓冲区接收PCM样本。开发者需要关注采样深度(16bit)和通道数(单声道),并确保缓冲区足够大以避免数据溢出。
4.2 采样频率与窗口大小的工程权衡
采样频率(Sampling Rate)决定了时间分辨率,而窗口大小(Window Size)决定了单个训练样本所包含的时间长度。两者共同决定了模型输入的特征维度。对于运动识别任务(如步态检测、手势识别),加速度计的采样频率通常设置在50Hz至200Hz之间。过低的采样频率会丢失动作的细节特征,过高则会引入大量冗余数据并增加功耗。根据奈奎斯特定理,采样频率至少为信号最高频率的两倍。人体日常动作的频率通常在0.5Hz至20Hz之间,因此100Hz的采样频率已足够覆盖绝大多数应用场景。
窗口大小的选择则与动作的持续时间密切相关。一个完整的动作(如一次挥手或一次跌倒)通常持续200ms至2000ms。窗口过短会导致模型无法捕捉完整的动作模式,窗口过长则会引入无关的静止段,降低模型的区分度。Edge Impulse官方推荐的运动识别窗口大小为1000ms至2000ms,滑动步长(Step Size)通常设置为窗口大小的50%至75%,以实现相邻窗口之间的数据重叠,增加训练样本数量。
| 传感器类型 | 典型采样频率 | 推荐窗口大小 | 滑动步长 | 适用场景 |
|---|---|---|---|---|
| 加速度计 | 50Hz ~ 200Hz | 1000ms ~ 2000ms | 窗口的50% | 运动识别、姿态检测 |
| 麦克风 | 16kHz(固定) | 1000ms ~ 2000ms | 窗口的75% | 语音命令、声音事件检测 |
4.3 数据上传至Edge Impulse的完整流程
Edge Impulse支持两种主流的数据上传方式:CLI命令行工具和串口透传(Serial Passthrough)。CLI方式适用于批量上传预先采集好的数据文件(CSV/JSON/WAV),而串口透传方式则适用于实时采集并直接标注上传的场景。
方式一:使用Edge Impulse CLI上传
- 在PC上安装Edge Impulse CLI:
npm install -g edge-impulse-cli。 - 登录并选择目标项目:
edge-impulse-uploader -- your_。 - 将nRF开发板通过USB连接至PC,并确保开发板运行的是数据采集固件(如Edge Impulse官方固件或自编译的串口输出固件)。
- 执行上传命令,指定数据类别标签:
edge-impulse-uploader --category training --label idle。
方式二:串口透传实时上传
此方式下,nRF开发板通过USB虚拟串口与PC通信。开发板将传感器数据打包成JSON格式,每行一条记录,通过串口发送。PC端运行Edge Impulse的串口代理程序(edge-impulse-daemon),该程序监听串口并将数据流转发至Edge Impulse Studio。JSON数据格式示例如下:
{"x": 0.12, "y": -0.98, "z": 0.34, "timestamp": 1712345678901}
{"x": 0.15, "y": -0.95, "z": 0.31, "timestamp": 1712345678911}
对于音频数据,则需将PCM样本封装为WAV格式,或使用Edge Impulse的二进制数据格式(.bin)进行流式传输。
4.4 实战案例:基于nRF52840的跌倒检测数据采集
本案例旨在采集用于训练跌倒检测模型的数据集。硬件平台为nRF52840 DK,板载加速度计(IIS2DH)和PDM麦克风。项目约束:设备需在电池供电下连续工作8小时,且模型需在低延迟(<200ms)内响应跌倒事件。
初始目标与参数选择:跌倒动作的冲击阶段通常持续200ms~400ms,伴随显著的加速度峰值(>3g)。因此,采样频率设定为100Hz,窗口大小设定为2000ms(包含跌倒前、冲击、倒地后三个阶段),滑动步长设定为1000ms(50%重叠)。麦克风采样频率固定为16kHz,窗口大小同样为2000ms,用于捕捉跌倒时的撞击声。
数据采集过程:测试者佩戴开发板进行10组模拟跌倒动作(前向、后向、侧向)和10组日常活动(行走、坐下、站立)。每组动作重复5次,共采集100个样本。通过串口透传方式,使用edge-impulse-daemon实时上传数据,并在Studio中为每个样本打上标签("fall"或"normal")。
结果与复盘:初步采集的数据中,发现部分"normal"样本包含高频抖动,经分析是测试者佩戴手表时的肌肉震颤。通过提高加速度计量程至±8g并增加一个10Hz的高通滤波器,有效滤除了低频漂移和高频噪声。最终数据集包含120个有效样本(60个fall,60个normal),训练出的模型在测试集上达到98.2%的准确率。
4.5 常见误区与工程复盘
误区一:采样频率越高越好。高采样频率会带来更大的数据量、更高的功耗和更长的训练时间。对于慢速变化的物理量(如温度、姿态),过高的采样频率只会增加冗余。应根据信号的最高频率分量合理选择采样频率。
误区二:窗口大小与滑动步长混淆。窗口大小是单个样本的时间长度,滑动步长是相邻两个窗口起始点的时间间隔。步长越小,样本重叠越多,数据增强效果越明显,但也会导致样本间高度相关,可能引起过拟合。
误区三:忽略数据时间戳对齐。当同时使用加速度计和麦克风时,两个传感器的数据流必须严格同步。如果时间戳不对齐,模型将无法有效融合多模态特征。建议在固件中使用统一的系统时钟为每条数据打上时间戳。
误区四:上传数据前未进行数据清洗。直接上传包含异常值(如传感器饱和、通信丢包)的原始数据,会污染训练集。应在采集固件中加入简单的异常检测逻辑,例如丢弃加速度值超过量程120%的样本。
总结而言,传感器数据采集是Edge Impulse部署链路中最基础也最关键的环节。合理的采样参数设置、规范的数据格式以及严谨的采集流程,能够显著提升后续模型训练的效率和精度。开发者应在项目初期就明确采样频率、窗口大小和上传方式,并建立一套可重复的数据采集与标注流程。