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

Ash*_*win 8 android accelerometer android-sensors

可能重复:
Android加速计精度(惯性导航)

我使用以下代码来计算距离.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;
   }
Run Code Online (Sandbox Code Playgroud)


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

产量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
Run Code Online (Sandbox Code Playgroud)


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

The*_*ist 6

加速度计非常精确,但在航位推算时表现不佳.陀螺仪很擅长但随着时间的推移它们会"漂移"." 传感器融合 "是使用加速/陀螺仪数据串联使用另一个来纠正一个人的不足的过程.AFAIR,"传感器融合"未在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处的大量样本意味着你肯定会失去与实际位置的同步.


小智 4

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

public long timestamp 事件发生的时间(以纳秒为单位)

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

float dT = (event.timestamp - timestamp) / 1000000000.0f;
timestamp = event.timestamp;
Run Code Online (Sandbox Code Playgroud)

也就是说,我认为这种变化只会缩小数值,但要计算现实世界的距离,你需要观察你的单位。

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

尝试这样的事情:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道您理解这一点,但对于正在阅读此内容的其他人来说=>请记住,您不能在每次调用 dblIntegrate() 时重新实例化计数变量total_Accel 或init_vel。

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

我相信这是最难正确理解的加速度属性,因为对于设备从静止状态进入静止状态,您的总加速度将从零到最大正/负值回到零到相反的最大值,然后回到零。

例如,如果我将手机背面朝下放在桌子上,底部面向我的胸部,向右移动一米,您将得到如下结果:

总加速度 = 0.0(0 米)

总加速度 = 0.5

总加速度 = 1.0

总加速度 = 1.5(约 0.25 米)

总加速度 = 1.0

总加速度 = 0.5

Total_Accel = 0.0(如果加速度完美分布,则为 0.5 米)

总加速度 = -0.5

总加速度 = -1.0

总加速度 = -1.5(约 0.75 米)

总加速度 = -1.0

总加速度 = -0.5

总加速度 = 0.0(1 米)

在这个例子中,您可以开始明白为什么简单地对加速度的变化进行双重积分不会给您带来速度/位移的真正变化。

无论如何,我希望如此,因为写这篇文章比我想象的要长得多!:)

  • 嘿伙计们,在这里插话..但是有人可以解释一下他说的“在没有加速度计数据的情况下冲洗并重复”的最后部分吗? (2认同)