魔杖智能家居控制系统

ChainPray 发布于 2024-11-06 750 次阅读


上周接了个魔杖的外包项目,需要实现的效果见因为懒得下床关灯,我做了一根魔杖_哔哩哔哩_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官方文档

自动发现的MQTT主题配置
配置完成后HA效果

ESP32收到结果后通过MQTT使用预先设定好的topic通知Homeassistant,HA再设置自动化控制物联设备

现阶段成果

采用LDA降维和分类,上下左右方向折返运动的动作分类效果良好,下图是正确率和LDA 3维投影的结果;但加入圆圈和三角时候正确率下降,测试后发现应该是圆圈和4个折返动作存在相似性导致,后续要优化算法

     能够使用4向动作结合HA自动化控制桌面灯光效果,包括向上切换主灯开关状态,向左灯带逆时针chase,向右灯带顺时针chase,向下打开RGB模式(HA场景)

后续计划

  • 优化多分类算法
  • 设计动作,避免相似动作导致的误判
  • 将多分类预测阶段的代码移植到ESP32上
  • 制作魔杖原型,然后利用原型采集数据,保证数据准确性
  • 添加灯效

深圳大学腾讯创新俱乐部的一名TICer,目前致力于成为全栈工程师
最后更新于 2025-05-26