Hello,
I'm developping an android application for detecting falls.
I will use accelerometer's values for find the g constant.
But i recover bad values.
this is my code for decoding values:
private double ConvertShortQxxToDouble(int bitsRightPoint,short value) { value= shortToLittleEndian(value); if (value<0) value=Short.reverseBytes(value); return value/Math.pow(2,bitsRightPoint); } private static Short shortToLittleEndian(short n) { ByteBuffer bb = ByteBuffer.allocate(2); bb.order(ByteOrder.LITTLE_ENDIAN); bb.putShort( n); byte[] b =bb.array(); return (short)((b[0]<<8)|(b[1]&0xFF)) ; } -------------------------------------------------------- [...] byte[] value= characteristic.getValue(); if(currentUUID.equals(Constants.CHARACTERISTIC_ACCELEROMETER_GYROSCOPE_VECTOR_STATION)) { /*** * Accelerometer */ short tmp= (short)((value[0] << 8) | (value[1] & 0xFF)); double acX= ConvertShortQxxToDouble(10,tmp); tmp= (short)((value[2] << 8) | (value[3] & 0xFF)); double acY= ConvertShortQxxToDouble(10,tmp); tmp= (short)((value[4] << 8) | (value[5] & 0xFF)); double acZ= ConvertShortQxxToDouble(10,tmp); //find variance if(ct_accelerometer+1<=Constants.SAMPLE_ACCELEROMETER) { accelerometerSquared+= Math.pow(acX,2)+Math.pow(acY,2)+Math.pow(acZ,2); mu+=Math.sqrt( Math.pow(acX,2)+Math.pow(acY,2)+Math.pow(acZ,2)); ct_accelerometer++; } else if (variance==0) { mu/=Constants.SAMPLE_ACCELEROMETER; variance= (accelerometerSquared/Constants.SAMPLE_ACCELEROMETER) - Math.pow(mu,2); calibration=(9.81/mu); } } [...]
--------------------------------------------------------------------------------------------------------
Functions used:
n= sample rate
mu=Σ ( (x^2 + y^2 + z^2)^(1/2) ) /n
accSqared= Σ (x^2 + y^2 + z^2)
variance= (accSquared / n) - mu^2
calibration = g/mu
---------------------------------------------------------------------------------------------------------------
the result is : average: 7.07990718008141, variance : 4.173282193669863, error +- 2.042861276168762, callibration : 1.3856113859231693
exemples values:
res=(x^2 + y^2 +z^2)^(1/2) acX -5.7509765625 acY -2.5009765625 acZ 0.994140625 res :6.349561462878678 acX -6.2509765625 acY -3.0009765625 acZ 0.9951171875 res :7.005057211076619 acX -5.5009765625 acY -0.2509765625 acZ 0.9892578125 res :5.594851507921449 acX -8.2509765625 acY -3.5009765625 acZ 0.9951171875 res :9.018076809550722 acX -7.0009765625 acY -2.0009765625 acZ 1.0009765625 res :7.3497982360758005 acX -10.2509765625 acY -4.0009765625 acZ 0.986328125 res :11.048220540375027 acX -8.2509765625 acY -5.5009765625 acZ 0.978515625 res :9.964780489527493 acX -4.5009765625 acY -2.5009765625 acZ 0.99609375 res :5.244604517133555 acX -7.2509765625 acY -0.2509765625 acZ 0.9814453125 res :7.321399131742297 acX -7.7509765625 acY -2.5009765625 acZ 0.9814453125 res :8.203399072337445 acX -8.5009765625 acY -3.5009765625 acZ 1.00390625 res :9.24831158461574 acX -8.5009765625 acY -5.0009765625 acZ 0.9892578125 res :9.91236601999951
How can i calibrate my device to get expected values from my device or what should i change to make it work.
Thank you for your time