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()
关键修改说明
- 拆分数据处理函数:给加速度和陀螺仪分别编写handler,各自处理对应传感器的数据,避免逻辑混乱。
- 使用官方API解析数据:用库提供的
mbl_mw_acc_get_acceleration_data和mbl_mw_gyro_bmi160_get_rotation_data解析C指针数据,彻底解决类型错误。 - 保留回调引用:将
acc_callback和gyro_callback作为持久化变量,防止Python垃圾回收清理回调函数导致调用失败。 - 清理冗余代码:移除重复导入的模块,增加取消订阅步骤,符合设备操作规范。
内容的提问来源于stack exchange,提问作者user21138947
相关产品推荐
相关产品推荐

