Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓加速计在z轴上读取0,无变化_Android_Accelerometer_Android Sensors - Fatal编程技术网

Android 安卓加速计在z轴上读取0,无变化

Android 安卓加速计在z轴上读取0,无变化,android,accelerometer,android-sensors,Android,Accelerometer,Android Sensors,我正在创建一个应用程序,利用加速计数据计算设备的滚动和俯仰。 这就是我现在所拥有的,仍然没有编码滚转/俯仰计算 只需检查存在哪些传感器并在logcat中列出它们,检查设备是否有加速计,并实现一个简单的输出GUI(4个文本视图,对应于3个轴和最大传感器范围) X和Y读数正确,手机静止,一次沿一个轴旋转,从0到9.5左右(对应于地球重力的正常9.8m/s2)。如预期的那样,晃动设备会导致值超过9.8阈值 然而,Z加速度(sensorEvent.values[2])在0.032左右是静止的(我们称之为

我正在创建一个应用程序,利用加速计数据计算设备的滚动和俯仰。 这就是我现在所拥有的,仍然没有编码滚转/俯仰计算

只需检查存在哪些传感器并在logcat中列出它们,检查设备是否有加速计,并实现一个简单的输出GUI(4个文本视图,对应于3个轴和最大传感器范围)

X和Y读数正确,手机静止,一次沿一个轴旋转,从0到9.5左右(对应于地球重力的正常9.8m/s2)。如预期的那样,晃动设备会导致值超过9.8阈值

然而,Z加速度(sensorEvent.values[2])在0.032左右是静止的(我们称之为零)。摇晃,旋转,除了把它扔到墙上以外的任何东西都不会产生任何变化。。。这使得我计算横滚和纵摇的任何尝试都毫无用处

这段代码有什么问题吗,或者我应该假设这部手机有什么问题(用我妻子的手机测试,手机型号完全相同:结果相同)

  • 加速计是KXTJ2-1009三轴加速计(适用于手机) 仅物理传感器)
  • 手机是中国制造的HTM手机(假设是HTC的克隆) ()

    公共类MainActivity扩展ActionBarActivity实现SensorEventListener{

    private TextView raw_x, raw_y, raw_z, acc_max;
    
    private boolean hasAccelerometer;
    private SensorManager senSensorManager;
    private Sensor senAccelerometer;
    private long lastUpdate = 0;
    private float last_x, last_y, last_z;
    private static final int SHAKE_THRESHOLD = 700;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    
        sMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE);
        List<Sensor> list = sMgr.getSensorList(Sensor.TYPE_ALL);
    
        String data = new String();
    
        for (Sensor sensor : list) {
            data += (sensor.getName() + "\n");
            data += (sensor.getVendor() + "\n");
            data += (sensor.getVersion() + "\n");
        }
    
        Log.d(TAG, data);
    
        PackageManager manager = getPackageManager();
        hasAccelerometer = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER);
    
        if(hasAccelerometer) {
            senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
            senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        Log.d(TAG,Float.toString(senAccelerometer.getMaximumRange()));
    
        initGui();    
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();    
    }
    
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Sensor mySensor = sensorEvent.sensor;
    
    
        if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    
            long curTime = System.currentTimeMillis();
    
            float x = (float) sensorEvent.values[0];
            float y = (float) sensorEvent.values[1];
            float z = (float) sensorEvent.values[2];
    
            if ((curTime - lastUpdate) > 100) {
                long diffTime = (curTime - lastUpdate);
                lastUpdate = curTime;
                float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000;
    
                if (speed > SHAKE_THRESHOLD) {
                    //doSomething()
                }
    
                if(raw_x!=null){
                    raw_x.setText(Float.toString(x));
                    raw_y.setText(Float.toString(y));
                    raw_z.setText(Float.toString(z));
                }
    
                last_x = x;
                last_y = y;
                last_z = z;
            }
        }
    }
    
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
    }
    
    private void initGui() {
        setContentView(R.layout.activity_main);
    
        raw_x = (TextView) findViewById(R.id.lbl_raw_x);
        raw_y = (TextView) findViewById(R.id.lbl_raw_y);
        raw_z = (TextView) findViewById(R.id.lbl_raw_z);
    
        acc_max = (TextView) findViewById(R.id.lbl_max);
        acc_max.setText(Float.toString(senAccelerometer.getMaximumRange()));
    }
    
    private TextView raw_x、raw_y、raw_z、acc_max;
    专用布尔加速度计;
    私人传感器管理器传感器管理器;
    专用传感器;
    private long lastUpdate=0;
    私人浮动last_x,last_y,last_z;
    私有静态最终int-SHAKE_阈值=700;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    sMgr=(传感器管理器)this.getSystemService(传感器服务);
    List List=sMgr.getSensorList(Sensor.TYPE\u ALL);
    字符串数据=新字符串();
    用于(传感器:列表){
    数据+=(sensor.getName()+“\n”);
    数据+=(sensor.getVendor()+“\n”);
    数据+=(sensor.getVersion()+“\n”);
    }
    Log.d(标签、数据);
    PackageManager=getPackageManager();
    HasAccelerator=manager.hasSystemFeature(PackageManager.FEATURE\u传感器\u加速计);
    如果(加速度计){
    senSensorManager=(SensorManager)getSystemService(Context.SENSOR\u SERVICE);
    SenAccelerator=senSensorManager.getDefaultSensor(传感器类型\加速计);
    senSensorManager.registerListener(此、senAccelerator、SensorManager.SENSOR\u延迟\u正常);
    }
    Log.d(TAG,Float.toString(senAccelerator.getMaximumRange());
    initGui();
    }
    @凌驾
    受保护的void onResume(){
    super.onResume();
    senSensorManager.registerListener(此、senAccelerator、SensorManager.SENSOR\u延迟\u正常);
    }
    @凌驾
    受保护的void onPause(){
    super.onPause();
    }
    @凌驾
    公共空间{
    super.ondestory();
    }
    @凌驾
    传感器更改时的公共无效(传感器事件传感器事件){
    传感器mySensor=sensorEvent.Sensor;
    if(mySensor.getType()==Sensor.TYPE\u加速计){
    long curTime=System.currentTimeMillis();
    float x=(float)sensorEvent.values[0];
    float y=(float)sensorEvent.values[1];
    float z=(float)sensorEvent.values[2];
    如果((curTime-lastUpdate)>100){
    long diffTime=(curTime-lastUpdate);
    lastUpdate=curTime;
    浮动速度=Math.abs(x+y+z-last_x-last_y-last_z)/diffTime*10000;
    如果(速度>抖动阈值){
    //doSomething()
    }
    如果(原始x!=null){
    原始x.setText(Float.toString(x));
    原始设置文本(Float.toString(y));
    原始设置文本(Float.toString(z));
    }
    最后的x=x;
    最后的y=y;
    last_z=z;
    }
    }
    }
    @凌驾
    精度更改时的公共无效(传感器,int精度){
    }
    私有void initGui(){
    setContentView(R.layout.activity_main);
    raw_x=(TextView)findViewById(R.id.lbl_raw_x);
    raw_y=(TextView)findViewById(R.id.lbl_raw_y);
    raw_z=(TextView)findViewById(R.id.lbl_raw_z);
    acc_max=(TextView)findViewById(R.id.lbl_max);
    acc_max.setText(Float.toString(senAccelerator.getMaximumRange());
    }
    
    }


显然这是正常的,因为Z轴取决于磁场方向。如果没有陀螺仪、磁强计或指南针,z值很可能总是0。或者至少保持不变。 因为我的这部手机没有这些功能,这就把它清除了