我正在从加速度计获取原始加速度数据,并尝试对其进行双重积分以获得位置。
将用于获取数据的 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 处传播。
为了获得良好的位置估计,您可以尝试合并有关位置的先验信息,但可能必须结合使用加速度计和陀螺仪数据。您可能还需要研究卡尔曼滤波器。
这是解释此问题的 Google 技术讲座: https://youtu.be/C7JQ7Rpwn2k?t=23m33s