主要内容

在Arduino硬件上使用机器学习算法识别穿孔和伸缩手势

此示例显示如何使用Simulink®支持包进行Arduino®硬件,金宝app使用机器学金宝app习算法识别Punch和Flex手势。该示例部署在Arduino Nano 33 IoT硬件板上,该硬件板使用车载LSM6DS3 6DOF传感器来识别手势。从机器学习算法的输出,在识别手势是否是冲头或弯曲之后,发送到串口,其中0表示冲头,1表示柔性。

依赖性

这个示例使用:

  • 金宝appSimu金宝applink支持包Arduino硬件

  • MATLAB®A金宝apprduino硬件支持包

  • DSP System Toolbox™

  • 统计和机器学习工具箱™

先决条件

所需的硬件

  • Arduino Nano 33 IoT板

  • USB电缆

硬件设置

使用USB电缆将Arduino Nano 33 IOT板连接到主计算机。

为训练机器学习算法准备数据集

此示例使用名为matlab代码文件capture_training_data测量Flex和Punch手势的原始数据。打开文件并配置这些参数。

  1. 中的加速度阈值加速察觉参数。本例中阈值设置为2.5

  2. 创建一个lsm6ds3对象并指定在读取功能的单个执行中读取的样本数。在此示例中,该参数设置为119.

  3. 指定while循环中每个手势要捕获的帧数。在这个例子中,100.每个手势都可以捕捉帧。

要捕获Flex手势手势,请在MATLAB命令窗口中运行此命令。

Flex = Capture_Training_Data;

把Arduino硬件放在你的手掌,扔一个弯曲。要为一个伸缩手势创建一个包含100帧的数据集,请将手伸100次。观察价值姿态没有。每次在MATLAB命令窗口中抛出FLEX时都会递增。

1×100的Flex手势数据样本可用于LSM6DS3 IMU传感器读取的工作空间中。右键单击工作区中的Flex并将其保存为flex_100.mat在示例的相同工作目录中。

遵循相同的过程以为打孔手势创建100个帧的数据集。

要捕获打拳手势,请在MATLAB命令窗口中运行此命令。

穿孔= capture_training_data;

将Arduino硬件握住手掌,然后扔一个打孔。要为打孔手势创建一个100帧的数据集,请将手丢弃100次。观察价值姿态没有。每次你在MATLAB命令窗口中打出一拳,它就会递增。

1×100打孔手势数据样本可用于由LSM6DS3 IMU传感器读取的工作空间中。右键单击工作区中的PANCL,并将其保存为punch_100.mat在示例的相同工作目录中。

为Flex和Punch手势创建自己的数据集时,请在MAT文件中使用相同的名称gr_script.matlab代码文件。

gr_script.MATLAB代码文件用于预处理和培训FLEX和PUNCH手势的数据集,使用数据集列车机器学习算法,并评估其性能,以准确预测这些手势。

编辑gr_script..m文件,在matlab®命令窗口中运行此命令。

编辑gr_script;

使用此MATLAB代码文件在支持包中准备SIMULINK模型,然后在Arduino金宝app硬件上部署模型。金宝app

或者,您还可以加载Flex和Punch数据集gr_script.在matlab中提供。

加载flex_100加载punch_100

为了训练和测试机器学习算法,从加速度计和陀螺仪读取119个数据样本。这119个样本被分成100帧,每帧代表一个手势。每一帧都有6个值,分别来自加速度计和陀螺仪的X、Y和Z轴。共有11900个这样的观察数据存储在两种不同手势的数据集中,弯曲和击打。

提取特征

通过采用框架中每列的平均值和标准偏差来提取特征。这导致每个手势的100×12矩阵。

f1 = Cellfun(@均值,柔性','统一输出',false);F2 = Cellfun(@ std,flex','serialOutput',false);Flexobs = Cell2mat([F1,F2]);Flexlabel = inton(100,1);
p1 = cellfun(@均值,打拳','serialOutput',false);p2 = Cellfun(@ std,punch','serialOutput',false);punchobs = cell2mat([p1,p2]);Pondlabel = 2 * =(100,1);
x = [flexobs; punchobs];y = [flexlabel; punchlabel];

准备数据

本例使用90%的观察结果来训练一个分类两种手势的模型,使用10%的观察结果来验证训练的模型。使用cvpartition为测试数据集指定10%的拒绝值。

