解释Sphero 16位值(例如在碰撞中)

时间:2015-05-10 13:34:25

标签: javascript sphero-api sphero

我正在使用Cylon.js和Node.js来处理Sphero,我不确定我应该如何从碰撞事件返回的数据中重建16位值。

文档暗示它们应该被签名为16位整数,并且数字以(MSB,LSB)字节顺序进入,但是当我尝试将两个字节转换为应该是负额定值时,我得到奇数值(例如来自后方或左侧的冲击。)

我用来转换双bhere Sphero值的Javascript代码是:

  function convertToSignedInt(msb, lsb) {
    var negative = msb > 128;
    if (negative) {
      msb -= 128;
    }
    var value = msb*256 + lsb;
    if (negative) {
      value = 0 - value;
    }
    return value;
  }

给出如下的原始碰撞数据:

{"SOP1":255,"SOP2":254,"ID_CODE":7,"DLEN":17,"DATA":[18,31,255,104,0,0,1,0,67,0,6,0,0,9,1,95],"CHK":156}

然后我尝试使用以下方法将DATA属性转换为更易读的对象:

  function convertCollisionData(data) {
    var obj = {};
    obj.xPower = convertToSignedInt(data[0], data[1]);
    obj.yPower = convertToSignedInt(data[2], data[3]);
    obj.zPower = convertToSignedInt(data[4], data[5]);
    obj.impactAxis = data[6];
    obj.xImpact = convertToSignedInt(data[7], data[8]);
    obj.yImpact = convertToSignedInt(data[9], data[10]);
    obj.speed = data[11];

    return obj;
  }

想出这个:

{"xPower":4639,"yPower":-32616,"zPower":0
    ,"impactAxis":1,"xImpact":67,"yImpact":6,"speed":0}

显然yPower是完全错误的,因为这是一个右侧(正X)碰撞。由于xImpact和yImpact值为正,因此它们似乎正在正确转换。

所以问题的简短版本是,将两个字节转换为有符号整数的正确方法是什么?

0 个答案:

没有答案