You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用Arduino串口数据实现机器学习实时手势预测?

实时手势预测实现方案

你可以将机器学习模型训练逻辑与Arduino串口数据读取逻辑整合,在每次获取到传感器实时数据后,直接调用训练好的模型进行预测。以下是完整的实现代码及关键说明:

完整整合代码

import pandas as pd
import time
import serial
from sklearn.tree import DecisionTreeClassifier

# 1. 加载数据集并训练模型(仅初始化时执行一次,无需重复训练)
data = pd.read_csv('mydata.csv')
X = data.drop(columns=['Word']).values
y = data['Word']
model = DecisionTreeClassifier()
model.fit(X, y)

# 2. 初始化Arduino串口通信
arduinoData = serial.Serial('com6', 115200)
time.sleep(1)  # 等待串口连接稳定

# 3. 实时数据读取与预测循环
while True:
    # 等待串口发送数据
    while arduinoData.inWaiting() == 0:
        pass
    
    try:
        # 读取并清洗串口数据
        dataPacket = arduinoData.readline().decode('utf-8').strip('\r\n')
        splitPacket = dataPacket.split(",")
        
        # 校验数据格式是否符合要求(8个传感器值)
        if len(splitPacket) != 8:
            print("无效数据,跳过本次读取")
            continue
        
        # 将字符串转换为浮点型数组
        sensor_values = [float(val) for val in splitPacket]
        
        # 4. 调用模型进行预测(注意:predict方法需要二维数组输入)
        prediction = model.predict([sensor_values])
        
        # 输出预测结果
        print(f"当前手势预测结果: {prediction[0]}")

        # ---------------------------
        # 可选:播放对应手势的音频文件
        # 假设音频文件命名规则为「手势名称.mp3」
        # import playsound
        # playsound.playsound(f"{prediction[0]}.mp3")
        # ---------------------------
        
    except Exception as e:
        print(f"数据处理出错: {str(e)}")

关键注意事项

  • 模型仅训练一次:将模型训练逻辑放在循环外,避免每次读取数据都重复训练,大幅提升运行效率
  • 输入格式匹配:model.predict()需要接收二维数组(即使是单个样本),因此要将传感器值放在[]内再传入
  • 异常处理:添加try-except块防止串口数据格式错误、转换失败等情况导致程序崩溃
  • 可选优化:可以使用joblib或pickle保存训练好的模型,下次启动时直接加载模型而非重新训练:
    # 保存模型
    import joblib
    joblib.dump(model, 'sign_language_model.pkl')
    
    # 后续加载模型
    model = joblib.load('sign_language_model.pkl')
    

内容的提问来源于stack exchange,提问作者Sam Asad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:55:21