gpt4 book ai didi

c# - 朝向地平线时,方向传感器/测斜仪奇怪的、未记录的传感器读数跳跃

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:17 25 4
gpt4 key购买 nike

我正在尝试升级我的应用程序以使用 Windows 10 移动设备传感器作为 PC 的 VR 设备(例如 Google Cardboard)。当设备从指向地平线以下变为指向地平线以上时,我遇到了传感器读数的问题(横向和纵向都会发生,但在这种情况下只有横向很重要)。一个小草图: Switch over point causing major sensor reading change

原始传感器读数(指向下方):

测斜仪俯仰:-000.677,横滚:-055.380,偏航:+013.978

现在改为指向上方后:

测斜仪俯仰:-178.550,横滚:+083.841,偏航:+206.219

如您所见,所有 3 个值都发生了显着变化。实际上只有一个轴应该改变,滚动或俯仰(取决于传感器方向)

我有 95% 的把握,这个问题在 Windows Phone 8 中不存在。我找不到任何关于传感器这种奇怪行为的文档,这让我无法创建增强现实和虚拟现实应用程序。

这是问题的2张图片: Pointing downward Pointing upward

下面是这个演示的代码:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Style="{StaticResource BodyTextBlockStyle}"
x:Name="output"
FontFamily="Consolas"
Foreground="Black"
Text="test"/>

</Grid>

代码隐藏:

public MainPage()
{
this.InitializeComponent();
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(250);
timer.Tick += Timer_Tick;
}

private void Timer_Tick(object sender, object e)
{
output.Text = "";
output.Text = DateTime.Now.ToString("HH:mm:ss.fff") + Environment.NewLine;
Print();
}

DispatcherTimer timer;
public void WriteValue(String desc, String val)
{
StringBuilder b = new StringBuilder();
int length = desc.Length + val.Length;
int topad = 40 - length;
if (topad < 0)
topad = length - 40;
output.Text += desc + val.PadLeft(topad + val.Length) + Environment.NewLine;
}
public String ValueToString(double value)
{
String ret = value.ToString("000.00000");
if (value > 0)
ret = " +" + ret;
else if (value == 0)
ret = " " + ret;
else
ret = " " + ret;

return ret;
}
public static double RadianToDegree(double radians)
{
return radians * (180 / Math.PI);
}
public void Print()
{
WriteValue("DisplayOrientation", LastDisplayOrient.ToString());

WriteValue("Inclinometer", "");
WriteValue("Pitch", ValueToString(LastIncline.PitchDegrees));
WriteValue("Roll", ValueToString(LastIncline.RollDegrees));
WriteValue("Yaw", ValueToString(LastIncline.YawDegrees));
WriteValue("YawAccuracy", LastIncline.YawAccuracy.ToString());


WriteValue("OrientationSensor", "");
var q = LastOrient.Quaternion;


double ysqr = q.Y * q.Y;
// roll (x-axis rotation)
double t0 = +2.0f * (q.W * q.X + q.Y * q.Z);
double t1 = +1.0f - 2.0f * (q.X * q.X + ysqr);
double Roll = RadianToDegree(Math.Atan2(t0, t1));
// pitch (y-axis rotation)
double t2 = +2.0f * (q.W * q.Y - q.Z * q.X);
t2 = t2 > 1.0f ? 1.0f : t2;
t2 = t2 < -1.0f ? -1.0f : t2;
double Pitch = RadianToDegree(Math.Asin(t2));
// yaw (z-axis rotation)
double t3 = +2.0f * (q.W * q.Z + q.X * q.Y);
double t4 = +1.0f - 2.0f * (ysqr + q.Z * q.Z);
double Yaw = RadianToDegree(Math.Atan2(t3, t4));
WriteValue("Roll", ValueToString(Roll));
WriteValue("Pitch", ValueToString(Pitch));
WriteValue("Yaw", ValueToString(Yaw));
}
Inclinometer sIncline;
DisplayInformation sDisplay;
OrientationSensor sOrient;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
sIncline = Inclinometer.GetDefault(SensorReadingType.Absolute);
sDisplay = DisplayInformation.GetForCurrentView();
sOrient = OrientationSensor.GetDefault(SensorReadingType.Absolute);
sOrient.ReadingChanged += SOrient_ReadingChanged;
sDisplay.OrientationChanged += SDisplay_OrientationChanged;
sIncline.ReadingChanged += SIncline_ReadingChanged;

LastDisplayOrient = sDisplay.CurrentOrientation;
LastIncline = sIncline.GetCurrentReading();
LastOrient = sOrient.GetCurrentReading();
timer.Start();
}

private void SOrient_ReadingChanged(OrientationSensor sender, OrientationSensorReadingChangedEventArgs args)
{
LastOrient = args.Reading;
}

private void SDisplay_OrientationChanged(DisplayInformation sender, object args)
{
LastDisplayOrient = sDisplay.CurrentOrientation;
}
OrientationSensorReading LastOrient;
InclinometerReading LastIncline;
DisplayOrientations LastDisplayOrient;
private void SIncline_ReadingChanged(Inclinometer sender, InclinometerReadingChangedEventArgs args)
{
LastIncline = args.Reading;
}

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);

sIncline.ReadingChanged -= SIncline_ReadingChanged;
sDisplay.OrientationChanged -= SDisplay_OrientationChanged;
sOrient.ReadingChanged -= SOrient_ReadingChanged;
timer.Stop();
}

编辑:添加了以下草图和更多描述

看看下面这张更深入的草图: More indepth sketch

按照步骤 (1) 中所示放置手机。手机处于横向模式,摄像头略微向下,屏幕略微向上。

转到步骤 (2)。你稍微向前倾斜它,只有一个轴应该改变(在这种情况下,倾角计将只显示“滚动”变化。这是正确的)

转到步骤 (3)。您现在将手机向后倾斜。一旦切换点到来,摄像机不再面向地面,而是现在天空和屏幕略微向下,所有 3 个值都会发生显着变化。 Pitch 将跳跃约 -180°,Roll 将跳跃约 90°,额外增加您实际更改的量,Yaw 将跳跃约 +180°。

只要相机仅指向地球或天空,传感器就可以正常工作!只有从一个切换到另一个时才会出现此问题! (这种情况在 VR 和 AR 中经常发生,所以这是一个大问题)

最佳答案

Raw sensor readouts (pointing downward):

Inclinometer Pitch: -000.677 , Roll: -055.380 , Yaw: +013.978

Now after changing to pointing upward:

Inclinometer Pitch: -178.550 , Roll: +083.841 , Yaw: +206.219

As you can see, all 3 values changed, by a significant amount. In reality only one axis should have changed, roll or pitch (depending on sensor orientation)

你的测试不严格。如果要观察RollPitch,需要设置一个静止坐标进行测试。

我已经在我的物理设备中测试了 Inclinometer。当我沿 X 轴方向滑动手机时。 3个值都变了,但只有Pitch值变化最明显,其余两个值都在误差范围内。

The Inclinometer sensor specifies the yaw, pitch, and roll values of a device and work best with apps that care about how the device is situated in space. Pitch and roll are derived by taking the accelerometer’s gravity vector and by integrating the data from the gyrometer. Yaw is established from magnetometer and gyrometer (similar to compass heading) data. Inclinometers offer advanced orientation data in an easily digestible and understandable way. Use inclinometers when you need device orientation but do not need to manipulate the sensor data.

更多可以引用Sensors .

关于c# - 朝向地平线时,方向传感器/测斜仪奇怪的、未记录的传感器读数跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013854/

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