4、传感器数据采集:nRF板载传感器数据读取、采样频率与窗口大小设置、数据上传至Edge Impulse

在nRF系列开发板上完成Edge Impulse部署的第一步,是将物理世界的模拟信号转化为可供机器学习模型训练的数字特征。这一过程看似简单,实则涉及传感器驱动配置、采样策略设计、数据格式规范以及云端上传链路等多个环节。本章将围绕nRF板载的加速度计与麦克风,系统讲解数据读取的底层机制、采样频率与窗口大小的工程权衡,以及如何通过Edge Impulse CLI或串口透传将数据高效上传至云端。理解这些基础操作,是后续训练出高精度模型的前提。

传感器物理层 采样与窗口化 Edge Impulse 云端 加速度计 (IIS2DH/LSM6DSO) ±2g/±4g/±8g/±16g 麦克风 (PDM 数字麦克风) 16kHz/16bit 单声道 nRF52840/nRF5340 I2C / PDM 接口 采样频率设置 IMU: 50Hz~200Hz / 音频: 16kHz 窗口大小 (Window Size) IMU: 100~2000ms / 音频: 1000~2000ms 滑动步长 (Step Size) 通常为窗口的 50%~75% 数据格式: JSON / CSV / WAV 时间戳 + 多轴数值 Edge Impulse Studio 项目创建与数据管理 CLI 上传工具 edge-impulse-uploader 串口透传模式 nRF 作为串口从设备 数据标签与验证集 按类别组织样本 I2C 地址: 0x18 / 0x6B Nyquist 定理约束 认证

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音频流。

核心要点:加速度计的数据读取并非直接获取物理量,而是获取ADC原始计数。需要根据量程和灵敏度将原始值转换为g值(重力加速度单位)。例如,IIS2DH在±2g量程下,灵敏度为1mg/LSB,即原始值乘以0.001即可得到以g为单位的加速度值。麦克风的PDM数据流则需要经过抽取和低通滤波,才能得到可用的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% 语音命令、声音事件检测
风险提示:对于音频数据,窗口大小直接决定了FFT的频率分辨率。例如,16000个样本点(1秒)经过FFT后,频率分辨率为1Hz。如果窗口缩短至500ms,频率分辨率将降至2Hz,可能无法区分相近的语音音素。因此,音频任务的窗口大小不宜低于1000ms。

4.3 数据上传至Edge Impulse的完整流程

Edge Impulse支持两种主流的数据上传方式:CLI命令行工具和串口透传(Serial Passthrough)。CLI方式适用于批量上传预先采集好的数据文件(CSV/JSON/WAV),而串口透传方式则适用于实时采集并直接标注上传的场景。

方式一:使用Edge Impulse CLI上传

  1. 在PC上安装Edge Impulse CLI:npm install -g edge-impulse-cli。
  2. 登录并选择目标项目:edge-impulse-uploader -- your_。
  3. 将nRF开发板通过USB连接至PC,并确保开发板运行的是数据采集固件(如Edge Impulse官方固件或自编译的串口输出固件)。
  4. 执行上传命令,指定数据类别标签: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部署链路中最基础也最关键的环节。合理的采样参数设置、规范的数据格式以及严谨的采集流程,能够显著提升后续模型训练的效率和精度。开发者应在项目初期就明确采样频率、窗口大小和上传方式,并建立一套可重复的数据采集与标注流程。