使用线性加速度android计算距离

时间:2012-10-17 03:01:16

标签: android accelerometer android-sensors

  

可能重复:
  Android accelerometer accuracy (Inertial navigation)

我使用以下代码计算距离。 tnewanew arraylists分别包含时间戳加速

 double distance=0;
 double init_vel=0;
long time_prev=tnew.next();
   while(anew.hasNext())
   {
    float temp_acc=anew.next();
    long temp_time=tnew.next();

    interval=(temp_time-time_prev)/1000f;   //milliseconds to seconds
    double fin_vel=init_vel+(temp_acc*interval);
    distance+=(init_vel*interval)+0.5f*temp_acc*interval*interval;

    init_vel=fin_vel;
    time_prev=temp_time;
   }


代码中是否有任何逻辑错误?因为我得到的值远小于实际长度。

输出LogCat

--------- beginning of /dev/log/system

--------- beginning of /dev/log/main

V/PhonetapeActivity( 8842): Sensor Listener Registered

V/PhonetapeActivity( 8842): Sensor Unregistered

V/PhonetapeActivity( 8842): No. of Iterations : 49

V/PhonetapeActivity( 8842): Value of acceleration : 3.5762787E-7

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665585965

V/PhonetapeActivity( 8842): Value of acceleration : -0.15275347

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586017

V/PhonetapeActivity( 8842): Value of acceleration : 0.15585232

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586077

V/PhonetapeActivity( 8842): Value of acceleration : 1.075269

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586138

V/PhonetapeActivity( 8842): Value of acceleration : 3.6529458

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586199

V/PhonetapeActivity( 8842): Value of acceleration : 9.645137

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586257

V/PhonetapeActivity( 8842): Value of acceleration : 17.022213

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586316

V/PhonetapeActivity( 8842): Value of acceleration : 9.721476

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586376

V/PhonetapeActivity( 8842): Value of acceleration : -18.729362

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586437

V/PhonetapeActivity( 8842): Value of acceleration : -22.868385

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586497

V/PhonetapeActivity( 8842): Value of acceleration : -16.777517

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586557

V/PhonetapeActivity( 8842): Value of acceleration : -7.0492268

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586617

V/PhonetapeActivity( 8842): Value of acceleration : -3.860828

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586677

V/PhonetapeActivity( 8842): Value of acceleration : 1.7244682

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586737

V/PhonetapeActivity( 8842): Value of acceleration : 5.0734243

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586797

V/PhonetapeActivity( 8842): Value of acceleration : 6.4193974

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586857

V/PhonetapeActivity( 8842): Value of acceleration : 2.739545

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586917

V/PhonetapeActivity( 8842): Value of acceleration : 5.559997

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586977

V/PhonetapeActivity( 8842): Value of acceleration : 4.2290807

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587037

V/PhonetapeActivity( 8842): Value of acceleration : 5.0012918

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587097

V/PhonetapeActivity( 8842): Value of acceleration : 5.9317436

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587157

V/PhonetapeActivity( 8842): Value of acceleration : 5.20226

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587217

V/PhonetapeActivity( 8842): Value of acceleration : 7.1381693

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587276

V/PhonetapeActivity( 8842): Value of acceleration : 7.6460614

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587337

V/PhonetapeActivity( 8842): Value of acceleration : 5.566694

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587396

V/PhonetapeActivity( 8842): Value of acceleration : 3.355657

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587457

V/PhonetapeActivity( 8842): Value of acceleration : 1.8876343

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587517

V/PhonetapeActivity( 8842): Value of acceleration : -0.8815446

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587577

V/PhonetapeActivity( 8842): Value of acceleration : -0.9595623

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587646

V/PhonetapeActivity( 8842): Value of acceleration : -4.233544

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587697

V/PhonetapeActivity( 8842): Value of acceleration : -1.9580669

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587765

V/PhonetapeActivity( 8842): Value of acceleration : -1.4569702

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587822

V/PhonetapeActivity( 8842): Value of acceleration : -0.6058636

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587876

V/PhonetapeActivity( 8842): Value of acceleration : -0.21207428

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587937

V/PhonetapeActivity( 8842): Value of acceleration : 0.5068469

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587997

V/PhonetapeActivity( 8842): Value of acceleration : 5.614555

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588057

V/PhonetapeActivity( 8842): Value of acceleration : -4.5297813

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588122

V/PhonetapeActivity( 8842): Value of acceleration : -0.29250193

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588178

V/PhonetapeActivity( 8842): Value of acceleration : -2.4922757

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588237

V/PhonetapeActivity( 8842): Value of acceleration : -1.7652755

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588297

V/PhonetapeActivity( 8842): Value of acceleration : -2.3279366

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588357

V/PhonetapeActivity( 8842): Value of acceleration : -1.8127642

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588419

V/PhonetapeActivity( 8842): Value of acceleration : -1.956768

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588477

V/PhonetapeActivity( 8842): Value of acceleration : -0.8337221

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588537

