【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 进行训练,看能否完成训练并进行实际部署使用。
|