Some observations on vertical displacement:
The idea of the time series displacement graph is that you can double integrate acceleration to get displacement but also periodically reset the integration to prevent massive integral drift.
At the moment, the python script I have can take a csv file with x,y,x linear acceleration which is output from the BNO555 IMU. The script then looks at only the z-axis acceleration and finds the minima of the data. It then splits the z-axis acceleration data into chunks using each of the minima as break points. It then double integrates each of these chunks seperately to return displacement chunks. It then stitches all of these displacement chunks back together and plots them. The output looks something like this:
One thing I’ve noticed is that the values I’m getting do not match the length of the rotating arm. After researching other academic articles about inertial wave measurement devices, it is apparent that the accuracy of the measurement is inversely proportional to the frequency and the amount of acceleration involved. I won’t go into too much detail right now, suffice it to say that I will be modifying the speed of rotation of the stick and the length to see how that affects the accuracy of my height measurements.
Some papers online mention using the zero crossings as integration reset points. I tried this method also as it uses way less compututational power than finding the minima. The results from the zero crossing method is shown below:
This graph doesn’t look anywhere near as good as the first and the values are completely different compared to the minima detection method. The seperate displacement chunks that have been stitched together do not match up perfectly meaning the last point of one chunk is quite far away from the first point of the next chuck. This artificially adds high frequency components into the data. As the frequency content of the data is really important I’m not sure if this method is viable without adding in more steps to stitch the displacement chunks together in a smoother way.
The parameter I’m interested in getting correct is maximum displacement. This should be around the length of the stick which is 1.5 meters. The way I calculate this parameter is by looking at each of the displacement chunks and finding the maximum displacement by subtracting the absolute value of the largest displacement from the absolute value of the smallest displacement value in a given chunk. I do this for all of the displacement chunks and average out the maximum displacement value from each.
When using the peak detection method this value of maximum displacement comes out as 1.81 meters.
With the zero crossing method this value of maximum displacement is 1.83 meters.
This represents roughly a 20% error for both methods of measurement. I’ve done some thinking about why these values are so far off and I think it’s mainly to do with the rotating arm setup. A 1.5 meter diameter of rotation may have been a bit ambitious as a starting point. Due to the uneven weighting of the arm, the imu experiences a swing effect when near the bottom of a rotation and there is a spike in the acceleration values as shown in the image below. I think this effect is causing issues with my results so I’m going to reduce the diameter of rotation and vary the frequency of rotation to see what effect that has.