将加速度计矢量从设备转换为地球坐标
Translating Accelerometer Vectors from Device to Earth Coordinates
我搜索了互联网和 Whosebug 以找到一种方法来将 Android 加速度计矢量从设备坐标系转换为地球坐标系。我正在使用 Sensor.TYPE_ROTATION_VECTOR 来执行此操作。我正在使用 NativeScript 访问传感器并使用 MathJS 进行矩阵计算。
- 我使用 Sensor.TYPE_ROTATION_VECTOR
获取旋转矢量
- 我按照 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/SensorManager.java.
中给出的 getRotationMatrixFromVector() 的 Android 代码计算旋转矩阵
---2.1 我计算q0,q1=acceleration.x,q2=acceleration.y,q3=acceleration.z
---2.2 我尝试使用 float[9] 和 float[16] 矩阵大小计算旋转矩阵,但我无法让它们中的任何一个工作。
---2.3 我尝试反转和转置这两个旋转矩阵。
- 我现在将旋转矩阵(尝试过正常、反转和转置)乘以矩阵 [[accel.x]、[accel.y]、[accel.z]、[0.0 ]](4x1 矩阵)
- 当我查看新转换的加速度值时,它们根本没有旋转。如果我将我的设备的 x 轴指向地球的北方并向这个方向加速,我的 acceleration.x 将 >1 而其他值几乎为 0。这里我的 acceleration.y 应该被转换为 >1。同样,如果我将设备的 y 轴指向天空并朝这个方向加速,我的 acceleration.y 读数 >1,而我的 acceleration.z 读数应该 >1。
谁能告诉我这些步骤中我做错了什么?共识似乎是获取旋转向量,将其转换为旋转矩阵,反转矩阵,然后将该反转矩阵乘以加速度计向量。它对我不起作用。谢谢,
var r;
var rinv;
accelerometer.startAccelerometerUpdates(function (accel) {
if (accel.sensortype == 11) {
var q0 = Math.sqrt(1 - accel.x*accel.x - accel.y*accel.y - accel.z*accel.z);
var q1 = accel.x;
var q2 = accel.y;
var q3 = accel.z;
//calculate rotation matrix from unit quaternion
var sq1 = 2*q1*q1;
var sq2 = 2*q2*q2;
var sq3 = 2*q3*q3;
var q1q2 = 2*q1*q2;
var q3q0 = 2*q3*q0;
var q1q3 = 2*q1*q3;
var q2q0 = 2*q2*q0;
var q2q3 = 2*q2*q3;
var q1q0 = 2*q1*q0;
//r = math.matrix([[1-sq2-sq3,q1q2-q3q0,q1q3+q2q0],[q1q2+q3q0,1-sq1-sq3,q2q3-q1q0],[q1q3-q2q0,q2q3+q1q0,1-sq1-sq2]]);
r = math.matrix([[1-sq2-sq3,q1q2-q3q0,q1q3+q2q0,0.0],[q1q2+q3q0,1-sq1-sq3,q2q3-q1q0,0.0],[q1q3-q2q0,q2q3+q1q0,1-sq1-sq2,0.0],[0.0,0.0,0.0,1.0]]);
rinv = math.inv(r);
}
if (accel.sensortype == 10) {
//filter accelerometer errors
if (Math.abs(accel.x) < 10 || Math.abs(accel.y) < 10 || Math.abs(accel.z) < 10) {
if ((Math.abs(accel.x) > .15 && Math.abs(accel.x)/oldAX < 2) || (Math.abs(accel.y) > .15 && Math.abs(accel.y)/oldAY < 2) || (Math.abs(accel.z) > .15 && Math.abs(accel.z)/oldAZ < 2)) { //filter errors in accelerometer
var Ad = math.matrix([[accel.x],[accel.y],[accel.z],[0.0]]);
//transform acceleration values from device coordinates to Earth coordinates
var Ag = math.multiply(rinv,Ad);
var ax = Ag.get([0,0]);
var ay = Ag.get([1,0]);
var az = Ag.get([2,0]);
if (ax > 1 || ay > 1 || az > 1) { //only show large values for easier analyses
page.getViewById("rotationLabel").text = "Earth Axes Acceleration \n x: " + ax + "\ny: " + ay + "\nz: " + az;
}
我希望设备的加速度计值能够像本页旋转矢量部分那样转换为地球坐标系。
https://developer.android.com/guide/topics/sensors/sensors_motion
NativeScript-Accelerometer-Advanced 插件编码不正确。不必计算单位四元数值 q0,因为它由传感器提供。不需要除以重力 (9.81 m/s^2),因为它不包含在传感器中。我在我的本地副本中修复了这个问题,我的旋转方法工作正常:
1.获取旋转向量
2.计算旋转矩阵
3.反转旋转矩阵
4. 将反向旋转矩阵乘以加速度计向量,第 4 行附加 [1.0]
我搜索了互联网和 Whosebug 以找到一种方法来将 Android 加速度计矢量从设备坐标系转换为地球坐标系。我正在使用 Sensor.TYPE_ROTATION_VECTOR 来执行此操作。我正在使用 NativeScript 访问传感器并使用 MathJS 进行矩阵计算。
- 我使用 Sensor.TYPE_ROTATION_VECTOR 获取旋转矢量
- 我按照 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/SensorManager.java.
中给出的 getRotationMatrixFromVector() 的 Android 代码计算旋转矩阵 ---2.1 我计算q0,q1=acceleration.x,q2=acceleration.y,q3=acceleration.z ---2.2 我尝试使用 float[9] 和 float[16] 矩阵大小计算旋转矩阵,但我无法让它们中的任何一个工作。 ---2.3 我尝试反转和转置这两个旋转矩阵。 - 我现在将旋转矩阵(尝试过正常、反转和转置)乘以矩阵 [[accel.x]、[accel.y]、[accel.z]、[0.0 ]](4x1 矩阵)
- 当我查看新转换的加速度值时,它们根本没有旋转。如果我将我的设备的 x 轴指向地球的北方并向这个方向加速,我的 acceleration.x 将 >1 而其他值几乎为 0。这里我的 acceleration.y 应该被转换为 >1。同样,如果我将设备的 y 轴指向天空并朝这个方向加速,我的 acceleration.y 读数 >1,而我的 acceleration.z 读数应该 >1。
谁能告诉我这些步骤中我做错了什么?共识似乎是获取旋转向量,将其转换为旋转矩阵,反转矩阵,然后将该反转矩阵乘以加速度计向量。它对我不起作用。谢谢,
var r;
var rinv;
accelerometer.startAccelerometerUpdates(function (accel) {
if (accel.sensortype == 11) {
var q0 = Math.sqrt(1 - accel.x*accel.x - accel.y*accel.y - accel.z*accel.z);
var q1 = accel.x;
var q2 = accel.y;
var q3 = accel.z;
//calculate rotation matrix from unit quaternion
var sq1 = 2*q1*q1;
var sq2 = 2*q2*q2;
var sq3 = 2*q3*q3;
var q1q2 = 2*q1*q2;
var q3q0 = 2*q3*q0;
var q1q3 = 2*q1*q3;
var q2q0 = 2*q2*q0;
var q2q3 = 2*q2*q3;
var q1q0 = 2*q1*q0;
//r = math.matrix([[1-sq2-sq3,q1q2-q3q0,q1q3+q2q0],[q1q2+q3q0,1-sq1-sq3,q2q3-q1q0],[q1q3-q2q0,q2q3+q1q0,1-sq1-sq2]]);
r = math.matrix([[1-sq2-sq3,q1q2-q3q0,q1q3+q2q0,0.0],[q1q2+q3q0,1-sq1-sq3,q2q3-q1q0,0.0],[q1q3-q2q0,q2q3+q1q0,1-sq1-sq2,0.0],[0.0,0.0,0.0,1.0]]);
rinv = math.inv(r);
}
if (accel.sensortype == 10) {
//filter accelerometer errors
if (Math.abs(accel.x) < 10 || Math.abs(accel.y) < 10 || Math.abs(accel.z) < 10) {
if ((Math.abs(accel.x) > .15 && Math.abs(accel.x)/oldAX < 2) || (Math.abs(accel.y) > .15 && Math.abs(accel.y)/oldAY < 2) || (Math.abs(accel.z) > .15 && Math.abs(accel.z)/oldAZ < 2)) { //filter errors in accelerometer
var Ad = math.matrix([[accel.x],[accel.y],[accel.z],[0.0]]);
//transform acceleration values from device coordinates to Earth coordinates
var Ag = math.multiply(rinv,Ad);
var ax = Ag.get([0,0]);
var ay = Ag.get([1,0]);
var az = Ag.get([2,0]);
if (ax > 1 || ay > 1 || az > 1) { //only show large values for easier analyses
page.getViewById("rotationLabel").text = "Earth Axes Acceleration \n x: " + ax + "\ny: " + ay + "\nz: " + az;
}
我希望设备的加速度计值能够像本页旋转矢量部分那样转换为地球坐标系。 https://developer.android.com/guide/topics/sensors/sensors_motion
NativeScript-Accelerometer-Advanced 插件编码不正确。不必计算单位四元数值 q0,因为它由传感器提供。不需要除以重力 (9.81 m/s^2),因为它不包含在传感器中。我在我的本地副本中修复了这个问题,我的旋转方法工作正常: 1.获取旋转向量 2.计算旋转矩阵 3.反转旋转矩阵 4. 将反向旋转矩阵乘以加速度计向量,第 4 行附加 [1.0]