1

我有测试加速度计数据,需要使用 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

这是我的第 10 次尝试,所以它包括重复。VelocityL 返回与 DeltaVelocityLoop 完全相同的向量(没有对前面的区域求和,这是目标)。VelocityLL 简单地返回写成矢量加速度长度的曲线下的总面积。如果您对如何绕过这个障碍有任何想法,请告诉我。

4

3 回答 3

4

当你说你不能只使用曲线下的累积面积时,我有点困惑你的意思。那就是积分,所以如果你想整合加速度数据来获得速度和位置,这正是你所需要的。如果您的准确性很差,那么您可能需要更高质量的加速度计数据,但这在后处理中无济于事。

我建议简单地使用 cumsum() 或 cumtrapz() 来整合您的数据。

于 2011-02-16T06:11:23.177 回答
1

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

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

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

于 2011-02-16T06:13:14.910 回答
1

如果您需要快速和矢量化的东西,请使用cumtrapz. 假设该向量t包含测量时间,该向量acc包含加速度测量值,并且初始位置为pos0,而初始速度为vel0,我会写:

velocity = vel0 + cumtrapz(t,acc);
positions = pos0 + cumtrapz(velocity);

我只有一些测量点,就准确性和简单性而言,cumtrapz 可能是最佳解决方案之一。

希望这可以帮助。

一个。

于 2011-02-17T21:41:58.317 回答