gpt4 book ai didi

android - MATLAB 在从加速度到速度到位置进行积分时,我得到了非常高的 y 值

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:08 29 4
gpt4 key购买 nike

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

用于获取数据的安卓手机被放置在平坦的表面上 3 秒以减少漂移。我将休息期间的加速度平均值归零。结果很好,但是当我们对速度和位置进行积分(使用 cumtrapz)时,我们得到了不切实际的高 y 值(速度为米/秒,位置为米。)

原始数据以一定的节奏挥动手机。

有人知道为什么这个职位会获得如此高的值(value)吗?下面的图表显示了我所描述的内容以及我的代码。

编辑:即使手机没有旋转,这些值也是不真实的,不能表示手机是如何移动的。在附图中,手机在平面上呈盒子状移动,没有旋转。

 %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方向加速度

Acceleration in X direction

X方向的速度和位置

Velocity and Position in X direction

Acceleration of Box test in X direction

Velocity of Box test in X direction

Position of Box test in X direction

最佳答案

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

为了获得良好的位置估计,您可以尝试结合有关位置的先验信息,但可能必须结合使用加速度计和陀螺仪数据。您可能还需要研究卡尔曼滤波器。

这是解释此问题的 Google Tech Talk: https://youtu.be/C7JQ7Rpwn2k?t=23m33s

关于android - MATLAB 在从加速度到速度到位置进行积分时,我得到了非常高的 y 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604726/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com