这个例子展示了如何使用Simulink®Arduino®硬件支持包来金宝app识别穿孔和金宝app弯曲手势使用机器学习算法。该示例部署在Arduino Nano 33物联网硬件板上,使用板载LSM6DS3 6DOF IMU传感器来识别手势。机器学习算法在识别一个手势是打孔手势还是弯曲手势之后,输出被传输到串行端口,其中0表示打孔手势,1表示弯曲手势。
有关如何在Arduino硬件上运行Simulink模型的更多信息,请参见金宝app入门Arduino硬件.
有关机器学习的更多信息,请参见开始使用统计学和机器学习工具箱.
Arduino Nano 33物联网板
USB电缆
将Arduino Nano 33物联网板通过USB线连接到上位机。
这个例子使用的MATLAB代码文件名为capture_training_data
来测量弯曲和击打手势的原始数据。打开文件并配置这些参数。
中的加速度阈值accelerationThreshold
参数。本例中阈值设置为2.5
.
创建一个lsm6ds3
对象,并指定在read函数的一次执行中读取的样本数量。在本例中,参数设置为119
.
指定while循环中每个手势要捕获的帧数。在这个例子中,One hundred.
每个手势都可以捕捉帧。
要捕获伸缩手势,请在MATLAB命令窗口中运行此命令。
flex = capture_training_data;
把Arduino硬件放在你的手掌,扔一个弯曲。要为一个伸缩手势创建一个包含100帧的数据集,请将手伸100次。观察价值手势不。
每次你在MATLAB命令窗口中抛出一个flex时,它都会递增。
LSM6DS3 IMU传感器可以在Workspace中读取1 × 100的伸缩手势数据样本。右键单击工作区中的flex并将其保存为flex_100.mat
在示例的相同工作目录中。
按照相同的步骤为一个打孔手势创建一个包含100帧的数据集。
要捕获打拳手势,请在MATLAB命令窗口中运行此命令。
穿孔= capture_training_data;
把Arduino硬件放在你的手掌,并投掷一拳。要创建一个包含100帧的打拳手势数据集,你可以用手打拳100次。观察价值手势不。
每次你在MATLAB命令窗口中打出一拳,它就会递增。
LSM6DS3 IMU传感器可在Workspace中读取1 × 100冲孔手势数据样本。右键单击工作区并保存为punch_100.mat
在示例的相同工作目录中。
当您为flex和punch手势创建自己的数据集时,请使用相同的名称gr_script
MATLAB代码文件。
的gr_script
利用MATLAB代码文件对伸缩和打孔手势的数据集进行预处理和训练,用数据集训练机器学习算法,并对其性能进行评估,以准确预测这些手势。
编辑gr_script
.m文件,在MATLAB®命令窗口中运行此命令。
编辑gr_script;
使用此MATLAB代码文件编写支持包中的Simulink模型,然后将模型部署到Ar金宝appduino硬件上。金宝app
或者,您也可以加载flex和冲孔数据集gr_script
在MATLAB。
加载flex_100加载punch_100
为了训练和测试机器学习算法,从加速度计和陀螺仪读取119个数据样本。这119个样本被分成100帧,每帧代表一个手势。每一帧都有6个值,分别来自加速度计和陀螺仪的X、Y和Z轴。共有11900个这样的观察数据存储在两种不同手势的数据集中,弯曲和击打。
提取特征的方法是取一帧中每一列的均值和标准差。这就产生了一个100 × 12矩阵的观察每个手势。
f1 = cellfun (@mean, flex, UniformOutput假);f2 = cellfun (@std, flex, UniformOutput假);flexObs = cell2mat ((f1、f2));flexLabel = 1 (100 1);
p1 = cellfun (@mean拳”、“UniformOutput”,假);p2 = cellfun (@std拳”、“UniformOutput”,假);punchObs = cell2mat ((p1, p2));punchLabel = 2 * 1 (100 1);
X = [flexObs; punchObs];Y = [flexLabel; punchLabel];
本例使用90%的观察结果来训练一个分类两种手势的模型,使用10%的观察结果来验证训练的模型。使用cvpartition为测试数据集指定10%的拒绝值。
rng('default') % For再现性Partition = cvpartition(Y,'Holdout',0.10); / /复制trainingInds =培训(分区);%训练集指标XTrain = X(trainingInds,:);YTrain = Y (trainingInds);testInds =测试(分区);%测试集索引XTest = X(testInds,:);欧美= Y (testInds);
训练分类模型。
treeMdl = fitctree (XTrain YTrain);
执行5倍交叉验证classificationEnsemble
并计算验证精度。
partitionedModel = crossval (treeMdl KFold的5);validationAccuracy = 1-kfoldLoss (partitionedModel);
ans =
validationAccuracy = 1
评估测试数据集上的性能。
testAccuracy =第一(treeMdl XTest、欧美)
ans =
testAccuracy = 1
经过训练的模型对测试数据集上的手势进行了100%的准确分类。这一结果证实了训练模型没有过拟合训练数据集。
在准备好分类模型后,使用gr_script
.m文件作为Simulin金宝appk模型初始化函数。
要打开Simulink模金宝app型,请在MATLAB命令窗口中运行此命令。
open_system(“arduino_machinelearning”)
Arduino Nano 33物联网板上有一个LSM6DS3 IMU传感器,可以测量沿X、Y和Z轴的线性加速度和角速度。2 .在“LSM6DS3 IMU传感器块参数”对话框中配置以下参数:
设置I2C地址传感器的0 x6a
与传感器的加速度计和陀螺仪外设进行通信。
选择加速度(m / s ^ 2)和角速度(rad / s)输出端口。
设置样品时间来0.01
.
在块参数对话框中指定的采样时间,从LSM6DS3 IMU传感器收集1 × 3加速度和角速度矢量数据。然后在预处理子系统中对这些数据进行预处理。
要打开子系统,请在MATLAB命令窗口中运行此命令。
open_system (arduino_machinelearning /预处理)
加速度数据首先由m/s^2转换为g,然后对绝对值求和,每119个大于2.5g阈值的数据,则加速度值为dataReadEnable函数块中的参数在逻辑上为真。这充当Classification区域中被触发子系统的触发器。
角速度数据由弧度转换为度。加速度和角速度数据被多路复用,并作为输入给Switch。对于大于0的数据值,缓冲区存储对应于punch和flex的有效119手势值。对于小于零的数据值,即表示没有检测到手势,将一系列(1,6)零发送到输出,以匹配加速度和角速度组合数据。
在缓冲区的“块参数”对话框中配置。
设置输出缓冲区的大小参数119
.
通过计算一个框架中每一列的平均值和标准差值提取特征,得出每个手势的100 × 12矩阵观察结果。这些提取的特征将作为输入进一步传递给Classification区域中的Triggered子系统。
要打开子系统,请在MATLAB命令窗口中运行此命令。
open_system (arduino_machinelearning /触发子系统)
速率转换块将数据从以一个速率工作的预处理子系统的输出传输到以不同速率工作的触发子系统的输入。
ClassificationTree Predict块是来自Statistics and Machine Learning Toolbox™的一个库块,它使用提取的特征对手势进行分类。此块使用treeMdl
识别打孔和弯曲的机器学习模型。这个块输出预测的类标签。输出是0或1,分别对应穿孔或弯曲。
串行传输块参数被配置为它们的默认值。
1.在硬件选项卡中的金宝app模式部分中,选择机上运行然后点击构建、部署和启动.
2.为了方便对机器学习算法识别的手势数据进行分析,在MATLAB命令窗口中运行以下脚本,并在Arduino串口上读取数据。
设备=串口(< com_port >, 9600);while(true) rxData = read(device,1,"double");如果rxData = = 0 disp(“穿孔”);elseif rxData = = 1 disp (Flex的);结束结束
取代港口
参数与Arduino板实际的com端口一致。机器学习算法检测到的手势显示在Arduino串口上,波特率为9600,0表示打孔,1表示伸缩。
3.把硬件在你的手掌和投掷一拳或弯曲。观察MATLAB命令窗口中的输出。