如何使用机器学习核心检测倾角:以LSM6DSOX为例
机器学习核心(MLC)是嵌入传感器中的硬件处理引擎,能够运行基于决策树分类器的机器学习算法。MLC能够降低整个系统的功耗,因为它。。。
机器学习核心(MLC)是嵌入传感器中的硬件处理引擎,能够运行基于决策树分类器的机器学习算法。MLC能够降低整个系统的功耗,因为在传感器处理数据时,主机微控制器可以处于睡眠或待机状态。当传感器检测到特定事件并对其进行分类时,MLC可以产生中断并唤醒主机微控制器。在这篇知识文章中,我们将解释如何使用ST传感器LSM6DSOX或ISM330DHCX和工具Unico GUI构建机器学习算法来检测精确角度。本文作者:Luca Seghizi Andrea Vitali、Michael Galizzi(AME营销和应用团队)Federico Rizzardini、Lorenzo Bracco(MEMS软件开发团队)
LSM6DSOX中的加速度计能够检测倾斜角度:倾斜(0-180度范围)、俯仰(±90度范围)或全旋转角度(±180度范围)。
当加速度计平行于水平面放置且其Z轴指向上时,它会报告AccX=0 g,AccY=0 g,AcmZ=1 g。在Z轴上可以看到重力加速度。这个符号是正的,因为重力正在向下拉,这会产生与向上加速相同的效果。
绕Z轴旋转(也称为偏航,导致X轴和Y轴移动)不会改变加速度计的输出。在下图中,偏航角从左到右分别设置为0、-20、-40和-60度。加速度计输出始终为AccX=0 g、AccY=0 g和AccZ=1 g。
当加速度计在任何方向上倾斜时,重力矢量沿Z轴的投影减小,而沿X和Y轴的投影在正方向或负方向上增大。AccZ测量值在数学上与倾斜角度相关:AccZ=cos(倾斜角度)x 1g。倾斜角度定义为加速度计的垂直方向和Z轴之间的角度;它在下面的图片中以黄色突出显示。范围为0到180度。
通常,任何加速度计的倾斜都可以作为两次旋转的序列来获得。使用飞行动力学约定,根据标准DIN 9300命名的轴,第一个是绕Y轴的旋转(也称为俯仰,导致X和Z轴移动,范围为±90度),第二个是绕X轴的旋转,也称为滚转,导致Y和Z移动,范围±180度)。请注意,Android平台有一个不同的命名约定:第一个是绕Y轴旋转,平行于智能手机的左右边缘(此旋转定义为滚动,范围±90度),第二个是绕X轴旋转,垂直于底部和顶部边缘(此旋转定义为俯仰,范围±180度)。
在下面的图片中,俯仰角从左到右设置为0、+15、+30、+45度。俯仰是围绕Y轴的旋转,因此AccY测量值不会改变。AccZ和AccX测量值在数学上与俯仰角相关联:AccZ=cos(俯仰角)x 1g,AccX=sin(俯仰角;它在下面的图片中以绿色突出显示。范围从-90度到+90度。有关如何计算倾斜角度的更多信息,请参阅设计提示DT0140。
安装C编译器也是必要的。本教程介绍了在Windows上使用GCC编译器(使用Cygwin)进行编译的过程。请注意,Cygwin-bin目录(通常为“C:\cygwin64\bin”)应添加到Windows PATH环境变量中。可以通过在Windows命令提示符中编写GCC-v命令来检查GCC安装是否成功(它应该显示GCC配置及其版本)。
为了进一步评估本教程的输出,值得一提的是以下软件工具:
有关更多硬件详细信息,请访问:
我们将经历以下过程:
强制性参数:
如果加速度计未安装在水平面上,则“垂直”轴与AccZ不对应。例如,IIS2ICLX是一个2轴加速度计,其中只有AccX和AccY可用。如果安装时AccX指向上,AccY在水平面上,以支持双模式和全旋转角度检测,则必须设置vstr=“AccX”和hstr=“AccY”。
LSM6DSOX文件夹显示了创建倾角检测配置并将其集成到STWIN板和SensorTile.box板上的逐步过程。
打开Windows命令提示符(例如,按Win+R,键入cmd并按Enter键),然后转到DecisionTree_for_AngleDetection.c所在的文件夹。例如,如果文件位于
“C:\DecisionTree_for_AngleDetection_script”,则可以使用以下命令:
cd C:\DecisionTree_for_AngleDetection_script
如下图所示,可以通过写入命令dir或ls来验证正确的位置(必须列出DecisionTree_for_AngleDetection.c):
执行以下命令以构建DecisionTree_for_AngleDetection.c:
如果未使用任何参数,程序将以交互模式打开,用户需要输入参数来配置决策树。需要选择的第一个参数是角度检测的模式。
对于本例,我们将选择模式2,该模式配置决策树以检测在给定范围内围绕第三轴约束的旋转。然后程序将询问以下信息:
在本教程中,输入将如下图所示:
所需参数输入完成后,程序将在程序文件夹中生成两个文件(dectree.txt和session.txt),命令提示符中还会显示有用信息列表。
确认有关有限功能的消息(仅当选择了脱机模式时)并打开MLC窗口:
单击MLC按钮打开机器学习核心选项卡:
直接转到“配置”选项卡:
选择LSM6DSOX并选择MLC和传感器所需的参数。本教程所选的传感器和MLC输出数据速率(ODR)配置如下图所示:
从列表中选择一个决策树,然后继续配置MLC。窗口长度应配置为1个样本以最大限度地减少延迟,每个样本的输出都会更新。在本例中,ODR设置为52Hz,因此输出每秒更新52次,每19.23ms更新一次。由于平均特征选择如下,因此更长的窗口可以用于频率较低但更稳定的输出:
在下一步中,检查加速度计X轴(ACC_X)和Z轴(ACC_6)的平均功能:
在下一节中,需要提供每个功能的决策树属性名称。生成的决策树会话文件(session.txt)包含需要使用的名称:
复制属性名称后,还必须从决策树会话文件中复制结果标签,如下所示:
接下来的步骤是导入程序生成的决策树(dectree.txt),并为要保存的.ucf配置文件选择输出名称:
此时,.ucf文件已经生成,并且可以关闭Unico GUI。
由于加速度计的ODR和机器学习核心的ODR已在Unico GUI中设置为52 Hz,因此在[Sensor Hub]构建块中,我们还需要将数据速率设置为52赫兹。要更改配置,请单击[Sensor Hub]构建块并按下图所示进行配置:
在这一点上,我们需要拖放构建示例项目所需的所有构建块。从左侧列表中,只需拖放所需的所有块即可:
1x传感器集线器->加速度[g]1x传感器集线器->FSM/MLC 1x显示->图形1x显示->Value 1x Other->Int to Float 2x Constants->Constant(Float)1x Math Operators->Multiply(*)1x数学运算符->Add(+)1x Display->Angle Level。
砌块的放置应如下图所示:
某些显示块在连接到其他块之前必须正确配置,因为连接的块之间的输入/输出类型必须匹配;请参阅下图以正确配置它们:
通过选择FSM/MLC构建块导入.ucf文件,如下图所示:
乘法和求和块已被放置以根据机器学习核心输出寄存器的值来实现角度的计算。公式可以在session.txt中的角度和转换公式部分找到,如下所示:
在顶部菜单上,单击固件->生成C代码。C代码生成完成后,单击固件->构建固件。如果有任何错误,编译应成功完成,如下图所示:
SensorTile.box必须处于DFU(直接固件升级)模式,然后才能进行编程:断开电池连接,按住启动按钮,插入USB为目标微控制器供电。
此时,单击AlgoBuilder GUI中的Program Target(程序目标),如图所示。
AlgoBuilder应该检测SensorTile.box并对生成的二进制文件进行编程。AlgoBuilder可以关闭。
要查看检测到的角度,请单击左侧面板上的“角度”级别。将板相对于地平线移动+/-6度,以查看实时检测到的变化。
当第三轴(Y)可用时,可以选择双+模式使用第三轴,并检查旋转是否确实受到约束(abs(Y)<阈值)。可以通过使用AccY的所选特征的绝对值来简化决策树。
优化模式可以提供更浅的树或决策阈值,它们离区间中心更远,从而对RMS噪声具有更强的鲁棒性。RMS噪声总是可以通过选择更长的窗口来计算平均特征并通过启用数字低通滤波器来降低。
当指定RMS噪声水平时,可能因噪声而导致错误分类的间隔在C实用程序的控制台输出中用星号突出显示,并在下图中用红色突出显示:
本示例涵盖3轴加速度计LSM6DSOX:

整个示例以及其他传感器的更多配置也可以在ST GitHub存储库中的链接中找到:
STMicroelectronics/sTMicroelectrical_L主机上的STMicro_Machine_Learning_Core/tools/mlc_tilt_angle_tool。。。
启动前
如何使用加速度计来检测角度倾斜?
LSM6DSOX中的加速度计能够检测倾斜角度:倾斜(0-180度范围)、俯仰(±90度范围)或全旋转角度(±180度范围)。
当加速度计平行于水平面放置且其Z轴指向上时,它会报告AccX=0 g,AccY=0 g,AcmZ=1 g。在Z轴上可以看到重力加速度。这个符号是正的,因为重力正在向下拉,这会产生与向上加速相同的效果。
绕Z轴旋转(也称为偏航,导致X轴和Y轴移动)不会改变加速度计的输出。在下图中,偏航角从左到右分别设置为0、-20、-40和-60度。加速度计输出始终为AccX=0 g、AccY=0 g和AccZ=1 g。

通常,任何加速度计的倾斜都可以作为两次旋转的序列来获得。使用飞行动力学约定,根据标准DIN 9300命名的轴,第一个是绕Y轴的旋转(也称为俯仰,导致X和Z轴移动,范围为±90度),第二个是绕X轴的旋转,也称为滚转,导致Y和Z移动,范围±180度)。请注意,Android平台有一个不同的命名约定:第一个是绕Y轴旋转,平行于智能手机的左右边缘(此旋转定义为滚动,范围±90度),第二个是绕X轴旋转,垂直于底部和顶部边缘(此旋转定义为俯仰,范围±180度)。
在下面的图片中,俯仰角从左到右设置为0、+15、+30、+45度。俯仰是围绕Y轴的旋转,因此AccY测量值不会改变。AccZ和AccX测量值在数学上与俯仰角相关联:AccZ=cos(俯仰角)x 1g,AccX=sin(俯仰角;它在下面的图片中以绿色突出显示。范围从-90度到+90度。有关如何计算倾斜角度的更多信息,请参阅设计提示DT0140。

在下面的图片中,从左到右,滚动角度设置为0、+10、+20、+30度。滚动是围绕X轴的旋转,因此AccX测量值不会改变。AccY=sin(滚转)cos(俯仰)x1 g,AccZ=cos(滚转)cos(俯仰)x 1g。注意,倾斜角将受到滚转和俯仰的影响:AccZ=cos(俯仰)x1g=cos(滚转)余弦(俯仰)*1 g,仅当俯仰为0度(绕x旋转受限)时,倾斜角与滚转角相同,或仅当滚转为0度时(绕Y旋转受限),倾斜角才与俯仰角相同。

可以根据AccY和AccZ的比率来计算滚转:AccY/AccZ=sin(滚转)/cos(滚转)=tan(滚转),roll=arctan(AccY/AccZ)或roll=arctan2(AccY,AccZ。
有关如何计算滚转角和俯仰角的更多信息,请参阅设计提示DT0058。
有关如何计算滚转角和俯仰角的更多信息,请参阅设计提示DT0058。
开始之前,您需要的材料
软件
我们将在这篇知识文章中使用的主要且强制性的软件工具是Unico GUI,这是一个图形用户界面(可用于Linux、MacOS和Windows),支持各种传感器,并允许构建MLC程序(即使没有任何板连接=离线模式)和生成传感器配置文件(UCF文件)。安装C编译器也是必要的。本教程介绍了在Windows上使用GCC编译器(使用Cygwin)进行编译的过程。请注意,Cygwin-bin目录(通常为“C:\cygwin64\bin”)应添加到Windows PATH环境变量中。可以通过在Windows命令提示符中编写GCC-v命令来检查GCC安装是否成功(它应该显示GCC配置及其版本)。
为了进一步评估本教程的输出,值得一提的是以下软件工具:
- Unico GUI,一个全面的软件包,无需任何板即可用于生成所有MEMS传感器(加速度计、陀螺仪、磁力计和环境传感器)的配置。
- AlgoBuilder是一款PC应用程序,用于为STM32 Nucleo板(与MEMS扩展板耦合)或形状因子评估板(如SensorTile.box)设计定制处理流程并构建固件
- Unicleo GUI,一个连接到STM32 Nucleo板或SensorTile.box的PC应用程序,用于实时显示接收到的数据
硬件
SensorTile.box多传感器套件用于本教程,尤其是LSM6DSOX传感器。此处显示的相同程序也适用于配备机器学习核心的其他ST传感器。有关更多硬件详细信息,请访问:
- MEMS传感器ST资源页
- 探索MEMS传感器中的机器学习核心的ST资源页面
- AN5259关于嵌入LSM6DSOX的机器学习核心的应用说明
如何构建决策树
这篇知识文章描述了如何构建和使用DecisionTree_for_AngleDetection.c程序,您可以在Github上找到该程序来生成用于倾斜传感的决策树,如何从决策树中为LSM6DSOX的机器学习核心(MLC)创建UCF配置文件(.UCF),以及最后如何评估结果。我们将经历以下过程:
- 如何构建DecisionTree_for_AngleDetection.c程序
- 如何运行程序生成用于倾角测量的定制决策树
- 如何使用Unico GUI从先前生成的决策树文件中生成传感器配置文件(UCF文件)
- 如何使用AlgoBuilder创建项目,导入UCF文件并编程SensorTile.box评估平台
- 如何使用Unicleo GUI并评估MLC结果
1.C用于设计倾斜角检测的决策树的实用程序
C实用程序旨在支持所有配备机器学习核心的传感器,并提供最大的灵活性。下面是可以在命令行上传递的参数列表(如果未指定参数,则实用程序将进入交互模式并提示用户)。强制性参数:
- m模式:0(横轴模式,AccX用于检测俯仰角),1(纵轴模式,AckZ用于检测倾斜角),2(双轴模式,AccX和AccZ用于检测全旋转角),3(双+轴模式,类似于双轴模式,但也使用第三轴,检查AccY以验证其接近0g)。
- a1第一个角度(以度为单位):对于俯仰a1≥-90,对于倾斜度a1≥0,对于整圈旋转a1≥-180度。
- a2最后一个角度(以度为单位):对于节距a2≤+90,对于倾斜度a2≤180,对于整周旋转a2≤+180度(注意:+180与-180相同,当a1=-180时设置a2<180可能有用,或者当a2=+180时设置a1>-180可能有用,见下例)。
- N个区间,决策树的叶子。最大间隔数取决于设备。示例:对于LSM6DSOX,N=16。
- opt优化模式:0表示浅树(最适合水平或垂直模式),1表示噪声安全树(最适用于双轴模式)。浅树模式对尽可能均匀地划分间隔集的阈值进行优先级排序,以最小化树的总体深度;噪声安全模式优先考虑与区间中心距离最大的阈值,这样就不太可能因为噪声而越界和错误分类。
- g重力矢量值:1g对应的值取决于设备。示例:LSM6DSOX为1.0。
- RMS噪声值:该值可从传感器数据表中获得。如果指定了噪声密度,则计算RMS=噪声密度x sqrt(带宽),其中带宽取决于配置的低通滤波器,当未配置低通滤波器时,带宽=输出数据速率/2。如果指定了它,C实用程序可以验证哪个间隔容易被错误分类:如果到阈值的距离小于3 x RMS水平,则风险大于0.4%,并且该间隔将在控制台输出中用星号标记。
- 双+模式下第三轴(Y)的阈值:当模式m=3时,用两个额外的决策节点扩展决策树,以验证第三轴接近0:abs(Y)<th,即Y>-th和Y<+th。如果该条件成立,则围绕第三轴约束旋转,并且可以执行旋转角度的检测,否则将发出与无效间隔(-1)相对应的输出代码。
- hofs、hsns、hstr:水平轴的偏移、灵敏度和字符串。默认值分别为0.0、1.0和AccX。
- vofs、vsns、vstr:垂直轴的偏移量、灵敏度和字符串。默认值分别为0.0、1.0和AccZ。
- tofs、tsns、tstr:三分轴的偏移量、灵敏度和字符串。默认值分别为0.0、1.0和AccY。
如果加速度计未安装在水平面上,则“垂直”轴与AccZ不对应。例如,IIS2ICLX是一个2轴加速度计,其中只有AccX和AccY可用。如果安装时AccX指向上,AccY在水平面上,以支持双模式和全旋转角度检测,则必须设置vstr=“AccX”和hstr=“AccY”。
LSM6DSOX文件夹显示了创建倾角检测配置并将其集成到STWIN板和SensorTile.box板上的逐步过程。
1.2如何构建C程序员
将DecisionTree_for_AngleDetection.c文件下载到您的电脑。该程序可以在文本编辑器中根据用户的需要进行修改。然而,在许多情况下或为了进行基本评估,程序可以在不进行修改的情况下使用。打开Windows命令提示符(例如,按Win+R,键入cmd并按Enter键),然后转到DecisionTree_for_AngleDetection.c所在的文件夹。例如,如果文件位于
“C:\DecisionTree_for_AngleDetection_script”,则可以使用以下命令:
cd C:\DecisionTree_for_AngleDetection_script
如下图所示,可以通过写入命令dir或ls来验证正确的位置(必须列出DecisionTree_for_AngleDetection.c):

执行以下命令以构建DecisionTree_for_AngleDetection.c:
gcc DecisionTree_for_AngleDetection。c-lm-o DecisionTree_for_AngleDetection
该命令在当前文件夹中创建一个可执行文件(在本例中为“DecisionTree_for_AngleDetection.exe”)。在Windows下,.exe扩展名会自动附加到可执行文件名。
2.使用构建的程序生成决策树
构建程序后,可以使用以下命令运行该程序:“DecisionTree_for_AngleDetection.exe”如果未使用任何参数,程序将以交互模式打开,用户需要输入参数来配置决策树。需要选择的第一个参数是角度检测的模式。

- 第一个角度(在本教程中设置为-40度)。它必须是介于-180到180[deg]之间的整数。
- 最后一个角度(在本教程中设置为100度)。它必须是介于-180到180[deg]之间的整数。此角度必须大于第一个角度
- 叶数(在本教程中设置为16)。它必须是介于2-255之间的整数。叶子的数量受到传感器“每个决策树的最大结果数”的限制。对于LSM6DSOX,最大数量为16:

- opt(在本教程中设置为1)。用于确定浅树(0)或噪声安全树(1)的使用的值。
- g(在本教程中设置为1)。1g对应的值取决于传感器型号。
- RMS噪声(在本教程中设置为0.0018)。它必须是所选满量程数据表上报告的RMS噪声值。对于LSM6DSOX,正常/低功率模式下的加速度RMS噪声为1.8 mg(0.0018 g):


- dectree.txt文件包含可以在Unico GUI软件中导入的决策树。
- 文件session.txt包含决策树和更多信息,如:--角度和转换公式部分:报告程序通过输入参数获得的角度分辨率。它还报告了决策树能够检测到的角度列表。输出代码的转换公式是需要应用于MLC输出代码以具有以度为单位的对应角度的公式。——输出代码/标签部分:是MLC输出的输出代码列表。它用于在生成.ucf配置文件的过程中标记Unico GUI工具中的输出。——其他信息部分:报告决策树的最大递归级别和容易产生RMS噪声的角度数量。
3.生成Unico配置文件(UCF文件)
DecisionTree_for_AngleDetection.exe程序生成决策树文件后,打开Unico GUI软件工具,从设备类型列表中选择“iNEMO惯性模块”,然后从设备名称列表中选择”STEVAL-MKI197V1(LSM6DSOX)“项目。你不需要有电路板,但在那里你可以找到LSM6DSOX MEMS设备。必须取消选中“与主板通信[启用]”选项框才能启用脱机模式(不需要硬件)。然后点击“选择设备”按钮或双击“STEVAL-MKI197V1(LSM6DSOX)”。
确认有关有限功能的消息(仅当选择了脱机模式时)并打开MLC窗口:

单击MLC按钮打开机器学习核心选项卡:







接下来的步骤是导入程序生成的决策树(dectree.txt),并为要保存的.ucf配置文件选择输出名称:


4.AlgoBuilder项目
为了测试本教程中使用Unico GUI创建的.ucf文件,我们使用AlgoBuilder创建了一个项目。打开AlgoBuilder,然后单击“文件”->“新建设计”。从固件设置窗口中选择固件位置、工具链和目标平台,如下图所示:
由于加速度计的ODR和机器学习核心的ODR已在Unico GUI中设置为52 Hz,因此在[Sensor Hub]构建块中,我们还需要将数据速率设置为52赫兹。要更改配置,请单击[Sensor Hub]构建块并按下图所示进行配置:

在这一点上,我们需要拖放构建示例项目所需的所有构建块。从左侧列表中,只需拖放所需的所有块即可:
1x传感器集线器->加速度[g]1x传感器集线器->FSM/MLC 1x显示->图形1x显示->Value 1x Other->Int to Float 2x Constants->Constant(Float)1x Math Operators->Multiply(*)1x数学运算符->Add(+)1x Display->Angle Level。
砌块的放置应如下图所示:







5.编程SensorTile.box

SensorTile.box必须处于DFU(直接固件升级)模式,然后才能进行编程:断开电池连接,按住启动按钮,插入USB为目标微控制器供电。

此时,单击AlgoBuilder GUI中的Program Target(程序目标),如图所示。

AlgoBuilder应该检测SensorTile.box并对生成的二进制文件进行编程。AlgoBuilder可以关闭。
5.测试MLC角度检测
打开Unicleo GUI软件。软件应自动检测并连接到SensorTile.box。按下“开始”按钮从SensorTile.box开始流式传输。
要查看检测到的角度,请单击左侧面板上的“角度”级别。将板相对于地平线移动+/-6度,以查看实时检测到的变化。

决策树示例-双轴模式
双轴模式支持从-180到+180度的全旋转范围。然而,这两个角度表示相同的方向(“倒置”位置)。如果要检测倒置位置在哪一侧,例如-179.9度或+179.9度,则使用以下决策树。否则,最好去掉-180或+180,这样当设备处于上行位置时,输出代码就不会在这两个值之间振荡。

当第三轴(Y)可用时,可以选择双+模式使用第三轴,并检查旋转是否确实受到约束(abs(Y)<阈值)。可以通过使用AccY的所选特征的绝对值来简化决策树。

优化模式可以提供更浅的树或决策阈值,它们离区间中心更远,从而对RMS噪声具有更强的鲁棒性。RMS噪声总是可以通过选择更长的窗口来计算平均特征并通过启用数字低通滤波器来降低。


当指定RMS噪声水平时,可能因噪声而导致错误分类的间隔在C实用程序的控制台输出中用星号突出显示,并在下图中用红色突出显示:



结论
在这篇知识文章中,我们展示了如何使用LSM6DSOX传感器在机器学习核心上实现倾角杠杆。整个示例以及其他传感器的更多配置也可以在ST GitHub存储库中的链接中找到:
STMicroelectronics/sTMicroelectrical_L主机上的STMicro_Machine_Learning_Core/tools/mlc_tilt_angle_tool。。。