我正试图从不良记录的BLE信标上获得加速度计数据。这是我收到的(作为NSDictionary):
{
"x-Data" = 0020;
"y-Data" = 0000;
"z-Data" = 0BEC;
}
…我想不出它应该是什么意思。加速度计有一个刻度设置。本例中的刻度设置为+-2g
。因此,我期望上面收到的值应该是[-1,1]
,并乘以刻度以获得实际测量值。
我把加速度计平放在桌子上获取数据;我期望值应该是x=0,y=0
和z=-0.5
-因为乘以尺度(2g
)得到z=-1g
=重力。
我收到的数据是2字节。它是一个半浮动格式(Float16)?但是试图转换这个是不好的:
let u = UInt16("0BEC", radix: 16)! // 3052
Float16(bitPattern: u) // 0.0002418
转换错了吗?
我已经猜测了一段时间的格式。你能帮我弄清楚是什么格式吗?
这是一个稍微大一点的值集,加速度计放在桌子上:
{
"x-Data" = 001C;
"y-Data" = 0FFC;
"z-Data" = 0BEC;
}
{
"x-Data" = 0020;
"y-Data" = 0FFC;
"z-Data" = 0BE8;
}
{
"x-Data" = 001C;
"y-Data" = 0000;
"z-Data" = 0BE8;
}
{
"x-Data" = 001C;
"y-Data" = 0FFC;
"z-Data" = 0BEC;
}
{
"x-Data" = 0020;
"y-Data" = 0000;
"z-Data" = 0BEC;
}
在玩了几个小时后,终于写下了这个问题,我找到了我自己问题的答案,尽管我仍然想要一个解释。
我发现,如果我把最后一位数字(总是0)移到前面,我就会得到正确的答案:
let acc = UInt16("BEC0", radix: 16)! // Use BEC0 instead of 0BEC
let accs = Int16(bitPattern: acc)
Double(accs) / Double(32767) // - 0.5 as desired
我真的不知道为什么加速度计数据是这种格式。我得到它只是将原始数据转换为NSDictionary。可能是信标固件的bug。