Trat0rn
Trat0rn

Reputation: 53

Removing Noise from recorded accelerometer/gyroscope data

I have seen some answers to how reduce the noise of for example the accelerometer x,y,z values while listening, but my problem is a bit different.

I have some recorded data already (in csv-files) and I would like to remove/reduce the noise afterwards, if that's possible.

Here is the data that was recorded:

X,Y,Z from gyroscope

Delta 0-3 from gyroscope, which was calculated in this way:

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);

Pitch/Roll/Azimuth/Inclination, which was calculated in this way:

// 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);
    }
}

The X/Y/Z from accelerometer wasn't written in the files.

So my question is: Can I remove the noise from this data?

Thanks in advance.

Upvotes: 2

Views: 1914

Answers (2)

Lev Lavy
Lev Lavy

Reputation: 116

Since you don't have the accelerometer recorded, and if I understand correctly what you use is the orientation. I would recommend converting the euler angles to quaternions representation and using averaging to smooth the data, this is not regular averaging, see below. You can implement rolling window filter by averaging using this this matlab code example: https://stackoverflow.com/a/29315869/6589074

All the best, Lev

Upvotes: 0

Souris
Souris

Reputation: 326

I do not know if it is too late for you, just write in case you still need it.

You can implement some kind of filter with it. Low pass filter is typical. Otherwise, try Complementary Filter.

Me personally I preferred Kalman Filter, although it is a bit computationally expensive.

Upvotes: 1

Related Questions