标签: magnetometer

在iOS中,Core Location和Core Motion框架的磁场值有什么区别?

我有两种方法可以使用iOS设备的磁力计获得磁场(强度,x,y和z).

1)核心位置
使用CLHeading CLLocationManagerDelegate方法locationManager:didUpdateHeading:.这类似于Apple的Teslameter示例应用程序.

2)核心运动
用于CMMagneticFieldCMMotionManagermagnetometerData.magneticField.

问题:
a)两者有什么区别?我从两者中得到了不同的价值观.我原以为他们会返回相同的值.
当我从静止位置(面朝上放在桌子上)启动应用程序,然后将设备向上提升到空中时,差异最为显着.
b)如果存在差异,何时应使用Core Location标题中的磁场,何时应使用Core Motion的磁场?

注意:我也不确定Core Location和Core Motion的"磁场"是否涉及不同的磁场概念.
注意:我将强度计算为两种方法的(x ^ 2 + y ^ 2 + z ^ 2)的平方根.

core-location magnetometer ios core-motion

61
推荐指数
1
解决办法
2万
查看次数

如何确定绝对方向

我有一个xyz加速度计和磁力计.现在我想用两者来确定设备的方向.我看到的问题是,根据设备方向,我需要以不同的顺序使用传感器.

让我举个例子.如果我让设备面向我,则可以使用加速度计确定滚动和俯仰的变化.对于偏航,我使用磁力计.

但是如果我将设备水平放置(即将其旋转90º,面向天花板),则向上矢量(现在是水平)的任何变化都不会引起注意,因为加速度计没有检测到任何变化.现在可以使用磁力计检测到这一点.

所以问题是,如何确定何时使用其中一个.这对两个传感器来说足够了还是我还需要其他东西?

谢谢

sensor accelerometer magnetometer

18
推荐指数
2
解决办法
2万
查看次数

android nGPS:根据磁场而不是gps或细胞三角测量获取位置

有没有人知道如何使用世界磁模型将磁场传感器的结果从Android设备转换为坐标?有没有这样做的网络服务?

gps android location magnetometer

13
推荐指数
1
解决办法
2598
查看次数

如何用罗盘读数和陀螺仪读数获得手机的方位角?

我希望通过以下方法获取手机当前的方向:

  1. 首先通过getRotationMatrix()和获取初始方向(方位角)getOrientation().
  2. 随着时间的推移添加陀螺仪读数的集成,以获得当前的方向.

电话介绍:

手机的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 magnetometer gyroscope android-sensors

12
推荐指数
1
解决办法
7988
查看次数

Sensor.TYPE_ROTATION_VECTOR有漂移:有替代方案吗?

我正在Android上试用Sensor.TYPE_ROTATION_VECTOR.它应该使用磁场传感器,加速度计和陀螺仪始终提供准确的旋转.但是,我注意到Moto G 2nd发生了巨大的漂移.我想知道这是否是特定于设备的问题,或者这种情况发生在很多手机上(我会假设,虽然我很熟悉Moto G 2nd是一个有问题的陀螺仪).

是否有另一种形式的传感器融合,它是无漂移的(使用磁传感器)?我也试过了Google Cardboard的传感器融合,但它使用了偏差估计,因此可能并非完全漂移(因为此时看不到磁场传感器),尽管仍然比TYPE_ROTATION_VECTOR好很多.

android accelerometer magnetometer gyroscope sensor-fusion

12
推荐指数
1
解决办法
1107
查看次数

没有地磁的Android设备方向

我需要获得设备方向.据我所知常用TYPE_ACCELEROMETERTYPE_MAGNETIC_FIELD传感器.我的问题是让SensorManager.getDefaultSensor我回归null地磁传感器.它返回nullTYPE_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)

我需要另一种方法来获取设备方向.

android orientation magnetometer

12
推荐指数
2
解决办法
2509
查看次数

Apple的iPhone磁力计校准是否正常工作?

我目前正在开发iPhone应用程序(在iPhone 5,iOS 7,Xcode 5上),这需要非常准确地确定当前的态度.CMDeviceMotion的"态度"并不能满足这些要求,因为Apple的传感器融合算法似乎过分依赖陀螺仪,而陀螺仪的速度相当快(根据我的经验).这就是我决定读出裸传感器数据的原因,后来我想将它自己组合在一个传感器融合算法中.

在询问磁力计数据时,有两种可能性:

  1. 通过CMMotionManager中的CMMagnetometerData

  2. 通过CMDeviceMotion中的CMCalibratedMagneticField关于Apple的说法

此属性返回的CMCalibratedMagneticField可为您提供设备附近的总磁场,而无需设备偏差.与CMMagnetometer类的magneticField属性不同,这些值反映了地球的磁场加上周围的场,减去了器件偏置.

原则上(2.)正是我想要的.

如果磁力计数据正确校准,则可以进行非常简单的测试.为简单起见,可以将自己限制在两个维度.当设备位于其后面时,组合B_x ^ 2 + B_y ^ 2必须是恒定的,与设备指向的方向无关.它必须等于地球磁场的水平分量(假设设备附近没有其他场).因此,当执行位于其背面的设备的360度转弯时,B_x上的测量数据B_y应显示圆形.详情请见此处.

现在重点:CMCalibratedMagneticField的数据不会产生圆圈!

情节

有没有人对此有解释?或者有人知道,CMCalibratedMagneticField是如何产生的?当执行设备的"八字形"运动时,磁力计是否从上方校正,或者什么是运动?

顺便说一句.为什么"八字形"机芯并没有将设备绕在它的三轴上,这样可以进行上述链接中所述的校准?

对于这个问题的任何澄清我都很高兴...谢谢!

iphone calibration magnetometer ios

11
推荐指数
1
解决办法
3624
查看次数

从xyz磁力计(iPhone 3.0)获得磁北

我实际上是从iphone开发板上转发一个问题.我没有问过,但是在试图找到答案时我发现了它.还没有人在那里做出回应,所以我想我会尝试在这里发布.

在此先感谢您的帮助!

有没有人知道关于从CLHeading的原始xyz值计算磁航向的算法的任何细节?我相信必须有一个通用的方法,适用于不同的磁力计.

iphone objective-c magnetometer

10
推荐指数
1
解决办法
2万
查看次数

使用getRotationMatrix()和getOrientation()查找方向

我试图让矢量的方向指向相机,相对于磁北.我的印象是我需要使用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

9
推荐指数
1
解决办法
1万
查看次数

将来自设备的磁场X,Y,Z值转换为全局参考系

使用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)

android sensor magnetometer android-sensors

9
推荐指数
2
解决办法
3万
查看次数