我正在开发一个Android应用程序,我想知道是否有可能检测到一个轴固定的运动方向.例如,我想把手机放在桌子上并在我移动它时检测方向(左,右,上和下).距离没有必要,我只想知道准确的方向.
我希望能够在我的应用程序中使用一个相当简单的跌倒检测算法.在onSensorChanged()中,我得到当前x,x,z值的绝对值,并从中减去SensorManager.GRAVITY_EARTH(9.8 m/s).结果值必须连续10次大于阈值以设置表示加速度计已检测到下降的标志,阈值约为8m/s.
此外,我正在比较阈值已经通过时手机的方向和当阈值不再通过时它的方向,这设置了另一个标志,表示方位传感器已经检测到下降.
当两个标志都设置好后,就会发生一个事件来检查用户是否正确等等.我的问题在于阈值,当手机直接保持时,加速度计的绝对值约为9.8米/秒,但当我保持静止时在某个角度它可以超过15米/秒.这导致其他事件触发跌倒检测,如果我增加阈值以避免这种情况,则不会检测跌倒.
任何人都可以在这里给我一些建议,我应该使用哪些可能的值或如何改进我的方法?非常感谢.
我已阅读有关访问手机加速度计(加速度和方向)值的文章/教程.我正在尝试构建一个简单的应用程序,我可以使用这些值移动球图像.这是我的代码:
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class Accelerometer extends Activity implements SensorEventListener {
/** Called when the activity is first created. */
CustomDrawableView mCustomDrawableView = null;
ShapeDrawable mDrawable = new ShapeDrawable();
int x ;
int y ;
private SensorManager sensorManager = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get …Run Code Online (Sandbox Code Playgroud) 我想编写一个应用程序,从不同的传感器(GPS,Acc,Gyro,Compass)中读取尽可能多的传感器状态(每次).所以我必须调查使用NDK是否有优势.
这是我的问题:
a)从传感器读取传感器值时的瓶颈是什么?是senosr本身还是Java?我可以使用NDK来提高费率吗?(我认为GPS的瓶颈是传感器本身,但我已经读过,例如陀螺传感器非常快)我找到了这个线程,似乎瓶颈就是传感器.有人能证实吗?
b)轮询而不是使用EventListener是否会提高速率?什么是快速读取传感器值的最佳方法?
c)NDK的使用是否会对应用的功耗产生任何影响?我没有发现任何相关信息.
d)我是Android新手.使用NDK而不是普通的Java是否更有能力?根据这个示例代码,使用事件队列与传感器进行交互似乎很简单,但是编译代码并从应用程序中使用它有多大的代价?
提前致谢.
通过引入类范围静态计数器并且忽略了x个事件,我能够解决我遇到的具体问题.但是我仍然想知道我做错了什么:用微秒的提示注册监听器而不是使用四个给定常量中的一个.
我的应用程序中的一项活动是让传感器参与获取设备的方向,确定滚动并使用它.
我在用
SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate)
注册我的传感器.从Android文档获取此方法:
参数
[...]
率
速率传感器事件在.这只是对系统的暗示.可以比指定的速率更快或更慢地接收事件.通常会更快地收到事件.该值必须是SENSOR_DELAY_NORMAL,SENSOR_DELAY_UI,SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST之一,或者是事件之间所需的延迟(以微秒为单位).
如果我使用4个预定义常量之一,那么应用程序工作正常; 但是这些常量都提供了对我的需求来说太快的速率提示.我必须发送一个UDP数据包,其中包含每个事件更改的一些信息,并且接收端似乎完全被使用任何预定义速率的消息所淹没.使用像30000这样的整数(因为API指定以微秒为单位的数量)会导致应用程序停止一起报告传感器事件.
我错过了什么阻止我使用自己的事件率提示?
我在x方向上旋转我的Android设备(从-180度到180度),见下图.
并且我假设只有旋转矢量x值被改变.Y和z可能有一些噪音,但值之间差别不大.
但是,我收到了这个.请注意
https://docs.google.com/spreadsheets/d/1ZLoSKI8XNjI1v4exaXxsuMtzP0qWTP5Uu4C3YTwnsKo/edit?usp=sharing
我怀疑我的传感器有一些问题.
任何的想法?非常感谢你.
吉米
我成功检测到手机绕轴的 0-360 度旋转(滚动),但现在我很难设计一种有效的算法来检测一整圈。我的工作但我认为不像我想要的那样优雅和有效的算法是:
private boolean detectRoll;
private boolean[] checkpointsR = new boolean[4];
private boolean fullRollTurn;
public void detectingRoll() {
setDetectRoll(true);
checkpointsR[0] = true;
for (int i = 1; i < 4; i++) {
if (roll > 90 * i && roll < 90 * (i + 1)
&& checkpointsR[i - 1] == true) {
checkpointsR[i] = true;
}
}
if (areAllTrue(checkpointsR) && roll > 0 && roll < 45) {
fullRollTurn = true;
// reset rollCheckpoints
for (int i = …Run Code Online (Sandbox Code Playgroud) 无论当前的屏幕方向(横向或纵向),我都希望获得当前的磁性方向.
我找到了这个例子,但它不是独立的方向,对吧?而这也帮不了我.我也读过http://android-developers.blogspot.de/2010/09/one-screen-turn-deserves-another.html.
这是我目前采用的方法,我不想使用(短):
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
private SensorEventListener sensorEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
/* Get measured value */
float current_measured_bearing = (float) event.values[0];
/* Compensate device orientation */
switch (((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay().getRotation()) {
case Surface.ROTATION_90:
current_measured_bearing = current_measured_bearing + 90f;
break;
case Surface.ROTATION_180:
current_measured_bearing = current_measured_bearing - 180f;
break;
case Surface.ROTATION_270:
current_measured_bearing = current_measured_bearing - 90f;
break;
}
Run Code Online (Sandbox Code Playgroud)
但最后一部分肯定是错的!getRotationMatrix()在这种情况下,如何正确使用更新的方法?(方向独立)或者我只需要event.values[]根据旋转矩阵使用数组的其他值?或者我需要'重新映射坐标'?那么,是实现这一目标的正确方法是什么?
我正在为具有360°屏幕旋转和API Level 11+的设备开发.
我知道这些问题经常被问到,但我不能将他们的答案转移到我的问题上.
android ×8
java ×2
orientation ×2
rotation ×2
sensor ×2
algorithm ×1
android-ndk ×1
bearing ×1
detection ×1
direction ×1
gyroscope ×1
performance ×1
physics ×1
quaternions ×1