有两种方法可以获得3个旋转值(方位角,俯仰,滚动).
一个是注册TYPE_ORIENTATION类型的监听器.这是最简单的方法,我从每次旋转中得到正确的值范围,如文档所示:azimuth:[0,359] pitch:[ - 180,180] roll:[ - 90,90]
另一个,你第一次看到它时最精确和最复杂.Android推荐它,所以我想使用它,但我得到不同的值.
方位角:[ - 180,180].-180/180是S,0 i N,90 E和-90 W.
pitch:[ - 90,90 ].90为90,-90为-90,0为0但-180/180(屏幕向下)为0.
roll:[ - 180,180].
我应该得到相同的值,但有小数,对吧?
我有以下代码:
aValues = new float[3];
mValues = new float[3];
sensorListener = new SensorEventListener (){
public void onSensorChanged (SensorEvent event){
switch (event.sensor.getType ()){
case Sensor.TYPE_ACCELEROMETER:
aValues = event.values.clone ();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mValues = event.values.clone ();
break;
}
float[] R = new float[16];
float[] orientationValues = new float[3];
SensorManager.getRotationMatrix (R, null, aValues, mValues);
SensorManager.getOrientation (R, orientationValues);
orientationValues[0] …Run Code Online (Sandbox Code Playgroud) 使用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上获得加速度计并将它们放在地球坐标系上,就像在这个主题上从设备的坐标系加速到绝对坐标系或这里将加速度计的数据从设备坐标转换为真实世界坐标,但这些解决方案没有为我工作.我正在处理Processing.该项目只是为了追踪太空中的手机加速度,无论它是怎样的(站立,侧面......).我也是Android的新手.我很感激你的帮助!谢谢.
编辑:我不需要手机准确的位置,只需要加速.
我的问题类似于在android中更改传感器坐标系
我希望无论设备方向如何,都能够将用户的动作相互比较.因此,当用户以纵向方向拿出电话并弯曲他的手臂时,加速度读数与他在风景中拿出手机然后将手臂向相同方向弯曲时的读数相同.
这就是我所说的"用户"坐标系.它与世界坐标系不同,因为用户面向的风向应该无关紧要.它与设备坐标不同,因为用户如何握住他的设备无关紧要.
在我的应用中,在每次移动之前进行校准步骤是可以接受的,因此可以确定基础/静止方向矩阵.它可能只是将第一个运动的矩阵与第二个运动的倒数相乘(然后是新值?)
提到的问题中的答案似乎是正确的,但我需要一个更具体的解释,实际的代码样本将是理想的.
注意remapCoordinateSystem是不够的,它只接受直角.我需要能够处理小的偏差,因为设备被绑在手腕上,手腕可能并不总是与手臂成直角.
android sensor orientation rotational-matrices android-sensors
对于我的应用程序,我需要计算我的设备参考真北的加速度.我的想法是计算磁北的设备方向并对其应用偏角以使方向为真北.然后我想计算设备的加速度并将其引用到方向,但我不知道应该怎么做.
我会尝试使用SensorManager.getRotationMatrix()和获取设备方向SensorManager.getOrientation().然后我得到了偏角GeomagneticField.getDeclination()并将其应用于方位值的方位角SensorManager.getOrientation().
但是,如何将加速度计值映射到此方向?它甚至可能吗?