上周接了个魔杖的外包项目,需要实现的效果见因为懒得下床关灯,我做了一根魔杖_哔哩哔哩_bilibili
项目关键点
- 动作的识别,考虑使用ANN进行分类识别,但因为魔杖大小的原因,微控的算力并不充足,所以模型优化和移植微控就很重要
- 数据采集使用esp32的触摸引脚,按下开始,松开结束;本身不存储数据,通过ws向所有连接的设备广播;上位机采用前端接受训练数据的采集和保存,采用python接受成预测输入的原始数据
- 采用MQTT集成通知HA
- 训练预测先在PC的python中进行,后续考虑移植到微控上
未行通方案:
最开始尝试利用mpu6050的6轴数据结算移动路径,然后用MSE来进行路径匹配的;但是试了一下最多只能结算出姿态,而且pitch维度因为地球重力的原因存在漂移,不准确;至于路径需要加速度进行两次积分,偏移上天了都,卡尔曼滤波也没辙。于是放弃路径匹配的方案,考虑使用原始6轴数据进行多分类
数据采集:
Esp32开启websocket服务在8080端口,编写一个前端网页,使用ws连接esp32。当esp32的电容触摸引脚被按下时,设置isRecording=true,ws发送“start”信息,然后开始用ws流式传输传感器数据,采样频率设置为100HZ。松开电容引脚按钮,isRecording=false,并发送“end”告知一次数据采集结束。
网页会记录下每次采集的数据,并提供检查、选择、删除的功能,确认无误后导出为csv,作为一个动作的训练数据。采集新的动作数据时F5刷新网页,然后采集。

训练和预测:
所有动作的csv在PC使用python进行预处理,训练测试集划分,模型训练保存,以及开启预测模式;预测模式下同样使用WS获取动作数据,利用ANN/LDA/KNN等方法预测后,用ws返回预测结果给esp32
对于每个动作采样数不固定的问题,使用插值算法interpolate_data.py将每个动作都转成固定100帧采样,然后通过normalize_data.py将时间戳归一化到0-1之间(训练暂时没有使用到时间戳)。
训练完毕通过joblib保存,预测运行predictor.py,加载模型,接收WS传来的数据后同样进行插值,归一化,然后预测并返回结果
通知HA
ESP32在连接MQTT后通过MQTT发现功能自动配置触发器设备,方便用户直接在HA中配置自动化(下图为自动配置代码和配置完成的效果)。具体发现配置参考HA官方文档


ESP32收到结果后通过MQTT使用预先设定好的topic通知Homeassistant,HA再设置自动化控制物联设备
现阶段成果
采用LDA降维和分类,上下左右方向折返运动的动作分类效果良好,下图是正确率和LDA 3维投影的结果;但加入圆圈和三角时候正确率下降,测试后发现应该是圆圈和4个折返动作存在相似性导致,后续要优化算法


能够使用4向动作结合HA自动化控制桌面灯光效果,包括向上切换主灯开关状态,向左灯带逆时针chase,向右灯带顺时针chase,向下打开RGB模式(HA场景)
后续计划
- 优化多分类算法
- 设计动作,避免相似动作导致的误判
- 将多分类预测阶段的代码移植到ESP32上
- 制作魔杖原型,然后利用原型采集数据,保证数据准确性
- 添加灯效
Comments NOTHING