我有两种方法可以使用iOS设备的磁力计获得磁场(强度,x,y和z).
1)核心位置
使用CLHeading CLLocationManagerDelegate
方法locationManager:didUpdateHeading:
.这类似于Apple的Teslameter示例应用程序.
2)核心运动
用于CMMagneticField
从CMMotionManager
的magnetometerData.magneticField
.
问题:
a)两者有什么区别?我从两者中得到了不同的价值观.我原以为他们会返回相同的值.
当我从静止位置(面朝上放在桌子上)启动应用程序,然后将设备向上提升到空中时,差异最为显着.
b)如果存在差异,何时应使用Core Location标题中的磁场,何时应使用Core Motion的磁场?
注意:我也不确定Core Location和Core Motion的"磁场"是否涉及不同的磁场概念.
注意:我将强度计算为两种方法的(x ^ 2 + y ^ 2 + z ^ 2)的平方根.
我有一个xyz加速度计和磁力计.现在我想用两者来确定设备的方向.我看到的问题是,根据设备方向,我需要以不同的顺序使用传感器.
让我举个例子.如果我让设备面向我,则可以使用加速度计确定滚动和俯仰的变化.对于偏航,我使用磁力计.
但是如果我将设备水平放置(即将其旋转90º,面向天花板),则向上矢量(现在是水平)的任何变化都不会引起注意,因为加速度计没有检测到任何变化.现在可以使用磁力计检测到这一点.
所以问题是,如何确定何时使用其中一个.这对两个传感器来说足够了还是我还需要其他东西?
谢谢
有没有人知道如何使用世界磁模型将磁场传感器的结果从Android设备转换为坐标?有没有这样做的网络服务?
我希望通过以下方法获取手机当前的方向:
getRotationMatrix()
和获取初始方向(方位角)getOrientation()
.电话介绍:
手机的xy平面与地平面固定.即,处于"发短信行走"的方向.
" getOrientation()
"回归:
Android API允许我轻松获取方向,即方位角,俯仰,滚动,来自getOrientation()
.
请注意,此方法始终返回其范围内的值:[0, -PI]
和[o, PI]
.
我的问题:
由于陀螺仪读数的集成,表示为dR
,可能相当大,所以当我这样做时CurrentOrientation += dR
,CurrentOrientation
可能超过[0, -PI]
和[o, PI]
范围.
需要什么样的操作,这样我总是能获得的内当前的方向[0, -PI]
和[o, PI]
范围?
我在Python中尝试了以下内容,但我非常怀疑它的正确性.
rotation = scipy.integrate.trapz(gyroSeries, timeSeries) # integration
if (headingDirection - rotation) < -np.pi:
headingDirection += 2 * np.pi
elif (headingDirection - rotation) > np.pi:
headingDirection -= 2 * np.pi
# …
Run Code Online (Sandbox Code Playgroud) 我正在Android上试用Sensor.TYPE_ROTATION_VECTOR.它应该使用磁场传感器,加速度计和陀螺仪始终提供准确的旋转.但是,我注意到Moto G 2nd发生了巨大的漂移.我想知道这是否是特定于设备的问题,或者这种情况发生在很多手机上(我会假设,虽然我很熟悉Moto G 2nd是一个有问题的陀螺仪).
是否有另一种形式的传感器融合,它是无漂移的(使用磁传感器)?我也试过了Google Cardboard的传感器融合,但它使用了偏差估计,因此可能并非完全漂移(因为此时看不到磁场传感器),尽管仍然比TYPE_ROTATION_VECTOR好很多.
我需要获得设备方向.据我所知常用TYPE_ACCELEROMETER
和TYPE_MAGNETIC_FIELD
传感器.我的问题是让SensorManager.getDefaultSensor
我回归null
地磁传感器.它返回null
的TYPE_ORIENTATION
传感器了.
manager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensorAcc = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), //normal object
sensorMagn = manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); //null
orientationListener = new OrientationSensorListener();
manager.registerListener(orientationListener, sensorAcc, 10);
manager.registerListener(orientationListener, sensorMagn, 10);
Run Code Online (Sandbox Code Playgroud)
我需要另一种方法来获取设备方向.
我目前正在开发iPhone应用程序(在iPhone 5,iOS 7,Xcode 5上),这需要非常准确地确定当前的态度.CMDeviceMotion的"态度"并不能满足这些要求,因为Apple的传感器融合算法似乎过分依赖陀螺仪,而陀螺仪的速度相当快(根据我的经验).这就是我决定读出裸传感器数据的原因,后来我想将它自己组合在一个传感器融合算法中.
在询问磁力计数据时,有两种可能性:
通过CMMotionManager中的CMMagnetometerData
通过CMDeviceMotion中的CMCalibratedMagneticField关于Apple的说法
此属性返回的CMCalibratedMagneticField可为您提供设备附近的总磁场,而无需设备偏差.与CMMagnetometer类的magneticField属性不同,这些值反映了地球的磁场加上周围的场,减去了器件偏置.
原则上(2.)正是我想要的.
如果磁力计数据正确校准,则可以进行非常简单的测试.为简单起见,可以将自己限制在两个维度.当设备位于其后面时,组合B_x ^ 2 + B_y ^ 2必须是恒定的,与设备指向的方向无关.它必须等于地球磁场的水平分量(假设设备附近没有其他场).因此,当执行位于其背面的设备的360度转弯时,B_x上的测量数据B_y应显示圆形.详情请见此处.
现在重点:CMCalibratedMagneticField的数据不会产生圆圈!
有没有人对此有解释?或者有人知道,CMCalibratedMagneticField是如何产生的?当执行设备的"八字形"运动时,磁力计是否从上方校正,或者什么是运动?
顺便说一句.为什么"八字形"机芯并没有将设备绕在它的三轴上,这样可以进行上述链接中所述的校准?
对于这个问题的任何澄清我都很高兴...谢谢!
我实际上是从iphone开发板上转发一个问题.我没有问过,但是在试图找到答案时我发现了它.还没有人在那里做出回应,所以我想我会尝试在这里发布.
有没有人知道关于从CLHeading的原始xyz值计算磁航向的算法的任何细节?我相信必须有一个通用的方法,适用于不同的磁力计.
我试图让矢量的方向指向相机,相对于磁北.我的印象是我需要使用getOrientation()返回的值,但我不确定它们代表什么.当我改变手机的方向时,我从getOrientation()获得的值不会发生可预测的变化(旋转90度不会将值改变90度).我需要知道getOrientation()返回的值是什么意思.到目前为止我所写的内容如下:
package com.example.orientation;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;
public class Orientation extends Activity{
private SensorManager mSM;
private mSensorEventListener mSEL;
float[] inR = new float[16];
float[] outR= new float[16];
float[] I = new float[16];
float[] gravity = new float[3];
float[] geomag = new float[3];
float[] orientVals = new float[3];
final float pi = (float) Math.PI;
final float rad2deg = 180/pi;
/** Called when the activity is first created. */
@Override …
Run Code Online (Sandbox Code Playgroud) rotation accelerometer orientation magnetometer augmented-reality
使用TYPE_MAGNETOMETER传感器时,可获得与器件方向相关的磁场强度的X,Y,Z值.我想要得到的是将这些值转换为全局参考框架,澄清:用户接受设备,测量这些值,而不是将设备旋转任何轴周围一定程度并获得相同的值.请在下面找到类似的问题: 在全局坐标中获取磁场值 如何获得磁场矢量,与设备旋转无关? 在这个答案中描述了样本解决方案(它用于线性加速,但我认为没关系):https://stackoverflow.com/a/11614404/2152255 我使用它并且我得到3个值,X总是非常小(不要认为它是正确的),Y和Z都可以,但是当我旋转设备时它们仍然有点变化.怎么可以调整?它可以全部解决吗?我使用简单的卡尔曼滤波器来近似测量值,因为即使设备根本没有移动/旋转,我也会得到不同的值.请在下面找到我的代码:
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.opengl.Matrix;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import com.test.statistics.filter.kalman.KalmanState;
import com.example.R;
/**
* Activity for gathering magnetic field statistics.
*/
public class MagneticFieldStatisticsGatheringActivity extends Activity implements SensorEventListener {
public static final int KALMAN_STATE_MAX_SIZE = 80;
public static final double MEASUREMENT_NOISE = 5;
/** Sensor manager. */
private SensorManager mSensorManager;
/** Magnetometer spec. */
private TextView vendor;
private TextView resolution; …
Run Code Online (Sandbox Code Playgroud) magnetometer ×10
android ×5
sensor ×3
gyroscope ×2
ios ×2
iphone ×2
orientation ×2
calibration ×1
core-motion ×1
gps ×1
location ×1
objective-c ×1
rotation ×1