利用Matlab将加速度计数据集成到速度和位置中

利用Matlab将加速度计数据集成到速度和位置中,matlab,loops,integration,vectorization,Matlab,Loops,Integration,Vectorization,我有测试加速度计的数据,需要使用Matlab来找到速度和位置。我需要速度和位置的实际数据点,而不仅仅是曲线下的累积面积。我有我正在使用的样本数据,并且已经能够通过相当长和特定的矢量化编码来实现这一点,但是我需要找到一种更通用的方法。我不能只使用曲线拟合然后估计面积,因为我有离散数据,不能承受任何误差。这种基本上计算每个矩形面积的方法是最精确的方法。到目前为止,我的尝试如下: %Variables clear DeltaTime=0.2; %10 Hz sampling rate Acce

我有测试加速度计的数据,需要使用Matlab来找到速度和位置。我需要速度和位置的实际数据点,而不仅仅是曲线下的累积面积。我有我正在使用的样本数据,并且已经能够通过相当长和特定的矢量化编码来实现这一点,但是我需要找到一种更通用的方法。我不能只使用曲线拟合然后估计面积,因为我有离散数据,不能承受任何误差。这种基本上计算每个矩形面积的方法是最精确的方法。到目前为止,我的尝试如下:

%Variables

clear

DeltaTime=0.2; %10 Hz sampling rate 

Acceleration=[0, 1, 2, 4, 3, 1, 2]; %Sample random data set

TTime=(0.2:DeltaTime:1.4); 

VelocityL=zeros(size(Acceleration));

VelocityLL=zeros(size(Acceleration));

%Velocity

DeltaVelocityVect=Acceleration*DeltaTime;

VelocityV=[sum(DeltaVelocityVect(1)),sum(DeltaVelocityVect(1:2)),...
    sum(DeltaVelocityVect(1:3)), sum(DeltaVelocityVect(1:4)), sum(DeltaVelocityVect(1:5))...
    sum(DeltaVelocityVect(1:6)), sum(DeltaVelocityVect(1:7))];

%Position

DeltaPositionVect=VelocityV*DeltaTime;

PositionV=[sum(DeltaPositionVect(1)),sum(DeltaPositionVect(1:2)),...
    sum(DeltaPositionVect(1:3)), sum(DeltaPositionVect(1:4)), sum(DeltaPositionVect(1:5))...
    sum(DeltaPositionVect(1:6)), sum(DeltaPositionVect(1:7))];
我已经手工解决了这一切,并将其绘制在纸上和Matlab上,以及上面的工作。不过,数据集的长度会有所不同,因此从长远来看,它不会起作用。我曾尝试使用循环来解决这个问题,因为在保持采样率的同时,索引可以很容易地改变,以适合任何长度的向量,但我无法让它输出实际的数据点。我需要上面的一般形式

for index=1:length(Acceleration); 
  DeltaVelocityLoop(index)= DeltaTime*Acceleration(index);
end

for index2=1:7
  VelocityL(index2)= sum(DeltaVelocityLoop(index2));
  VelocityLL=VelocityLL+DeltaVelocityLoop(index2);
end

这是我第十次尝试,所以它包括重复。VelocityL返回与DeltaVelocityLop完全相同的向量,而不求和前面的区域,这就是目标。VelocityLL只返回曲线下的总面积,即矢量加速度的长度。如果你对我如何绕过这个路障有任何想法,请告诉我

当你说不能只使用曲线下的累积面积时,我有点困惑你的意思。这是积分,所以如果你想积分加速度数据得到速度和位置,这正是你需要的。如果精度不高,则可能需要更高质量的加速计数据,但这在后处理中无法得到帮助


我建议只使用cumsum或cumtrapz来整合数据。

当你说不能只使用曲线下的累积面积时,我有点不明白你的意思。这是积分,所以如果你想积分加速度数据得到速度和位置,这正是你需要的。如果精度不高,则可能需要更高质量的加速计数据,但这在后处理中无法得到帮助


我建议只使用cumsum或cumtrapz来整合数据。

您可以使用样条曲线精确表示离散化的加速度数据,然后整合其下的区域以获得速度,然后再次获得位置

您需要确定将使用什么方法来外推采样点之间的加速度值。一般来说,三次样条曲线可以很好地表示真实世界的加速度,而线性样条曲线最容易使用,并且仍然可以给出相当好的结果


请注意,您的结果会因您的原始读数有多好以及采样频率的不同而有所不同。如果您希望获得高精度的精确瞬时速度/位置,您可能需要使用直接测量这些速度/位置的传感器。

您可以使用样条曲线精确表示离散化加速度数据,然后对其下的区域进行积分以获得速度,然后再次获得位置

您需要确定将使用什么方法来外推采样点之间的加速度值。一般来说,三次样条曲线可以很好地表示真实世界的加速度,而线性样条曲线最容易使用,并且仍然可以给出相当好的结果


请注意,您的结果会因您的原始读数有多好以及采样频率的不同而有所不同。如果你想要一个高精度的精确瞬时速度/位置,你可能需要使用一个直接测量这些的传感器。

如果你需要一些快速和矢量化的东西,使用cumtrapz。假设向量t包含测量时间,向量acc包含加速度测量,初始位置为pos0,初始速度为vel0,我会写:

velocity = vel0 + cumtrapz(t,acc);
positions = pos0 + cumtrapz(velocity);
我想你只有一些测量点康特拉普可能是一个最好的解决方案,就准确性和简单性而言

希望这有帮助


A.

如果您需要快速和矢量化的东西,请使用康特拉普。假设向量t包含测量时间,向量acc包含加速度测量,初始位置为pos0,初始速度为vel0,我会写:

velocity = vel0 + cumtrapz(t,acc);
positions = pos0 + cumtrapz(velocity);
我想你只有一些测量点康特拉普可能是一个最好的解决方案,就准确性和简单性而言

希望这有帮助


A.

如果需要实际数据点,仅加速度是不够的,需要两个积分常数,例如初始位置和初始速度。此外,请记住,在这样的方案中,您将有一个累积误差,因此,如果您在很长一段时间内进行积分,y
你可能会得到不可靠的结果。如果你需要实际的数据点,单靠加速度是不够的,你需要两个积分常数,例如初始位置和初始速度。此外,请记住,在这样的方案中,您将有一个累积的错误,因此,如果您在很长一段时间内进行积分,您可能会得到不可靠的结果。