从我的Android设备,我可以读取一系列线性加速度值(在设备的坐标系中)和一组绝对方向值(在地球坐标系中).我需要的是获得后一个坐标系中的线性加速度值.系统.
我该怎么转换它们?
在Ali回复评论后编辑:
好吧,所以如果我理解正确的话,当我测量线性加速度时,手机的位置完全没关系,因为读数是在地球坐标系中给出的.对?
但我刚做了一个测试,我把手机放在不同的位置,并在不同的轴上加速.有3对图片 - 第一部分显示我如何放置设备(对不起我的Paint"掌握技能"),第二部分显示线性acc提供的数据读数.传感器:



现在 - 为什么在第三种情况下,加速沿Z轴(而不是Y)发生,因为设备位置无关紧要?
android vector accelerometer coordinate-systems coordinate-transformation
我想要的是一种位置的"磁性指纹".我使用MAGNETIC_FIELD传感器,如果我得到(不幸的是没有进一步说明)X,Y和Z轴的3个值.
问题是,当我旋转设备时值会改变,所以我猜3轴是相对于设备的.什么我需要的是让我得到同样的3个值,而无论该设备是如何旋转补偿装置的旋转.
我试图乘以旋转矩阵(我知道如何得到它),试图乘以倾角矩阵等等,但没有任何效果.无论我尝试什么,旋转设备时值仍会改变.
那么有谁知道如何做对吗?最好使用代码,因为我读了很多像'那么你必须使用旋转矩阵补偿它',但没有找到一个具体的工作实例.
我无法获得良好的方向传感器读数.传感器读数似乎不可靠,因此我针对两个免费传感器测试应用程序(传感器测试仪(Dicotomica)和传感器监测(R软件))测试了我的代码.我发现虽然我的读数经常与传感器测试应用程序一致,但偶尔方位角/偏航和滚动的值差异高达40度,尽管音高读数大多是一致的.两个免费的应用程序似乎总是彼此一致.
我将我的代码放入一个微小的Android活动中,并得到了同样的不一致.代码如下:
public class MainActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private float[] AccelerometerValues;
private float[] MagneticFieldValues;
private float[] RotationMatrix;
private long nextRefreshTime; // used to ensure dump to LogCat occurs no more than 4 times a second
private DecimalFormat df; // used for dumping sensors to LogCat
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSensorManager = (SensorManager)getSystemService(android.content.Context.SENSOR_SERVICE);
Sensor SensorAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, SensorAccelerometer, SensorManager.SENSOR_DELAY_UI);
Sensor SensorMagField = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mSensorManager.registerListener(this, SensorMagField, SensorManager.SENSOR_DELAY_UI);
AccelerometerValues …Run Code Online (Sandbox Code Playgroud) 对于我的应用程序,我需要计算我的设备参考真北的加速度.我的想法是计算磁北的设备方向并对其应用偏角以使方向为真北.然后我想计算设备的加速度并将其引用到方向,但我不知道应该怎么做.
我会尝试使用SensorManager.getRotationMatrix()和获取设备方向SensorManager.getOrientation().然后我得到了偏角GeomagneticField.getDeclination()并将其应用于方位值的方位角SensorManager.getOrientation().
但是,如何将加速度计值映射到此方向?它甚至可能吗?