WiFi与惯导融合定位其二:安卓获取惯性数据(线性加速度、旋转矢量)

运动传感器的可能架构因传感器类型而异:

  • 重力、线性加速度、旋转矢量、有效运动、计步器和步测器传感器可能基于硬件,也可能基于软件(处理过的数据,可能为多个传感器数据的融合)。
  • 加速度计传感器和陀螺仪传感器始终基于硬件。

一、安卓运动传感器

二、传感器数据使用

三、线性加速度传感器

四、旋转矢量传感器

五、四元数的使用

六、开发注意事项

七、关键代码


一、安卓运动传感器

大多数 Android 设备都配有加速度计,而现在许多设备都带有陀螺仪。基于软件的传感器的可用性更具可变性,因为其通常依赖一个或多个硬件传感器来获取其数据。根据设备的不同,这些基于软件的传感器可以从加速度计和磁力计或陀螺仪中获取其数据。

运动传感器在监控设备运动方面(例如倾斜、晃动、旋转或摆动)非常有用。所有运动传感器都为每个 SensorEvent返回传感器值的多维数组。例如,在单个传感器事件期间,加速度计返回三个坐标轴的加速力数据,而陀螺仪返回三个坐标轴的旋转速率数据。这些数据值与其他 SensorEvent参数一起在 float 数组中(values)返回。(详细参考:运动传感器

二、传感器数据使用

使用不同传感器的方法大致相同,通过调用系统API就可以实现。分为以下几步:
1.获取SensorManager
2.使用SensorManager获取加速度传感器
3.创建自定义的传感器监听函数,并注册
4.相对应的,在合适位置实现注销监听器的调用

三、线性加速度传感器

线性加速传感器为您提供了一个三维矢量,表示沿着每个设备轴的加速度(不包括重力)。您可以使用此值执行手势检测。该值还可以用作惯性导航系统的输入值,该系统使用航位推测法。以下代码展示如何获取默认线性加速传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);

四、旋转矢量传感器

旋转矢量将设备的屏幕方向表示为角度和轴的组合,其中设备已围绕轴(x、y 或 z)旋转了 θ 度,SensorEvent默认返回四元数。以下代码展示如何获取默认旋转矢量传感器的实例:

private SensorManager sensorManager;
private Sensor sensor;
...
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

五、四元数的使用

暂且不想去理解,等后续需要使用并计算时候再去看看相关概念和用法,有一个B站up主的视频不错:四元数的可视化

六、开发注意事项

有的手机没有陀螺仪,不利于做惯导实验。

七、关键代码

同时监听线性加速度与旋转矢量,在监听函数onSensorChanged里面需要添加条件判断。

public class MainActivity extends AppCompatActivity implements SensorEventListener{
    private SensorManager sensorManager;
    private Sensor linear;
    private Sensor rotation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        linear = sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
        rotation = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
    }

    @Override
    public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
    }

    @Override
    public final void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION) {
            // 获取加速度传感器的三个参数
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            LogUtil.i("LINEAR", "onSensorChanged: " + x + ", " + y + ", " + z);
        }
        if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            float w = event.values[3];
            LogUtil.i("ROTATION", "onSensorChanged: " + x + ", " + y + ", " + z + "," + w);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 注册传感器监听函数
        sensorManager.registerListener(this, linear, SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, rotation, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 注销监听函数
        sensorManager.unregisterListener(this);
    }
}

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值