Android MATLAB当从加速度到速度再到位置积分时,我得到了非常高的y值

Android MATLAB当从加速度到速度再到位置积分时,我得到了非常高的y值,android,matlab,integration,accelerometer,Android,Matlab,Integration,Accelerometer,我从一个加速计上获取原始加速度数据,并试图对其进行双重积分以获得位置 用于获取数据的android手机被设置在平坦的表面上3秒钟,以减小漂移。我取静止期内加速度的平均值,从一开始就归零。这很好,但当我们积分到速度和位置(使用cumtrapz)时,我们得到了不切实际的高y值(速度为米/秒,位置为米/秒) 原始数据以一定的速度在手机上晃动 有人知道为什么这个职位会有这么高的价值吗? 下面的图表显示了我所描述的内容以及我的代码 编辑:即使手机未旋转,这些值也不现实,不能指示手机的移动方式。在所附的图片

我从一个加速计上获取原始加速度数据,并试图对其进行双重积分以获得位置

用于获取数据的android手机被设置在平坦的表面上3秒钟,以减小漂移。我取静止期内加速度的平均值,从一开始就归零。这很好,但当我们积分到速度和位置(使用cumtrapz)时,我们得到了不切实际的高y值(速度为米/秒,位置为米/秒)

原始数据以一定的速度在手机上晃动

有人知道为什么这个职位会有这么高的价值吗? 下面的图表显示了我所描述的内容以及我的代码

编辑:即使手机未旋转,这些值也不现实,不能指示手机的移动方式。在所附的图片中,手机在平面上以盒子的形状移动,不涉及旋转

 %VarName2 = accelerometer values in X direction
    %VarName3 = accelerometer values in Y direction
    %VarName4 = accelerometer values in Z direction
    %elapsedArray = time values for each sample of accelerometer data

    ddx = VarName2 - mean(VarName2(1:limit));
    ddx = ddx(1:length(ddx)-200);
    elapsedArray = elapsedArray(1:length(elapsedArray)-200);
    ddy = VarName3 - mean(VarName3(1:limit));
    ddy = ddy(1:length(ddy)-200);
    ddz = VarName4 - mean(VarName4(1:limit));
    ddz = ddz(1:length(ddz)-200);

    velX = cumtrapz(ddx .* elapsedArray);
    velY = cumtrapz(ddy .* elapsedArray);
    velZ = cumtrapz(ddz .* elapsedArray);

    dx = velX - mean(velX(1:limit));
    dy = velY - mean(velY(1:limit));
    dz = velZ - mean(velZ(1:limit));

    posX = cumtrapz(dx .* elapsedArray);
    posY = cumtrapz(dy .* elapsedArray);
    posZ = cumtrapz(dz .* elapsedArray);

    x = posX - mean(posX(1:limit));
    y = posY - mean(posY(1:limit));
    z = posZ - mean(posZ(1:limit));

    figure;
    plot(ddx);
    title('Acceleration in X')
    xlabel('Time (sec)')
    ylabel('Acc (meters squared');

    figure;
    plot(dx);
    title('Velocity in X')
    xlabel('Time (sec)')
    ylabel('Velocity (meters)');

    figure;
    plot(x);
    title('Position X')
    xlabel('Time (sec)')
    ylabel('Position (meters)');

    figure;
    plot(y);
    title('Position Y')
    xlabel('Time (sec)')
    ylabel('Position (meters)');

    figure;
    plot(z);
    title('Position Z')
    xlabel('Time (sec)')
    ylabel('Position (meters)');
X方向的加速度

X方向的速度和位置


你所看到的是时间漂移的结果。让我们假设您正在测量的加速计读数在每个时间点都有一个非常小的误差dErr。积分这些值以获得速度后,每个时间点的误差将乘以系数t。第二次积分以获得位置将导致原始误差乘以系数t^2。因此,每个时间点的误差将在dErr(t)*t^2处传播

为了得到一个很好的位置估计值,你可以尝试合并关于位置的先验信息,但很可能必须使用加速计和陀螺仪数据的组合。您可能还需要研究卡尔曼滤波器

下面是一个谷歌技术讲座,解释这个问题:

您确定初始绘图实际上是加速度吗?加速计的采样周期是多少?我假设您的x轴在这里是错误的(即,您没有连续13分钟摇晃手机)。如果你是,你摇晃手机的频率是多少?(您可能在时间上采样不足)是的,初始绘图是加速度,因为它直接从加速计采样。采样周期大约每100秒采样一次,x轴是时间数组的索引,因此它们也对应每100分之一秒。x轴的标签上仍然写着上一次测试的秒数-道歉。你确定你在摇晃手机时没有旋转手机吗?加速计是沿着固定轴测量的,如果您旋转手机,在采样窗口期间(相对于地球固定框架),此坐标框架中的x轴不是恒定的。在速度测试中有一些旋转,但它会解释奇怪的速度和位置值吗?我们在测试手机时也得到了奇怪的结果,只需将手机沿平面移动,不旋转。根据你的加速度图,速度和位置直觉上对我来说似乎是正确的。只要看看加速度,曲线和x轴之间的大部分区域都在x轴上方。如果你真的前后摇晃手机,你会期望在x轴周围对称分布,这样你的平均加速度/速度/位置为零。因此,你的加速度数据不好,可能是因为采样不足(根据你的解释,这听起来不太可能),或者只是一个质量差的加速计。虽然这是一个真实的现象,但这并不是OP结果的解释。正如您所看到的,桌面实验的结果看起来非常好,并且没有漂移问题。累积漂移误差所需的时间比OP实验的时间要长得多。我已经研究过这样一个问题,我试图在android手表上使用加速度计值来估计位置。传感器不够精确,无法很好地估计位置,漂移误差确实会在短时间内累积。这是关于这个主题的另一篇文章:有趣……这篇文章中的一个好观点也是由@mikkola提出的,关于加速度的重力分量。