2013-08-14 6 views
2

듣기 동안 가속도계 x, y, z 값의 잡음을 줄이는 방법에 대한 답을 보았습니다. 그러나 문제는 약간 다릅니다.기록 된 가속도계/자이로 스코프 데이터에서 잡음 제거

녹음 된 데이터가 이미 있습니다 (CSV 파일에 있음). 가능하다면 나중에 노이즈를 제거/줄이고 싶습니다. 자이로 이러한 방식으로 계산 된 자이로 스코프로부터

델타 0-3

X, Y, Z : 여기

는 기록 된 데이터이다

axisX = 0; 
axisY = 0; 
axisZ = 0; 
// This timestep's delta rotation to be multiplied by the 
// current rotation 
// after computing it from the gyro sample data. 
if (timestamp != 0) { 
     final float dT = (event.timestamp - timestamp) * NS2S; 
     // Axis of the rotation sample, not normalized yet. 
     axisX = event.values[0]; 
     axisY = event.values[1]; 
     axisZ = event.values[2]; 

     // Calculate the angular speed of the sample 
     float omegaMagnitude = FloatMath.sqrt(axisX * axisX + axisY 
       * axisY + axisZ * axisZ); 

     // Normalize the rotation vector if it's big enough to get 
     // the axis (that is, EPSILON should represent your maximum 
     // allowable margin of error) 
     if (omegaMagnitude > 0.000000001f) { 
      axisX /= omegaMagnitude; 
      axisY /= omegaMagnitude; 
      axisZ /= omegaMagnitude; 
     } 

     // Integrate around this axis with the angular speed by the 
     // timestep in order to get a delta rotation from this 
     // sample over the timestep We will convert this axis-angle 
     // representation of the delta rotation into a quaternion 
     // before turning it into the rotation matrix. 
     float thetaOverTwo = omegaMagnitude * dT/2.0f; 
     float sinThetaOverTwo = FloatMath.sin(thetaOverTwo); 
     float cosThetaOverTwo = FloatMath.cos(thetaOverTwo); 
     deltaRotationVector[0] = sinThetaOverTwo * axisX; 
     deltaRotationVector[1] = sinThetaOverTwo * axisY; 
     deltaRotationVector[2] = sinThetaOverTwo * axisZ; 
     deltaRotationVector[3] = cosThetaOverTwo; 

} 
timestamp = event.timestamp; 
float[] deltaRotationMatrix = new float[9]; 
SensorManager.getRotationMatrixFromVector(deltaRotationMatrix,deltaRotationVector); 

피치/롤/방위각/경사각은 다음과 같이 계산됩니다.

// Calculation of the orientation through the 
// magnetic-field and accelerometer sensors. 
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
    mGravity = event.values; 
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
    mGeomagnetic = event.values; 
if (mGravity != null && mGeomagnetic != null) { 
    float R[] = new float[9]; 
    float I[] = new float[9]; 

    boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
    if (success) { 
     float orientation[] = new float[3]; 
     SensorManager.getOrientation(R, orientation); 
     // get the current orientation 
     // orientation consist of: azimut, pitch and roll in radians 
     azimut = orientation[0] * (180/(float) java.lang.Math.PI); 
     pitch = orientation[1] * (180/(float) java.lang.Math.PI); 
     roll = orientation[2] * (180/(float) java.lang.Math.PI); 
     inclination = SensorManager.getInclination(I) * (180/(float) java.lang.Math.PI); 
    } 
} 

acc에서 X/Y/Z elerometer는 파일에 기록되지 않았습니다.

내 질문은 : 이 데이터에서 노이즈를 제거 할 수 있습니까?

미리 감사드립니다.

답변

1

너무 늦었는지 모르겠지만 여전히 필요한 경우를 대비하여 작성하십시오.

일부 필터를 구현할 수 있습니다. 로우 패스 필터가 일반적입니다. 그렇지 않으면 Complementary Filter를 시도하십시오.

개인적으로 필자는 개인적으로 Kalman Filter를 선호했지만 조금 비쌉니다.

0

가속도계가 기록되어 있지 않으므로 올바르게 사용하는 경우 방향이 사용됩니다. 오일러 각을 쿼터니언 표현으로 변환하고 평균을 사용하여 데이터를 평활화하는 것이 좋을 것입니다. 이는 일반적인 평균이 아닙니다 (아래 참조). https://stackoverflow.com/a/29315869/6589074

모든 최고의, 레프

: 이이 MATLAB 코드 예제를 사용하여 평균하여 윈도우 필터 롤링 구현할 수 있습니다