我想知道如何正确使用“旋转矢量传感器”的输出。目前我想出了以下内容,并希望从result[]
计算偏航和俯仰,以便知道设备指向的位置(处于横向模式)。但我的结果有问题。偏航计算非常精确但是音高表现得很奇怪。也许任何人都可以指出我如何使用数据的正确方向。我还想知道的另一件事是设备方向(横向或纵向)是否对此传感器的输出有任何影响。提前谢谢。
private double max = Math.PI / 2 - 0.01;
private double min = -max;
private float[] rotationVectorAction(float[] values) {
float[] result = new float[3];
float vec[] = values;
float quat[] = new float[4];
float[] orientation = new float[3];
SensorManager.getQuaternionFromVector(quat, vec);
float[] rotMat = new float[9];
SensorManager.getRotationMatrixFromVector(rotMat, quat);
SensorManager.getOrientation(rotMat, orientation);
result[0] = (float) orientation[0];
result[1] = (float) orientation[1];
result[2] = (float) orientation[2];
return result;
}
private void main () {
float[] result = rotationVectorAction(sensorInput);
yaw = result[0];
pitch = result[1];
pitch = (float) Math.max(min, pitch);
pitch = (float) Math.min(max, pitch);
float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch)));
float dy = (float) Math.sin(pitch);
float dz = (float) (Math.cos(yaw) * Math.cos(pitch));
}
在OpenGL ES 2.0中,我将其设置为移动相机:
Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0);
答案 0 :(得分:4)
最后我自己解决了。音调不能正常工作的原因是INPUT和来自SensorManager.getQuaternionFromVector(quat, vec);
的OUTPUT之间的差异。该方法期望向量vec
为(x|y|z|w)
,输出quat
看起来像(w|x|y|z)
。在我的情况下,我只需将quat
数组的第一个值移到最后,它就像一个魅力。
答案 1 :(得分:2)
上面的洗液对我没有帮助。取而代之的是将SensorManager.getQuaternionFromVector(quat, vec);
移除为docs状态SensorManager.getRotationMatrixFromVector()
要求ROTATION_VECTOR
传感器返回的旋转向量。
private float[] rotationVectorAction(float[] values)
{
float[] result = new float[3];
float vec[] = values;
float[] orientation = new float[3];
float[] rotMat = new float[9];
SensorManager.getRotationMatrixFromVector(rotMat, vec);
SensorManager.getOrientation(rotMat, orientation);
result[0] = (float) orientation[0]; //Yaw
result[1] = (float) orientation[1]; //Pitch
result[2] = (float) orientation[2]; //Roll
return result;
}
答案 2 :(得分:0)
我可以回答这个问题的一部分。
设备方向对传感器输出没有影响,因为传感器始终相对于设备的默认方向。但是,为了在屏幕上绘制东西,例如指向北方的罗盘箭头,您需要考虑设备方向,因为如果设备不在,则绘制的画布的坐标系统已经旋转默认方向。