我有测试加速度计数据,需要使用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 返回与 DeltaVelocityLoop 完全相同的向量(没有对之前的面积求和,这是目标)。 VelocityLL 只是返回写有向量加速度长度的曲线下的总面积。如果您对如何绕过这个障碍有任何想法,请告诉我。
当你说不能只使用曲线下的累积面积时,我有点困惑你的意思。这就是积分,所以如果您想对加速度数据进行积分以获得速度和位置,这正是您所需要的。如果您的准确性很差,那么也许您需要更高质量的加速度计数据,但这对后期处理没有帮助。 我建议简单地使用 cumsum() 或 cumtrapz() 来集成您的数据。
您需要确定要使用什么方法来推断样本点之间的加速度值。一般来说,三次样条曲线可以很好地代表“现实世界”的加速度,而线性样条曲线是最容易使用的,并且仍然能给出相当好的结果。
请注意,您的结果将根据您的原始读数的好坏以及采样的频率而有所不同。如果您想要高精度的精确瞬时速度/位置,您可能需要使用直接测量这些的传感器。
cumtrapz
。假设向量
t
包含测量时间,向量acc
包含加速度测量值,并且初始位置为pos0
,而初始速度为vel0
,我会写:velocity = vel0 + cumtrapz(t,acc);
positions = pos0 + cumtrapz(velocity);
我只有一些测量点 cumtrapz 可能是就准确性和简单性而言的最佳解决方案之一。
希望这有帮助。
A.