gpt4 book ai didi

java - 如何在android中使用加速度计跟踪路径?

转载 作者:搜寻专家 更新时间:2023-11-01 08:45:06 24 4
gpt4 key购买 nike

我想创建一个在 android 中跟踪路径的应用程序。我使用以下代码计算不同方向的加速度。

package com.example.usrivast.accelerometer;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends Activity implements SensorEventListener{

Sensor accelerometer = null;
SensorManager sm = null;
TextView acceleration = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sm = (SensorManager)getSystemService(SENSOR_SERVICE);
accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
acceleration = (TextView)findViewById(R.id.acceleration);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

@Override
public void onSensorChanged(SensorEvent event) {

acceleration.setText("x: " + event.values[0] + "\ny: " + event.values[1] + "\nz: " + event.values[2]);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}

但我无法理解这些值的输出。它们变化非常迅速。此外,如果我的手机处于静止状态,那么这些值也会发生变化。当我的手机静止在我的 table 上时,这些值的一个例子是x:-0.1278y:0.2968z:9.6323它们变化非常迅速。我正在使用 Nexus 5。

最佳答案

智能手机中的加速度计非常便宜且体积小巧。这意味着他们的输出质量很差。

您会注意到的第一件事是您已经注意到的,即这些值将非常嘈杂。这意味着这些值将一直随机且非常快速地上下反弹。这只是典型的信号噪声或白噪声,便宜的传感器有很多,特别是当它们被包装在一个有很多数字电子设备和天线(wifi、手机频率、 ETC..)。找出消除噪音的方法本身就是一个完整的科学领域(称为信号处理),而且它比您想象的要复杂得多。一个基本的想法是使用某种 low-pass filter .

第二件事你现在不会注意到,但如果你尝试对信号做更多的事情(尤其是在整合它时),你就会注意到。这个问题与传感器的偏差有关。基本上,这个问题是关于零加速度没有在传感器上注册为零。使事情复杂化的是,这种“偏差”通常会随着时间的推移而 float 和变化(并且也会随着温度而变化,例如当电池变热或手机在手掌中时)。同样,正确地消除这种偏差并不容易(可能就像应用 high-pass filter 一样简单,但首选方法是使用增强的 Kalman filter)。

第三个问题是非线性。大多数便宜的加速度计在加速度和测量值之间远没有线性关系。它们通常被设计成在 0 附近相对线性,并且在接近它们可以测量的加速度范围的上限和下限时变得更糟。因此,如果您的 Action 不太剧烈,这不会成为问题。

所有这些问题加在一起的结果是,智能手机内部的加速度计根本不够好,无法产生任何精确的东西,比如手机运动路径的痕迹。要实际产生这条路径,您需要对信号进行两次数值积分(一次获得速度,再一次获得位置)。数值积分通常会使上述每个问题都变得更糟,而且这样做两次将是灾难性的。大多数可用于消除噪声和/或偏差的滤波器都会在信号积分时增加其他问题。不管怎样,你正在与一些牢不可破的自然力量作斗争,信号处理是一个非常无情的领域,底线是如果你希望最终得到垃圾以外的任何东西,你需要更好的信号开始,或者正如我们所说,垃圾进,垃圾出。

这就是为什么智能手机中的加速度计很少用于检测手机的握持方向(这是基于一段时间内加速度计平均值的简单计算)和检测相当暴力的手势(检测大/长峰值)。即使像 Wii-mote 这样具有更好传感器的东西,也无法用于重新创建路径,信号仍然太嘈杂且有偏差。

关于java - 如何在android中使用加速度计跟踪路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29225752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com