V/PhonetapeActivity( 8842): Value of acceleration : -0.24841261

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588601

V/PhonetapeActivity( 8842): Value of acceleration : 0.23997736

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588657

V/PhonetapeActivity( 8842): Value of acceleration : 0.14441395

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588723

V/PhonetapeActivity( 8842): Value of acceleration : 0.23150349

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588777

V/PhonetapeActivity( 8842):  1st while loop ended

V/PhonetapeActivity( 8842): 2nd while loop ended

V/PhonetapeActivity( 8842): Avg value : 0.4006781578063965

V/PhonetapeActivity( 8842): Max Value : 17.022213

V/PhonetapeActivity( 8842): Min Value : -22.868385

V/PhonetapeActivity( 8842): Standard Deviation : -0.0031174493

V/PhonetapeActivity( 8842): 3rd while loop started

V/PhonetapeActivity( 8842): startpos=3 endpos=8

V/PhonetapeActivity( 8842): acceleration=0.1558523178100586 interval=0.061000000685453415

V/PhonetapeActivity( 8842): distance=5.799264876044276E-4

V/PhonetapeActivity( 8842): next init velocity=0.009506991493243078

V/PhonetapeActivity( 8842): acceleration=1.0752689838409424 interval=0.061000000685453415

V/PhonetapeActivity( 8842): distance=0.005160928954000712

V/PhonetapeActivity( 8842): next init velocity=0.07509840024458736

V/PhonetapeActivity( 8842): acceleration=3.6529457569122314 interval=0.057999998331069946

V/PhonetapeActivity( 8842): distance=0.021805144861910285

V/PhonetapeActivity( 8842): next init velocity=0.2869692480489858

V/PhonetapeActivity( 8842): acceleration=9.645136833190918 interval=0.05900000035762787

V/PhonetapeActivity( 8842): distance=0.07231105232279186

V/PhonetapeActivity( 8842): next init velocity=0.8560323246566197

V/PhonetapeActivity( 8842): acceleration=17.022212982177734 interval=0.05999999865889549

V/PhonetapeActivity( 8842): distance=0.18495295465057213

V/PhonetapeActivity( 8842): next init velocity=1.8773650807587172

V/PhonetapeActivity( 8842): 3rd while loop ended

V/PhonetapeActivity( 8842): final distance=0.18495295465057213

V/PhonetapeActivity( 8842): values of acceleration, timestamp, distance, start_time and calibrating reset


如果您观察logcat,首先它会以毫秒为单位迭代49个加速度值及其各自的时间戳。然后是平均值,总和,最大值,最小值等 然后,如果您看到有startpos=3endpos=8。这是迭代次数范围,我用来计算距离。我只使用迭代3到8的加速度和时间戳的值。
这是因为,我从<检测到距离计算的开始强烈的>加速度上升向相反方向的突然变化。您可以看到3-8中的值符合逻辑。从3开始,加速度有相当大的上升,8后突然下降。

3 个答案:

答案 0 :(得分:6)

加速度计非常精确,但在航位推算时表现不佳。陀螺仪很擅长这一点,但它们漂移了#34;随着时间的推移。 &#34;的 Sensor-fusion &#34;是使用加速/陀螺仪数据串联使用另一个来纠正一个人的缺陷的过程。 AFAIR,&#34;传感器融合&#34;未在Galaxy Ace上启用。 LINEAR_ACCELERATION只是ACCELEROMETER - 重力组件。在没有陀螺仪的设备上,根据定义,无法进行融合,需要加速+陀螺仪。

加速度计数据包含9.8的重力分量。通过简单地确定加速度计数据的2个连续样本之间的差异来滤除这一点。这为我们提供了LINEAR_ACCELERATION数据。

查看实际内部代码:
frameworks/base/services/sensorservice/LinearAccelerationSensor.cpp
函数LinearAccelerationSensor::process()在上述文件中很有用。

还需要对应用中获得的加速数据执行过滤/平均以上链接和视频谈论等基本操作。以这种方式获得的处理值将比原始值更好(尽管不如在设备上存在传感器融合时所获得的那样好)。然后可以使用它们更准确地计算速度和位置。

也就是说,每秒16个样本(@ poll-rate = 60ms)本身相对不准确。您可能想尝试使用sensorEventListner注册SENSOR_DELAY_FASTEST,以查看您可以在设备上获得的最大样本数。

另请注意,手机上的加速度计会被钳制到某个MAX灵敏度(通常为 - / + 2/4/8 G范围)。虽然正常步行/跑步可能会在这些范围内运行,但是加速时的突然冲动(例如在自行车上)肯定会被限制在MAX中,并且您将在航位推算中失去同步。这可以通过注意非常接近 - / + MAX的样本数来检查。很多样本在 - / + MAX意味着你肯定会失去与实际位置的同步。

答案 1 :(得分:4)

我要检查的第一件事是你的时间间隔。我不确定它是否被正确转换。时间戳列为:

  

public long timestamp事件发生的纳秒时间

