MyoBleService
com.roumai.myodecoder.device.ble.MyoBleService
Overview
MyoBleService
继承自 CommonBleService
,是针对 MyoDecoder 设备设计的服务,包含了常用的 EMG、IMU、RMS 等数据的实时订阅服务。
Constructors
#constructor/1
构造器,方便蓝牙具体服务的使用,需要蓝牙实现类的实例来完成初始化。
参数 | 类型 | 描述 |
---|---|---|
delegate | BleDelegate | 蓝牙代理类实例 |
val delegate = BleDelegateDefaultImpl(device)
val service = MyoBleService(delegate)
Functions
#observeEMG/1
订阅实时的 EMG 数据。
EMG 数据为一个 Int
类型的数组,数组长度为通道数量,其值范围为 0-16384,表示肌电信号的模拟量,与实际电压存在换算关系:
简单计算可得实际分辨率可达 0.2mV
,对于测量一般的肌电信号(mV 以上级别)是完全足够的。
⚠️ 我们通常建议在存储数据时以模拟量形式存储,模拟量为 14bit,
如果转换为 Float
类型存储,会消耗至少 32bit 存储空间,在 EMG 采集的场景下能节省一半以上的存储是有意义的。
⚠️ 该方法启用后会持续获取 EMG 数据,直到调用 stopObserveEMG
方法或者断开与 MyoDecoder 的连接。
MyoDecoder 设备在之后会自动停止 EMG 信号采集,功耗降低,以增加使用时长。
参数 | 类型 | 描述 |
---|---|---|
callback | (List<Pair<Long, IntArray>>) -> Unit | 获取 EMG 数据的回调函数 |
service.observeEMG { list ->
list.forEach {
val timestamp = it.first
val data = it.second
Log.i(TAG, "EMG data[$timestamp]: $data[0]")
}
}
#stopObserveEMG/0
停止订阅 EMG 数据。
service.stopObserveEMG()
#observeIMU/1
订阅实时的 IMU 数据。
IMU 数据为一个 Float
类型的数组,数组长度为 10,包含了温度、角速度、加速度、磁场数据。
FloatArray
的值分布如下:
[温度, 陀螺仪 X, 陀螺仪 Y, 陀螺仪 Z, 加速度 X, 加速度 Y, 加速度 Z, 磁力计 X, 磁力计 Y, 磁力计 Z]
参数 | 类型 | 描述 |
---|---|---|
callback | (List<Pair<Long, FloatArray>>) -> Unit | 获取 IMU 数据的回调函数 |
service.observeIMU { list ->
list.forEach {
val timestamp = it.first
val data = it.second
val temperatuew = data[0]
val gyro = data.sliceArray(1..3)
val accl = data.sliceArray(4..6)
val mag = data.sliceArray(7..9)
// ...
}
}
#stopObserveIMU/0
停止订阅 IMU 数据。
service.stopObserveIMU()
#observeRMS/1
订阅实时的 RMS 数据。
RMS 数据为一个 Int
类型的数组,数组长度为通道数量,衡量了肌肉的力度信息。
该 RMS 是由 MyoDecoder 设备直接计算获得,频率为 10Hz 左右,相较于 EMG 的实时订阅,不仅可以用于实时监测肌肉的力度的同时也极大地节省了蓝牙传输功耗。
参数 | 类型 | 描述 |
---|---|---|
callback | (Pair<Long, IntArray>) -> Unit | 获取 RMS 数据的回调函数 |
service.observeRMS { list ->
list.forEach {
val timestamp = it.first
val data = it.second
if (data[0] > 8000) {
Log.i(TAG, "发力")
} else {
Log.i(TAG, "静息")
}
}
}
#stopObserveRMS/0
停止订阅 RMS 数据。
service.stopObserveRMS()