我计算了风向,现在我想显示指向144度的风向(在罗盘上).如何在Google地图上显示此箭头?
javascript google-maps weather google-maps-api-2 compass-geolocation
我有这种方法来计算2 0-360指南针标题之间的区别.
虽然这可以用来确定我的绝对距离(例如,总是正输出),但我无法弄清楚要将标志引入输出需要做些什么.
理想情况下,如果从初始航向到最终航向的最短距离是顺时针方向,我希望error有一个正号,如果标题之间的最短距离涉及逆时针方向,我会喜欢error有一个负号.
一些期望的输入/输出的例子
initial- final-error
0 .................... 30 .......... 30
30 .................... 0 .......... -30
360 .................... 1 .......... 1
1 .................... 360 .......... -1
码:
/// <summary>
/// Calculate the error from a given initial heading to a final heading
/// </summary>
/// <param name="inital"></param>
/// <param name="final"></param>
/// <returns></returns>
private double GetHeadingError(double initial, double final)
{
double directionA = final - initial;
double directionB = 360 - (final + …Run Code Online (Sandbox Code Playgroud) AR视图就像一个指南针,我有一个非常讨厌的问题.因此,当我以纵向握住手机(以便屏幕指向我的脸部)时,我remapCoordinateSystem会在按住它时将其调用为0.然后方位角(罗盘功能)是完美的,但是一旦我倾斜手机,方位角就会被毁坏,如果我向前弯曲,方位角会增加,如果我向后弯曲,它会减小.
我使用2个传感器来获取读数,Sensor.TYPE_MAGNETIC_FIELD和Sensor.TYPE_GRAVITY.
我使用的是一个非常基本的lowpassfilter,它是用alpha常量实现的,直接用于传感器的读取值.
这是我的代码:
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, gravitymeterValues,
magnetometerValues);
float[] remappedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Z, remappedRotationMatrix);
float results[] = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, results);
float azimuth = (float) (results[0] * 180 / Math.PI);
if (azimuth < 0) {
azimuth += 360;
}
float pitch = (float) (results[1] * 180 / Math.PI);
float roll = (float) (results[2] * 180 / Math.PI);
Run Code Online (Sandbox Code Playgroud)
如你所见,这里没有魔力.当gravitymeterValues和magnetometerValues准备好使用时,我称这段代码.
我的问题是当我倾斜手机时如何阻止方位角疯狂?
我在Google Play商店,Compass上查了一个免费的应用程序并且它还没有解决这个问题,但我希望有一个解决方案.
我有两个解决方案: …
我有一个加速度计和磁力计,每个都产生原始的X,Y和Z读数.由此我需要确定物体的磁航向.
我在触发器上的表现并不是很好,但是我已经把一个对设备的旋转做出很好反应的公式放在一起,但也响应了人们认为不相关的运动,例如将设备倾斜到这样的状态.这种方式对指向的方向没有影响.如平放和"滚动"设备.
我认为我用于计算磁航向的公式很好,但我认为我输入的俯仰和滚动弧度是错误的.
所以我想我的问题的核心(除非有人实际上有一个公式就是这样做),你是如何用弧度计算角度的,使用加速度计进行俯仰和滚动.
其次,标题公式本身的任何信息都会很棒.
嗨我希望指出正确的方向解决一个问题,当iphone的方向正在改变/改变需要在didUpdateHeading上执行的转换:newHeading使CLHeading.trueHeading的值旋转到始终作为如果手机处于CLDeviceOrientationLandscapeRight的方向.
谢谢
这可能很难解释几何,所以我会小心拼写它.这在标准compas应用程序和CLLocationManager中的数据中可见.
1)当纵向握住手机时,请考虑俯仰角为0°
2)当将摄像机指向天空(例如拍摄云层照片)时,俯仰角度从0° - > 90°,其中90度是直线向上.
3)当手机向上倾斜(> 0度并在"X"磁力计轴上旋转)时,当手机处于大约(但不完全)45度时,指南针前进180度旋转.因此,当相机仍为"N"点时,指南针将报告"S".
4)对于下一个(大致)90度,罗盘航向旋转180度.
标题的这种旋转对我来说是破坏性的,并且它与加速度计不完全对齐.使用CLHeading数据中的RAW数据(X,Y,Z)来计算航向数据是否有一个很好的教程(我没有找到一个)?
最终的结果是我希望指南针的标题始终与相机的标题相匹配.
我正在使用CoreMotion获取ccompass标题,我注意到罗盘标题存在一些问题.
首先我初学CoreMotion.我有一个CMMotionManager对象,locationManager,它是CMMotionManager的一个实例.
// initialize CoreMotion
motionManager = [CMMotionManager new];
[motionManager setDeviceMotionUpdateInterval:1.0/30.0];
[motionManager setShowsDeviceMovementDisplay:YES];
[self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical];
Run Code Online (Sandbox Code Playgroud)
位置数据每1/30.0秒更新一次.
出于调试目的,我有一个UILabel,它显示每个更新间隔更新的当前罗盘标题.应用程序启动时,我总是要做神奇的8来校准指南针.
校准指南针后,北极和南极的航向几乎是2-5秒.
几秒钟后,指南针变得狂野,角度四处跳跃.大多数情况下,它从两个方向的起始位置漂浮在10-20度左右.应该有一个奇怪的结果.经过30-60秒后,南北两次互换或向东和向西交换.
在WWDC 2011上,一个会议讨论了他们如何计算每个传感器与另一个传感器以补偿这些问题.在CoreMotion的配置中是否有任何错过我有这个精确标题结果的大问题?
我现在用3个设备(2个iPhone 4s和iPhone 4)在建筑物内外测试指南针.我在田野,小城市和大城市.它一直在发生.来自Apple的示例指南针应用程序几乎准确,在我的测试中准确率为90%.不幸的是,它不是Apple开源的.
谢谢你的阅读.
我有一个关于Android设备中加速度计的快速问题.它始终开启/活动吗?鉴于加速度计用于检测设备的方向,无论是横向还是纵向.
在官方文档(SensorManager)中,它指出应该关闭传感器以节省电力.但我想知道这是否仅适用于其他传感器,如磁场传感器,陀螺仪,光传感器等.
我需要提出一个节能的案例,我不想错误地说加速度计有时会被禁用,而是用它来禁用其他传感器(在应用程序的罗盘功能中).
或者加速度计的电池消耗仅与注册接收数据的应用相关,而只是"开启"或启用是不相关的,因为它始终是?
谢谢你的任何澄清!
android accelerometer power-management android-sensors compass-geolocation
我是Android的新手,我想根据我的相机获得方向.如何根据相机获取方向信息?你能给出一个想法吗?
android ×4
iphone ×4
ios ×2
magnetometer ×2
trigonometry ×2
360-degrees ×1
c# ×1
core-motion ×1
google-maps ×1
gyroscope ×1
ios4 ×1
javascript ×1
math ×1
weather ×1