Android 如何在安卓系统中使用加速计进行上下震动?
我试过下面的方法,但效果并不理想。。若设备保持正常状态,那个么它也会触发震动事件Android 如何在安卓系统中使用加速计进行上下震动?,android,accelerometer,android-sensors,Android,Accelerometer,Android Sensors,我试过下面的方法,但效果并不理想。。若设备保持正常状态,那个么它也会触发震动事件 @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub long curTime = System.currentTimeMillis(); // only allow one update every 200Ms. if ((curTime - la
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
long curTime = System.currentTimeMillis();
// only allow one update every 200Ms.
if ((curTime - lastUpdate) > 200) {
lastUpdate = curTime;
x = event.values[SensorManager.DATA_X];
y = event.values[SensorManager.DATA_Y];
z = event.values[SensorManager.DATA_Z];
Vibrator vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Round(y, 4) > 22) {
vibrate.vibrate(200);
Log.d("sensor", "==== Up Detected===");
} else if (Round(y, 4) < -20) {
vibrate.vibrate(200);
Log.d("sensor", "==== Down Detected=== ");
}
mLastX = x;
mLastY = y;
mLastZ = z;
}
}
public static float Round(float Rval, int Rpl) {
float p = (float) Math.pow(10, Rpl);
Rval = Rval * p;
float tmp = Math.round(Rval);
return (float) tmp / p;
}
@覆盖
传感器更改时的公共无效(传感器事件){
//TODO自动生成的方法存根
long curTime=System.currentTimeMillis();
//仅允许每200Ms更新一次。
如果((curTime-lastUpdate)>200){
lastUpdate=curTime;
x=事件值[SensorManager.DATA_x];
y=事件值[SensorManager.DATA_y];
z=事件值[SensorManager.DATA_z];
可控震源振动=(可控震源)getSystemService(Context.可控震源服务);
如果(圆形(y,4)>22){
振动。振动(200);
Log.d(“传感器”,“检测到向上==”;
}否则如果(圆形(y,4)<-20){
振动。振动(200);
Log.d(“传感器”,“检测到的故障==”);
}
mLastX=x;
mLastY=y;
mLastZ=z;
}
}
公共静态浮点循环(浮点RVL、整数Rpl){
浮点p=(浮点)数学功率(10,Rpl);
Rval=Rval*p;
浮点tmp=数学圆(Rval);
返回(浮动)tmp/p;
}
请帮忙
任何帮助都将不胜感激
谢谢传感器值非常原始且嘈杂。您需要在它们上面添加一层数字信号处理,以获得良好的效果。仅使用原始值将导致结果中的大量抖动。您正在尝试使用时间延迟执行一些基本操作,但您需要执行更多过滤
同时,你也在对震动做出反应。这种振动会使加速计看到移动,从而导致更多的误报。将低通滤波器作为y轴值 基本过滤器如文件中所述
public void onSensorChanged(SensorEvent event){
// In this example, alpha is calculated as t / (t + dT),
// where t is the low-pass filter's time-constant and
// dT is the event delivery rate.
final float alpha = 0.8;
// Isolate the force of gravity with the low-pass filter.
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
// Remove the gravity contribution with the high-pass filter.
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
我没有得到你答案的第一部分。你从传感器得到的值不能被信任,因为它们有很多错误的读数,而且并不准确。在电气工程中有一门研究如何分析和调整信号读数的课程,叫做数字信号处理。其中的一个概念是过滤器——它是接受、拒绝或部分接受阅读的一种方式。你需要一个,我只是不知道该用哪个。