Android-如何检测指南针度数的变化(Java)
我有下面的代码,在我的Nexus5上完美地工作 传感器更改时的公共无效(传感器事件){ float degree=Math.round(事件值[0]); displayMsg.setText(String.valueOf(degree)); }Android-如何检测指南针度数的变化(Java),java,android,compass,Java,Android,Compass,我有下面的代码,在我的Nexus5上完美地工作 传感器更改时的公共无效(传感器事件){ float degree=Math.round(事件值[0]); displayMsg.setText(String.valueOf(degree)); } 度数包含指南针的方向。我想做的是检测方向的变化。假设有人向北走,然后向右拐10度。当这个人改变方向时,我希望能够注意到。此外,还有不确定性。例如,当人向北行走时,方向不是恒定的0度。它将在358度和2-3度之间波动 我想到了使用定时器。计划每500毫秒
度数
包含指南针的方向。我想做的是检测方向的变化。假设有人向北走,然后向右拐10度。当这个人改变方向时,我希望能够注意到。此外,还有不确定性。例如,当人向北行走时,方向不是恒定的0度。它将在358度和2-3度之间波动
我想到了使用定时器。计划每500毫秒存储一次度数,然后做一次调整
if(数学abs(学位存储等级)>10)
Toast.makeText(这个“方向改变了”,Toast.LENGTH_SHORT).show();
但是,我认为,由于创建的线程数量,这个方法会耗尽内存。
有没有更聪明/更好的方法来检测方向的变化
更新 这是我正在做的全部代码 我在数步数,我想保持步数的方向。一旦方向改变了10度,步进计数器应该存储它的值(比如在数组列表中),然后转到0并重新开始计数
boolean start = true;
@Override
public void onSensorChanged(SensorEvent event) {
//------------------------------Compass--------------------------------------
final float degree = Math.round(event.values[0]);
displayMsg.setText(String.valueOf(degree));
//---------------------------------------------------------------------------
Sensor sensor = event.sensor;
float[] values = event.values;
int value = -1;
int steps;
if (values.length > 0) {
value = (int) values[0];
}
if(mode.equals("Start"))
{
if (sensor.getType() == Sensor.TYPE_STEP_COUNTER)
{
if(start)
{
count = value;
start = false;
}
steps = value-count;
stepCounter.setText("Step Counter Detected : " + steps);
}
}
}
我会使用低通滤波器来消除波动 代码如下:
protected float[] lowPass(float[] input, float[] output) {
if (output == null) return input;
for (int i = 0; i < input.length; i++) {
output[i] = output[i] + ALPHA * (input[i] - output[i]);
}
return output;
}
在此之后,像这样使用方位角:
if (azimut != null) {
canvas.rotate(-azimut * 360 / (2 * 3.14159f), centerx, centery);
if ((azimut > -0.2) && (azimut < 0.2)) current_direction = "North";
if ((azimut > 1.3) && (azimut < 1.7)) current_direction = "East";
if (((azimut < -2.8) && (azimut > -3.2)) || ((azimut < 3.2) && (azimut > 2.8))) current_direction = "South";
if ((azimut > -1.7) && (azimut < -1.3)) current_direction = "West";
}
if(方位角!=null){
画布旋转(-azimut*360/(2*3.14159f),centerx,centery);
如果((方位角>-0.2)和((方位角<0.2))当前方向为“北”;
如果((方位角>1.3)和((方位角<1.7))当前方向为“东”;
如果((方位<-2.8)和&(方位>-3.2))| |((方位<3.2)和&(方位>2.8)))当前_方向=“南”;
如果((方位角>-1.7)和((方位角<-1.3))当前方向为“西”;
}
我认为您的问题更多地与传感器有关,而不是您的逻辑。你可以试试这个,但我并不是真的在传感器方面失败。我知道定位服务可以为您提供设备方位(通过gps),这也可能是一种选择
能否检查当前度数的更改是否超过阈值,然后用新度数更新存储的值
一个可能的例子如下:
其思想是,由于每次更新值时都会调用onSensorChanged,因此可以检查当前度数与存储值之间的差异是否超过某个阈值。
如果是,则采取行动并存储新的学位,否则将忽略更改
private float storedDegree;
public void onSensorChanged(SensorEvent event) {
if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
float degree = Math.round(event.values[0]);
if(Math.abs(degree - storedDegree) > 10) {
Toast.makeText(this,"Direction Changed",Toast.LENGTH_SHORT).show();
displayMsg.setText(String.valueOf(degree));
storedDegree = degree;
}
}
}
你的东西怎么了?似乎每次人员改变方向时都应该调用onSensorChanged,然后您只需将当前度数与存储值进行比较(如图所示)
onSensorChanged
不会在人员改变方向时调用。它经常被呼叫。我建议的问题是我使用Timer=new Timer()编码>然后定时器。调度(timerTask,5000)
方法。但是这个方法的内存不足!我应该在哪里设置mGravity和mGeomagnetic?这些代码只是罗盘的不同操作方式。我想在方向发生10度变化时进行检测,我认为您需要显示更多的代码,并解释发生了什么
private float storedDegree;
public void onSensorChanged(SensorEvent event) {
if (sensor.getType() == Sensor.TYPE_ORIENTATION) {
float degree = Math.round(event.values[0]);
if(Math.abs(degree - storedDegree) > 10) {
Toast.makeText(this,"Direction Changed",Toast.LENGTH_SHORT).show();
displayMsg.setText(String.valueOf(degree));
storedDegree = degree;
}
}
}