117|0

278

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【Follow me第二季第4期】通过IMU识别运动状态(上) [复制链接]

 

在之前的分享 【Follow me第二季第4期】任务二:IMU知识+IMU数据读取+IMU控制立方体 ,介绍了 Arduino® Nano RP2040 Connect 板载IMU运动传感器 LSM6DSOXTR的基本使用。

而选做任务二(非必做):通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。

 

LSM6DSOXTR是ST出的,官方提供了专门的软件,来进行训练,可是需要对应的开发板来支持。

相关的研究信息,可以查看了解:网友分享汇总(含作品)——2020年ST MEMS传感器创意设计大赛 - ST MEMS传感器创意设计大赛专区

 

好在ST官方提供了预训练的模型,可以在micropython的lsm6dsox支持库中,直接调用,非常的方便。

 

一、模型下载

ST官方给提供的预训练模型仓库地址:

链接已隐藏,如需查看请登录或者注册

 

其中包含了多种预训练模型数据。

 

这里选取其中较为常用的两种:

1. Vibration monitoring

 

 

2. Head gestures

 

下载其中的ucf文件,放到开发板micropython环境的根目录:

 

 

二、模型调用代码

在 Arduino® Nano RP2040 Connect 官方提供的案例中,有对应的参考案例:MicroPython and the IMU Machine Learning Core Features | Arduino Documentation

要在micropython使用,需要参考 【Follow me第二季第4期】任务一:极简环境+快速烧录+花样点灯+结果输出+小知识 中安装micropython的OpenMV版本。

参考官方案例,稍作修改,对应的代码如下:

from lsm6dsox import LSM6DSOX
from machine import Pin, I2C

INT_MODE = True         # 中断使能
INT_FLAG = False        # 启动时,没有待处理中断

CHECK_TYPE = 0			# 0:Vibration Monitoring(振动监测) 1:Head gestures(头部动作识别)

# 定义中断处理函数.
def imu_int_handler(pin):
    global INT_FLAG
    INT_FLAG = True

# 配置外部中断(IMU)
if (INT_MODE == True):
    int_pin = Pin(24)
    int_pin.irq(handler = imu_int_handler, trigger = Pin.IRQ_RISING)

# 初始化I2C设备
i2c = I2C(0, scl=Pin(13), sda=Pin(12))

# 预训练模型配置
# 注意: 所选数据速率和比例必须与MLC数据速率和规模配置相匹配
if not CHECK_TYPE == 1:
    UCF_FILE = "lsm6dsox_vibration_monitoring.ucf"
    #UCF_LABELS = {0: "no vibration", 1: "low vibration", 2: "high vibration"}
    UCF_LABELS = {0: "无振动", 1: "低振动", 2: "高振动"}
else:
    UCF_FILE = "lsm6dsox_head_gestures.ucf"
    UCF_LABELS = {0: "点头", 1: "摇动", 2: "静止", 3:"摇摆", 4:"步行"}

# 加载模型数据
lsm = LSM6DSOX(i2c, gyro_odr = 26, accel_odr = 26, gyro_scale = 2000, accel_scale = 4, ucf = UCF_FILE)

# 检测和输出
print("\n--------------------------------")
if not CHECK_TYPE == 1:
    print("- 振动监测 -")
else:
    print("- 头部姿势识别 -")
print("--------------------------------\n")
print("- MLC configured...\n")

while (True):
    if (INT_MODE):
        if (INT_FLAG):
            # 检测到中断,读取MLC输出并将其转换为人类可读的描述
            INT_FLAG = False
            print("-", UCF_LABELS[lsm.mlc_output()[0]])
    else:
        buf = lsm.mlc_output()
        if (buf != None):
            print(UCF_LABELS[buf[0]])

 

在 LSM6DSOXTR  内部有机器学习决策单元:

当我们加载模型数据到其中时,就会根据触感器数据和模型来输出识别结果,从而被 Arduino® Nano RP2040 Connect 的主控RP2040获取到。

关于这两个模型的具体机器学习配置信息,可以查看:

链接已隐藏,如需查看请登录或者注册
 和 
链接已隐藏,如需查看请登录或者注册

 

三、使用识别效果

1. 振动监测:

当设置 CHECK_TYPE=0 时,使用振动监测模型,用于监测物体的振动情况,例如可以放在抽油烟机或者洗衣机上,或者工业机器上面,检测振动是否正常。

启动运行后,输出结果如下:

 

当用力敲击开发板,或者把开发板拿起砸几下,就会看到检测状态发生了而变化:

 

2. 头部运动识别

当设置 CHECK_TYPE=1 时,使用头部运动识别模型,这属于可穿戴设备的范畴,可以装上锂电,然后绑在头上测试。

启动运行后,输出结果如下:

 

如果左右转动头部,可以看到识别结果发生变化:

 

如果快速的摇头晃脑,则会出现如下的识别状态:

  注意:摇头晃脑的时候,注意选择合适的位置,并手扶依靠物,一面头晕目眩不慎失足跌倒。

 

不过,点头和步行的两个动作,中途识别过几次,但是不能稳定的识别出来,可能与佩戴方式有关。

 

在ST官方提供的模型仓库中,还有其他的预训练模型,大家如果感兴趣的话,可以前去尝试。

不过,使用别人预训练的模型,总是觉得不如意,后面尝试使用 edgeimpulse 进行训练,看能否完成训练并进行实际部署使用。

点赞(1) 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表