因此在文档中我们看到转换是通过除以10亿而不是1千来完成的。

float dT = (event.timestamp - timestamp) / 1000000000.0f;
timestamp = event.timestamp;

那就是说我认为改变只会缩小价值,但要计算你需要观察单位的实际距离。

接下来,在阅读这些内容时,人们总是会知道如何知道每个读数的初始位置,以便对现实世界线性测量有任何意义。我没有看到你跟踪你以前的加速度,这将使每个跟随测量的积分基于瞬时加速度或加速度的变化而不是完全加速度。

尝试这样的事情:

final int X = 0;
double distance[];
double init_vel[];
double total_Accel[];

void dblIntegrate(SensorEvent event){
    double data[] = new double[3];
    for(int i = 0; i < event.lenght; i++){
        data[i] = (double)event[i];
        total_Accel[i] += data[i];
        vel[i] = init_vel[i] + (total_Accel[i] * dt);
        init_vel[i] = vel[i];

        ....rinse and repeate to get distance
        (not using the accel data of course)
    }
}

我意识到你理解这一点,但是对于其他人来说,这是在读这个=&gt;记住,每次调用dblIntegrate()时都不能重新实例化计数变量total_Accel或init_vel。

如果你做得对,你应该看到total_Accel从零到某个最大值,然后每次移动设备时都返回到零。这意味着每次设备向任何方向移动时,您都会添加相等的正负加速度。

我认为这是最难理解的加速属性,因为当设备从静止状态进入静止状态时,你的total_acceleration将从零到最大pos / neg值回到零到相反的最大值价值,然后回到零。

  

例如,如果我将一个手机放在桌子背面,底部朝向我的胸部向右移动一米,你会得到这样的东西:

  total_Accel = 0.0(0米)

  total_Accel = 0.5

  total_Accel = 1.0

  total_Accel = 1.5(约25米)

  total_Accel = 1.0

  total_Accel = 0.5

  total_Accel = 0.0(如果accel完全分布,。5米)

  total_Accel = -0.5

  total_Accel = -1.0

  total_Accel = -1.5(约.75米)

  total_Accel = -1.0

  total_Accel = -0.5

  total_Accel = 0.0(1米)

在这个例子中,你可以开始明白为什么简单地加倍积分加速度的变化不会给你真正的速度/位移变化。

我希望如此,因为写这篇文章的时间比我想象的要长很多! :)

答案 2 :(得分:2)

这是你问题的答案:

  

为什么我需要跟踪我之前的加速度。当加速度发生变化时,将调用onSensorChanged(MotionEvent事件){}。它提供了新的加速度而不是加速度的变化。

简短的回答是,将包含初始条件(您之前的总加速度)的读数进行积分,您将得到一个不包含所有信息的值。此外,您走的时间越长,您的价值就会越大,因为您正在丢失越来越多的信息。

我认为你不想要加速度,速度和位移的解释(这不是那个地方)所以也许我可以通过扩展上面包含的例子来展示它。

将手背放在桌子底部朝向我的胸部的手机向右移动一段任意距离并停止。如果你查看你的数据,你会得到这样的东西。当然,实际的数字会有很大差异,但它们的符号会相同,而且比例也会相同,但会比你想象的那样开始小于它们的峰值(除非你用枪在墙上或其他地方开枪) :

时间............加速阅读...........总加速........总速度

00ms .............. 0.0 ...................... 0.0 ........... ............ 0.000 ..

10毫秒.............. 0.5 ...................... 0.5 ........... ............ 0.005 m / s ..

20ms .............. 0.5 ...................... 1.0 ........... ............ 0.015 m / s ..

30ms ............. 0.5 ...................... 1.5 ............ ........... 0.030 m / s ..

40ms ............. -0.5 ...................... 1.0 ........... ............ 0.040 m / s ..

50ms ............. -0.5 ...................... 0.5 ........... ............ 0.045 m / s ..

60ms ............. -0.5 ...................... 0.0 ........... ............ 0.045 m / s ..

70ms ............. -0.5 .....................- 0.5 ........... ............ 0.040 m / s ..

80ms ............. -0.5 .....................- 1.0 ........... ............ 0.030 m / s ..

90ms ............. -0.5 .....................- 1.5 ........... ............ 0.015 m / s ..

100ms ............. 0.5 ......................... 1.0 ............ ........... 0.005 m / s ..

110毫秒............. 0.5 .....................- 0.5 ............ ........... 0.000 m / s ..

120ms ............. 0.5 ...................... 0.0 ............ ........... 0.000 m / s ..

您可以看到,如果您不跟踪总加速度,则总速度将是上面标记为总加速的列。这意味着你的手机将在整个时间沿x轴的正方向移动,但你的速度将是负的(向后移动)运动的后半部分。

我希望这证明了我的情况,即使它没有解释加速度或加速度计背后的机制。

如果您想查看加速度计的工作原理,他们就是MEMS型传感器,我认为他们使用带有加重端的悬挂式悬臂梁来测量加速度。