2011-02-16 4 views
1

필자는 테스트 가속도계 데이터를 가지고 있으며 속도와 위치를 찾기 위해 Matlab을 사용해야합니다. 속도와 위치 모두에 대한 실제 데이터 포인트가 필요합니다. 그러나 곡선 아래의 누적 영역이 아닙니다. 필자는 샘플 코드를 사용하여 매우 길고 구체적인 벡터화 코딩을 통해이를 수행 할 수 있었지만 좀 더 일반적인 방법을 찾아야합니다. 나는 이산적인 데이터를 가지고 있으며 어떤 오류도 가질 여유가 없기 때문에 단지 곡선 적합성을 사용하고 면적을 추정 할 수 없다. 근본적으로 각 사각형의 면적을 계산하는이 방법이 가장 정확한 방법입니다. 지금까지 아래에있는 내 시도가 있습니다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은 단순히 벡터 가속의 길이로 작성된 곡선 아래의 총 면적을 반환합니다. 이 장애물을 피할 수있는 방법에 대한 아이디어가 있으면 알려 주시기 바랍니다.

+3

실제 데이터 포인트가 필요하면 가속만으로는 충분하지 않습니다. 예를 들어 초기 위치와 초기 속도와 같은 2 개의 상수가 필요할 것입니다. 게다가 그러한 체계에서는 누적 된 오류가 있으므로 장기간에 걸쳐 통합하는 경우 신뢰할 수없는 결과가 발생할 수 있음을 명심하십시오. –

답변

4

커브 아래 누적 영역을 사용할 수 없다는 말은 약간 혼란 스럽습니다. 그 입니다. 따라서 가속도 데이터를 통합하여 속도와 위치를 얻으려면 정확히 필요한 것입니다. 정확도가 떨어지면 고품질 가속도계 데이터가 필요하지만 후 처리에는 도움이되지 않습니다.

단순히 데이터를 통합하기 위해 cumsum() 또는 cumtrapz()를 사용하는 것이 좋습니다.

1

스플라인을 사용하여 이산화 된 가속 데이터를 정확하게 나타낼 수 있습니다. 그런 다음 속도를 얻기 위해 영역을 통합 한 다음 다시 위치를 얻으십시오.

샘플 포인트 간의 가속도 값을 추정하는 데 사용할 방법을 결정해야합니다. 일반적으로 3 차 스플라인은 "실제"가속도를 나타내는 매우 훌륭한 작업이지만 선형 스플라인은 가장 쉽게 작업 할 수 있으며 여전히 우수한 결과를 제공합니다.

귀하의 결과는 원래의 판독 값의 정도와 샘플링 빈도에 따라 달라질 수 있습니다. 고정밀 도로 정확한 순간 속도/위치를 원한다면 직접 측정하는 센서를 사용하는 것이 좋습니다.

1

신속하고 벡터화 된 것이 필요한 경우 cumtrapz을 사용하십시오. 측정 배 벡터 t을 포함 가정하면, 그 벡터 acc 가속도 측정을 포함하고 있으며 초기 위치는 초기 속도가 vel0 동안, 내가 써서 pos0입니다 :

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

난 당신이 일부 측정 지점의 cumtrapz이 정확성과 단순성과 관련하여 최상의 솔루션 중 하나 일 수 있습니다.

희망이 도움이됩니다.

대답

관련 문제