gpt4 book ai didi

Android 增强现实方向

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:28 25 4
gpt4 key购买 nike

我正在制作用于在相机上显示来自 map 的对象的程序,除了从垂直方向向左和向右倾斜几度(例如 80-110 和 260-280 度)外,它几乎可以正常工作。在其他 +-320 度时效果很好。我尝试将 TYPE_ROTATION_VECTOR 和加速度计与磁力计一起使用,它们的结果相同。有人知道任何解决方案吗?

使用 TYPE_ROTATION_VECTOR:

if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR)
{
float[] roationV = new float[16];
SensorManager.getRotationMatrixFromVector(roationV, event.values);

float[] orientationValuesV = new float[3];
SensorManager.getOrientation(roationV, orientationValuesV);

tvHeading.setText(String.format(
"Coordinates: lat = %1$.2f, lon = %2$.2f, time = %3$.2f",
orientationValuesV[0], orientationValuesV[1], orientationValuesV[2]));

float[] rotationMatrix=new float[16];
mSensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
float[] orientationValues = new float[3];
SensorManager.getOrientation(rotationMatrix, orientationValues);
double azimuth = Math.toDegrees(orientationValues[0]);
double pitch = Math.toDegrees(orientationValues[1]);
double roll = Math.toDegrees(orientationValues[2]);

tvOrientation.setText(String.format(
"Coordinates: lat = %1$.2f, lon = %2$.2f, time = %3$.2f",
azimuth,pitch,roll));


}

带加速度计+磁力计

if (event.sensor == mAccelerometer) {
System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
mLastAccelerometer = meanFilterAccelSmoothing
.addSamples(mLastAccelerometer);
mLastAccelerometer = medianFilterAccelSmoothing
.addSamples(mLastAccelerometer);
for (int i = 0; i < mLastAccelerometer.length; i++) {
mLastAccelerometer[i] = (float) Math.floor(mLastAccelerometer[i] * 1000) / 1000;
}
mLastAccelerometerSet = true;
}
if (event.sensor == mMagnetometer) {
System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
mLastMagnetometer = meanFilterMagneticSmoothing.addSamples(mLastMagnetometer);
mLastMagnetometer = medianFilterMagneticSmoothing.addSamples(mLastMagnetometer);
for (int i = 0; i < mLastMagnetometer.length; i++) {
mLastMagnetometer[i] = (float) Math.floor(mLastMagnetometer[i] * 1000) / 1000;
}
mLastMagnetometerSet = true;
}

if (mLastAccelerometerSet && mLastMagnetometerSet) {

SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
SensorManager.getOrientation(mR, mOrientation);
if (angeles.size() > 0) {
for (int i = 0; i < mapObjects.size(); i++) {
compassFunc(i, mOrientation[0], mOrientation[1], mOrientation[2]);

}
}

private void compassFunc(int number, float... values) {

double angularXSpeed = Math.floor(values[0] * 180 / Math.PI * 100) / 100;
double angularYSpeed = Math.floor(values[1] * 180 / Math.PI * 100) / 100;
double angularZSpeed = Math.floor(values[2] * 180 / Math.PI * 100) / 100;

tvOrientation.setText(String.format(
"Screen: lt= %1$.2f : %2$.2f,rt= %3$.2f : %4$.2f,lb= %5$.2f : %6$.2f,rb= %7$.2f : %8$.2f",
xLeftTop, yLeftTop, xRightTop,yRightTop,xLeftBottom,yLeftBottom,xRightBottom,yRightBottom));
}

最佳答案

这听起来像是 Gimbal Lock 的典型案例.您对当另一个轴达到 +-90 度时围绕一个轴的旋转如何起作用的描述表明情况确实如此。

这是一个 fundamental problem与欧拉角(Yaw/Azimuth、Pitch、Roll),这就是为什么大多数此类计算都是使用旋转矩阵或四元数完成的,而欧拉角最常仅在要向人类显示特定方向时使用(人类通常不擅长解释旋转矩阵和四元数)。

ROTATION_VECTOR 传感器以四元数格式 (source) 输出它的数据,尽管具有重新排列的值,getRotationMatrixFromVector() 方法将其转换为旋转矩阵.我建议使用其中一种描述进行内部计算。

this similar question 的答案就如何解决问题提供一些具体建议。

关于Android 增强现实方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com