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

MetaWear加速度计与陀螺仪蓝牙数据流TypeError问题求助

解决MetaWear加速度计+陀螺仪流式传输的TypeError问题

你的代码存在几个核心问题导致TypeError,下面逐一说明并给出修正方案:

问题根源

  • 信号触发逻辑错误:加速度和陀螺仪的数据流是独立触发的,每个回调只会收到其中一种传感器的数据,你在handler里同时访问data['accelerometer']和data['gyro']根本找不到对应键,直接报错。
  • Data指针解析错误:不能把C语言传来的POINTER(Data)直接当字典用,必须用MetaWear库提供的API来解析数据。
  • 回调引用丢失:如果回调函数没有被持久化引用,Python垃圾回收会把它清掉,调用时就会触发类型错误。

修正后的完整代码

import time
from mbientlab.metawear import MetaWear, libmetawear
from mbientlab.metawear.cbindings import *
import ctypes

# 加速度数据处理函数
def acc_data_handler(data_ptr):
    # 用官方API解析加速度数据
    data = libmetawear.mbl_mw_acc_get_acceleration_data(data_ptr)
    print(f"Accelerometer data: x = {data.x:.3f}, y = {data.y:.3f}, z = {data.z:.3f}")

# 陀螺仪数据处理函数
def gyro_data_handler(data_ptr):
    # 用官方API解析陀螺仪数据
    data = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data(data_ptr)
    print(f"Gyro data: x = {data.x:.3f}, y = {data.y:.3f}, z = {data.z:.3f}")

# 连接设备(替换成你的设备MAC地址)
device = MetaWear("ADDRESS")
device.connect()

# 设置连接参数
libmetawear.mbl_mw_settings_set_connection_parameters(device.board, 7.5, 7.5, 0, 6000)

# 配置加速度计
libmetawear.mbl_mw_acc_set_odr(device.board, 100)
libmetawear.mbl_mw_acc_set_range(device.board, 8.0)
libmetawear.mbl_mw_acc_write_acceleration_config(device.board)

# 配置陀螺仪
libmetawear.mbl_mw_gyro_bmi160_set_odr(device.board, 100)
libmetawear.mbl_mw_gyro_bmi160_set_range(device.board, 2000)
libmetawear.mbl_mw_gyro_bmi160_write_config(device.board)

# 创建并保存回调引用(防止被垃圾回收)
acc_callback = ctypes.CFUNCTYPE(None, ctypes.POINTER(Data))(acc_data_handler)
gyro_callback = ctypes.CFUNCTYPE(None, ctypes.POINTER(Data))(gyro_data_handler)

# 获取信号并订阅
acc_signal = libmetawear.mbl_mw_acc_get_acceleration_data_signal(device.board)
gyro_signal = libmetawear.mbl_mw_gyro_bmi160_get_rotation_data_signal(device.board)

libmetawear.mbl_mw_datasignal_subscribe(acc_signal, None, acc_callback)
libmetawear.mbl_mw_datasignal_subscribe(gyro_signal, None, gyro_callback)

# 启动采样
libmetawear.mbl_mw_acc_enable_acceleration_sampling(device.board)
libmetawear.mbl_mw_gyro_bmi160_enable_rotation_sampling(device.board)
libmetawear.mbl_mw_acc_start(device.board)
libmetawear.mbl_mw_gyro_bmi160_start(device.board)

# 采样5秒
time.sleep(5.0)

# 停止采样
libmetawear.mbl_mw_acc_stop(device.board)
libmetawear.mbl_mw_gyro_bmi160_stop(device.board)

# 关闭采样
libmetawear.mbl_mw_acc_disable_acceleration_sampling(device.board)
libmetawear.mbl_mw_gyro_bmi160_disable_rotation_sampling(device.board)

# 取消订阅(规范操作)
libmetawear.mbl_mw_datasignal_unsubscribe(acc_signal)
libmetawear.mbl_mw_datasignal_unsubscribe(gyro_signal)

# 断开连接
device.disconnect()

关键修改说明

  1. 拆分数据处理函数:给加速度和陀螺仪分别编写handler,各自处理对应传感器的数据,避免逻辑混乱。
  2. 使用官方API解析数据:用库提供的mbl_mw_acc_get_acceleration_data和mbl_mw_gyro_bmi160_get_rotation_data解析C指针数据,彻底解决类型错误。
  3. 保留回调引用:将acc_callback和gyro_callback作为持久化变量,防止Python垃圾回收清理回调函数导致调用失败。
  4. 清理冗余代码:移除重复导入的模块,增加取消订阅步骤,符合设备操作规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:10:49