듣기 동안 가속도계 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는 파일에 기록되지 않았습니다.
내 질문은 : 이 데이터에서 노이즈를 제거 할 수 있습니까?
미리 감사드립니다.