RNG('默认')%用于再现性分区= CVPARTION(Y,'HOLDOUT',0.10);TrainingInds =培训(分区);训练集XTrain = x的%指数= x(TrainingInds,:);ytrain = y(traininginds);testinds =测试(分区);测试集xtest = x(testinds,:)的%索引;ytest = y(testinds);

在命令行培训决策树

训练分类模型。

treeMdl = fitctree (XTrain YTrain);

执行5倍交叉验证分类素..并计算验证精度。

partitionedmodel = crossval(treemdl,'kfold',5);ValidationAccuracy = 1-kfoldloss(PartitionedModel);
ans =
ValidationAccuracy = 1

评估测试数据的性能

评估测试数据集的性能。

testAccuracy =第一(treeMdl XTest、欧美)
ans =
testaccuracy = 1

训练有素的模型准确地对测试数据集上的100%进行了分类。此结果证实培训的模型不会过度措施,不会过度措施。

准备Simuli金宝appnk模型并校准参数

准备了分类模型后,使用gr_script..m文件作为Simulin金宝appk模型初始化函数。

要打开Simulink模金宝app型,请在MATLAB命令窗口中运行此命令。

Open_System('arduino_machinelearning')

Arduino Nano 33物联网板上有一个LSM6DS3 IMU传感器,可以测量沿X、Y和Z轴的线性加速度和角速度。2 .在“LSM6DS3 IMU传感器块参数”对话框中配置以下参数:

  1. 设置I2C地址传感器的0 x6a与传感器的加速度计和陀螺仪外设进行通信。

  2. 选择加速度(m / s ^ 2)角速度(rad / s)输出端口。

  3. 设置采样时间0.01

在“块参数”对话框中指定的采样时间,从LSM6DS3 IMU传感器收集1×3加速度和角速度矢量数据。然后在预处理子系统中预处理此数据。

要打开子系统,请在MATLAB命令窗口中运行此命令。

Open_System('arduino_machineLearearning / preprocessing')

加速度数据首先由m/s^2转换为g,然后对绝对值求和,每119个大于2.5g阈值的数据,则加速度值为datareadenable.函数块中的参数在逻辑上为真。这充当Classification区域中被触发子系统的触发器。

角速度数据从弧度转换为度数。加速度和角速度数据被复用并作为对开关的输入给出。对于大于0的数据值,缓冲区存储与冲头和柔性相对应的有效119手势值。对于小于零的数据值,这表明不检测到手势,将一系列(1,6)零被发送到输出以匹配组合的加速度和角速度数据。

在缓冲区块的“块参数”对话框中配置此参数。

  1. 设置输出缓冲区的大小参数到119.

通过计算帧中的每列的平均值和标准偏差值来提取特征,该帧为每个手势导致每个手势的100×12矩阵。这些提取的特征进一步传递为分类区域中的触发子系统的输入。

要打开子系统,请在MATLAB命令窗口中运行此命令。

Open_System('arduino_machinelearearning / triggered子系统')

速率转换块将数据从以一个速率工作的预处理子系统的输出传输到以不同速率工作的触发子系统的输入。

ClassificationTree Predict块是来自Statistics and Machine Learning Toolbox™的一个库块,它使用提取的特征对手势进行分类。此块使用treemdl.识别打孔和弯曲的机器学习模型。这个块输出预测的类标签。输出是0或1,分别对应穿孔或弯曲。

串行传输块参数被配置为它们的默认值。

在Arduin金宝appo板上部署Simulink模型

1.在硬件选项卡,单击金宝app构建,部署和启动

2.为了方便对机器学习算法识别的手势数据进行分析,在MATLAB命令窗口中运行以下脚本,并在Arduino串口上读取数据。

Device = SerialPort(,9600);虽然(true)rxdata =读取(设备,1,“双”);如果rxdata == 0 disp('punch');elsefif rxdata == 1 disp('flex');结束

更换港口参数使用Arduino Board的实际COM端口。由机器学习算法检测到的手势以9600的波特率显示在Arduino串口上,其中0表示冲头,1表示Flex。

3.将硬件放在手掌中并抛出冲头或弯曲。观察MATLAB命令窗口中的输出。

也可以看看