我正在开发一个 android 应用程序来获取 android 设备的方向。
我正在使用下面的代码:
public class AccelerometerDirection extends Activity implements SensorEventListener {
TextView textView;
StringBuilder builder = new StringBuilder();
float [] history = new float[2];
String [] direction = {"NONE","NONE"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
setContentView(textView);
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent event) {
float xChange = history[0] - event.values[0];
float yChange = history[1] - event.values[1];
history[0] = event.values[0];
history[1] = event.values[1];
if (xChange > 2){
direction[0] = "LEFT";
}
else if (xChange < -2){
direction[0] = "RIGHT";
}
if (yChange > 2){
direction[1] = "DOWN";
}
else if (yChange < -2){
direction[1] = "UP";
}
builder.setLength(0);
builder.append("x: ");
builder.append(direction[0]);
builder.append(" y: ");
builder.append(direction[1]);
textView.setText(builder.toString());
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// nothing to do here
}
}
引用这个How can I get the direction of movement using an accelerometer? .
但是工作很糟糕,我没有得到准确的值。我尝试了不同的常数值,没有用。任何想法请分享。
最佳答案
此行为您提供不同设备在 50 赫兹或 100 赫兹的非常高频率下的值
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
因此,即使设备处于静止状态,对于每次读数,您的输出也会发生变化,因为读数加速度计不是很准确。
所以要么用低通滤波器过滤你的读数,要么使用频率较低的读数(比如 1 HZ)
manager.registerListener(this, accelerometer, 1000000);
但是低通滤波器是获得平滑行为的最佳选择
关于android - 使用加速度计机器人的运动方向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14332300/