Clone this wiki locally
Introduction & Contents:
To help anyone looking into the data from the motion box/IMU (Inertial Measurement Unit) it's probably really cool to give a brief explanation on the sensors in there.
The motion box contains a I2C bus that connects the arduino to three different sensors:
- Gyroscope - ITG3200 - http://en.wikipedia.org/wiki/Gyroscope, http://invensense.com/mems/gyro/documents/PS-ITG-3200-00-01.4.pdf
- Accelerometer - ADXL345 / (ADXL335 - previous to the US Open) - http://en.wikipedia.org/wiki/Accelerometer, http://www.analog.com/static/imported-files/data_sheets/ADXL345.pdf
- Compass - HMC5843 - http://en.wikipedia.org/wiki/Compass, http://www.sparkfun.com/datasheets/Sensors/Magneto/HMC5843.pdf
All the values are captured digitally through the I2C bus from this sensors (except for pre-US OPEN data when the ADXL335 was used; in those cases the reading was made using arduino's ADC).
In our implementation, we used this "sensor stick" that encapsulates all three sensors described above.
The orientation of this sensors on the board vary a little bit depending on how the motion box is mounted on the board; that sometimes changes depending on the rider's stance.
Better than a thousand words: Note that sometimes the X & Y Axis may be rotated due to the aforementioned variations on the position the box is mounted on the board; otoh Z stays always the same.
How to get absolute/real measurement from the gyroscope values? From the Gyro's datasheed, the sensors sensitivity is 14.375 LSBs (least significant bit) per °/sec and a full-scale range of ±2000°/sec. This means that every 14.375 units on the xml reading mean 1°/sec. So:
gives [(-94/14.375), (-96/14.375), (83/14.375)] °/sec . Multiplying this for the time-span in between successive readings gives you the approximate total spin.
But hey, let's get a good example of this! Let's take for example, Peetu Piiroinen's ride on the US Open Slopestyle course. From the video, we'll take a deeper look at the fourth air - a huge FS 360 on the first kicker with a bit of car window opening up in the sky.
Let's look that one closer. To locate that data inside the xml file, you can use the
AirTime.xml report to see that his fourth air started at:
<air air_time="1.765" tstamp="1299861787.534" />
Starting from that point in time (1299861787.534) on the raw xml you can see that the gyro's Z value goes high (+) which suggests a clockwise rotation (the same we see on the video). Taking the gyro readings from when he was in the air you'll get you:
<gyro>-679,-978,3551</gyro> <gyro>-136,-363,2505</gyro> <gyro>-217,-553,3105</gyro> <gyro>116,-1177,2910</gyro> <gyro>579,-1151,2623</gyro> <gyro>672,-785,1686</gyro> <gyro>473,-555,508</gyro> <gyro>-84,-247,476</gyro><! do you find it weird that now the Z axis is so low? Check the video! See what happens mid-flight! --> <gyro>-724,-792,728</gyro> <gyro>-1172,-1316,1139</gyro> <gyro>-1207,-1692,1570</gyro> <gyro>24,-1544,1502</gyro> <gyro>874,-798,2120</gyro> <gyro>1212,-1081,2234</gyro> <gyro>1605,-1239,2268</gyro> <gyro>450,-1041,2109</gyro> <gyro>130,237,2178</gyro> <gyro>-407,129,2657</gyro> <gyro>-911,-510,3131</gyro> <gyro>-1191,-1509,2831</gyro> <gyro>-1576,-2952,2506</gyro> <gyro>-1142,-3401,1986</gyro> <gyro>-1,-1274,1864</gyro> <acc>207,68,-427</acc> <!-- Adding the acc reading here to denote the touchdown -->
Basically if you take all those readings, divide by 14.375 and multiply by the (variable) timespan in between them, you have an estimate of the board's absolute rotation. I'll leave that for you but for the sceptic ones, check this:
((2900/14.375)°/sec)*1.765(sec) = 356°
Beautiful isn't it? The other airs is even better. That whole analysis is valid for all the airs/jumps. Examples:
- At the fifth air (a tail grab right after the rail) the gyro's Z swings negative and then positive
- Sixth air (second kicker), again a FS 360 (way smoother); Z goes positive and stays up/big during pretty much the whole jump
- Seventh air (third kicker), a BS 360; Z goes negative.