0

Cylon.jsと Node.js を使用して Sphero を操作していますが、衝突イベントから返されたデータから 16 ビット値を再構築する方法がわかりません。

ドキュメントは、それらが符号付きの 16 ビット整数である必要があり、数値が (MSB、LSB) バイト順であることを暗示していますが、2 バイトを負の電力定格 (インパクトなど) に変換しようとすると、奇妙な値が得られます。後ろまたは左から)。

2 バイトの 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}

これは右側 (正の X) 衝突だったので、yPower が完全に間違っていることは明らかです。xImpact と yImpact の値は正であるため、正しく変換されているように見えます。

質問の短いバージョンは、2 バイトを符号付き整数に変換する適切な方法は何ですか?

4

0 に答える 0