Javascript 调整移动加速计数据以考虑手机旋转

Javascript 调整移动加速计数据以考虑手机旋转,javascript,angular,mobile,accelerometer,Javascript,Angular,Mobile,Accelerometer,我希望记录移动加速计数据(x/y/z),并将其调整为一致,而不考虑手机的方向/旋转。这里的用例是在驾驶时记录并规范这些参数,以检测转弯/扭转等。其中的一个关键要素是确保报告的数据独立于手机在车内的定位方式。我正在使用以获取设备的运动和方向详细信息 我已经在SO上查看了以前与此主题相关的答案(例如一个),并尝试实现了他们获取地球坐标的方法 然而,当我转动/扭转手机时,我看到读数完全改变。谁能告诉我我做错了什么 这就是我计算地球坐标的方法: const deg2rad = Math.P

我希望记录移动加速计数据(x/y/z),并将其调整为一致,而不考虑手机的方向/旋转。这里的用例是在驾驶时记录并规范这些参数,以检测转弯/扭转等。其中的一个关键要素是确保报告的数据独立于手机在车内的定位方式。我正在使用以获取设备的运动和方向详细信息

我已经在SO上查看了以前与此主题相关的答案(例如一个),并尝试实现了他们获取地球坐标的方法

然而,当我转动/扭转手机时,我看到读数完全改变。谁能告诉我我做错了什么

这就是我计算地球坐标的方法:

       const deg2rad = Math.PI / 180;
       let alpha = gdata.do.alpha;
       let beta = gdata.do.beta;
       let gamma = gdata.do.gamma;



       let rotatematrix = this.getRotationMatrix(alpha * deg2rad, beta * deg2rad, gamma * deg2rad);

       let relativeacc = new Array(3);
       let earthacc = new Array(3);
       let inv = new Array(9)
       relativeacc[0] = gdata.dm.gx;
       relativeacc[1] = gdata.dm.gy;
       relativeacc[2] = gdata.dm.gz;

       //console.log ("FIRST MATRIX")
       mat3.invert(inv,rotatematrix);
       //console.log ("SECOND MATRIX")
       mat3.multiply(earthacc, inv, relativeacc);


       let accEarthX = earthacc[0];
       let accEarthY = earthacc[1];
       let accEarthZ = earthacc[2];

        let aMag = Math.sqrt(accEarthX*accEarthX + accEarthY*accEarthY + accEarthZ*accEarthZ)

        console.log (`---RAW DATA --- ` + JSON.stringify(gdata));
        console.log (`*** EARTH DATA X=${accEarthX}, Y=${accEarthY} Z=${accEarthZ}`)
这是
getRotationMatrix
代码

// credit:https://stackoverflow.com/a/36662093/1361529
getRotationMatrix(alpha, beta, gamma) {

    const getScreenOrientation = () => {
    switch (window.screen.orientation || window.screen.mozOrientation) {
      case 'landscape-primary':
        return 90;
      case 'landscape-secondary':
        return -90;
      case 'portrait-secondary':
        return 180;
      case 'portrait-primary':
        return 0;
    }
    if (window.orientation !== undefined)
      return window.orientation;
  };

  const screenOrientation = getScreenOrientation();
  console.log ("SCREEN ORIENTATIIN = "+screenOrientation);

    let out = [];
    let  _z = alpha;
    let _x = beta;
    let _y = gamma;


    if (screenOrientation === 90) {
      _x = - gamma;
      _y = beta;
    }
    else if (screenOrientation === -90) {
      _x = gamma;
      _y = - beta;
    }
    else if (screenOrientation === 180) {
      _x = - beta;
      _y = - gamma;
    }
    else if (screenOrientation === 0) {
      _x = beta;
      _y = gamma;
    }

    let cX = Math.cos( _x );
    let cY = Math.cos( _y );
    let cZ = Math.cos( _z );
    let sX = Math.sin( _x );
    let sY = Math.sin( _y );
    let sZ = Math.sin( _z );

    out[0] = cZ * cY + sZ * sX * sY,    // row 1, col 1
    out[1] = cX * sZ,                   // row 2, col 1
    out[2] = - cZ * sY + sZ * sX * cY , // row 3, col 1

    out[3] = - cY * sZ + cZ * sX * sY,  // row 1, col 2
    out[4] = cZ * cX,                   // row 2, col 2
    out[5] = sZ * sY + cZ * cY * sX,    // row 3, col 2

    out[6] = cX * sY,                   // row 1, col 3
    out[7] = - sX,                      // row 2, col 3
    out[8] = cX * cY                    // row 3, col 3

  return out