当前位置: 首页 > 面试题库 >

如何以固定速率记录来自Android运动传感器的数据

郎经纶
2023-03-14
问题内容

我正在学习Android编程的基础知识。

我有一个简单的android测试应用程序,其中将加速度计,磁力计和方向数据记录到一个外部文件中,同时也将其显示出来。我通过调用方法
initLogger* ,单击“ 开始” 按钮(相关传感器的registerListener)来启动日志记录过程。 *

看起来与此类似…

public void initLogger(View view)
{
    boolean bFlag = false;

    Button btnStart = (Button)findViewById(R.id.btnStartLog);
    Button btnStop = (Button)findViewById(R.id.btnStopLog);

    btnStart.setEnabled(bFlag);
    btnStop.setEnabled(!bFlag);

    bEnableLogging = true;
    //Start reading the sensor values
    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
    sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);

   //so on....

还有一个“停止”按钮,它将停止日志记录过程(最后通过为每个传感器调用unregisterListener来取消注册)

数据检索过程发生在 onSensorChanged
处理程序内部,该处理程序应从相关传感器中检索数据,将值设置为相应的UI元素,最后将数据记录到外部.csv文件中。

onSensorChanged 事件处理程序看起来像这样…

public void onSensorChanged(SensorEvent event) {


    // TODO Auto-generated method stub
    // accelerometer
    TextView tAX = (TextView) findViewById(R.id.txtViewAxValue);
    TextView tAY = (TextView) findViewById(R.id.txtViewAyValue);
    TextView tAZ = (TextView) findViewById(R.id.txtViewAzValue);

    // magnetic field
    TextView tMX = (TextView) findViewById(R.id.txtViewMx);
    TextView tMY = (TextView) findViewById(R.id.txtViewMy);
    TextView tMZ = (TextView) findViewById(R.id.txtViewMz);

    if (bEnableLogging) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

            accelerometerdata = event.values.clone();

            tAX.setText(Double.toString(accelerometerdata[0]));
            tAY.setText(Double.toString(accelerometerdata[1]));
            tAZ.setText(Double.toString(accelerometerdata[2]));


        }

        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

            magneticmatrixdata = event.values.clone();

            tMX.setText(Double.toString(magneticmatrixdata[0]));
            tMY.setText(Double.toString(magneticmatrixdata[1]));
            tMZ.setText(Double.toString(magneticmatrixdata[2]));

        }

               // so on ....

尽管我从所有已配置的传感器接收数据,但我无法控制接收数据的速率。即

我知道当Sensor数据更改时会触发SensorChanged事件。但是我希望此事件以固定的速率触发。 例如:每40ms

题:

  1. 如何确保SensorChanged事件以恒定速率触发?
  2. 在这种情况下,Java中的TimerTask类是否有帮助?

SO专家们在这里。请帮助我:)


问题答案:

因为您知道如果没有触发任何SensorChanged事件,则没有任何更改,因此您可以使用旧值。正如您要求以特定间隔获取LOG数据一样,我不会在onSensorChanged方法中执行任何输出,只是将新数据克隆到您的accelerometerdata变量中。然后每40毫秒记录一次加速度计数据的值。这样,即使数据没有更改,您也会每40毫秒记录一次实际值。

注意:根据Ridcullys
Answer,似乎还可以在特定时间间隔内“传送”传感器数据。但是由于与Android上的传感器数据一样,这些“交付”总是会延迟,因此使用我的解决方案,您的间隔将更精确地为40ms。另一方面,如果传感器数据在您记录的那一刻发生更改,则可能会发生新数据延迟一个时间间隔的情况。而且我猜(不确定这一点)-因为它仅用于记录日志,而不是“实时地尽可能快地获取”之类的东西,因此这不是必需的-
Timer-Solution导致较少的CPU负载。



 类似资料:
  • 我正在开发一个应用程序,该应用程序应该每隔X秒从网络下载一个文件,以检查是否有任何更改。我使用一个服务来完成这项工作,但它的执行并不随延迟时间率而固定,这是我的服务代码: 输出不是固定的,它应该每10秒运行一次,同时以随机方式运行服务

  • 运动传感器包含一个 3轴陀螺仪 以及一个 3轴加速度计 ,具备能够检测物体的运动姿态,加速度,以及震动强度。 坐标轴及角度方向定义 坐标轴 角度英文名 角度中文名 角度范围 X Pitch 俯仰角 -180~180° Y Roll 翻滚角 -90~90° Z Yaw 偏航角 -180~180° 原理介绍 如果你在互联网上直接搜索陀螺仪,你将很可能得到如下图片: 这是一种基于角动量守恒的理论,用来感

  • 运动传感器包含一个 3轴陀螺仪 以及一个 3轴加速度计 ,具备能够检测物体的运动姿态,加速度,以及震动强度。 坐标轴及角度方向定义 坐标轴 角度英文名 角度中文名 角度范围 X Pitch 俯仰角 -180~180° Y Roll 翻滚角 -90~90° Z Yaw 偏航角 -180~180° 原理介绍 如果你在互联网上直接搜索陀螺仪,你将很可能得到如下图片: 这是一种基于角动量守恒的理论,用来感

  • 是否可以在Android Wear中记录来自心率传感器的原始光线数据?我知道以bpm记录计算的心率是可能的,但我想记录原始的光数据。 我正在使用的设备是Polar M600。 这个问题以前已经问过了,但我现在再问一遍,以防此后有任何新的设备或API使访问这些数据成为可能:

  • 光环板可以连接 mbuild 的 热运动传感器 模块进行编程。 1. 热运动传感器(1)检测到热运动? 如果指定热运动传感器检测到热运动,报告条件成立。 示例 按下光环板的按钮,如果热运动传感器1检测到热运动,光环板的LED灯环会显示红色。 2. 热运动传感器(1)检测到热运动的次数 报告指定热运动传感器检测到热运动的次数。 示例 按下光环板的按钮,如果热运动传感器1检测到热运动的次数大于16次,

  • 热运动传感器能够检测环境中是否有人或恒温动物经过。 原理介绍 热运动传感器使用了人体热释电红外传感器作为核心元器件。人体正常温度为37℃,对应10μm波长的红外光,热运动传感器正是通过检测环境中10μm波长红外光的变化,进而判断环境中是否有人体或附近温度热源的运动的。 为了尽可能敏锐地感知环境中的10μm红外光变化,热运动传感器使用了菲涅尔滤光片对红外光做了汇聚,使得传感器能够尽可能多地接受环境中