To give a quick summary of where I’m at with this project, I’ve got my breadboard circuit attached to the end of a rotating arm and it’s streaming data back to my PC. I’ve performed some basic analysis on this data and have double integrated the z-axis acceleration to get displacement and this displacement value roughly matches the length of the rotating arm.

So just as a recap, the breadboard contains a teensy 3.6, a BNO55 9DOF IMU sensor and a serial bluetooth adapter. At the moment the only values I have streaming to my computer are linear acceleration for the x,y and z axis. In the image above, the z axis is perpendicular to the surface of the BNO55 breakout board. As the breadboard is kept roughly horizontal as the arm rotates, most of the acceleration is in the vertical axis which in this case is the z axis. As such, I’ve chosen the z-axis to perform some signal analysis to try and find the vertical displacement. This is just for an initial test, the other two axis will probably need to be taken into account for more accurate measurement. Before we get in to the signal analysis, check out this video of the arm rotating:

It’s useful to first see how the breadboard moves as the rotating arm rotates. It doesn’t stay perfectly horizontal which is actually a good thing as this means it is slightly more accurate a representation of a real life data buoy.

First lets take a look at the z-axis linear acceleration:

This graph contains acceleration data from about four and a half rotations. The good news is you an see a clear periodic element to the data which does roughly coincide with how long the rotations take (for this set of data each full rotation was around 4 seconds). It’s a bit puzzling the way the acceleration dips a bit before increasing and then dropping down to around -4m/s^2. One possible explanation is this occurs when the IMU is near the top of the rotation, the mount does not stay completely horizontal as there is some friction with the rotating arm. This causes the rotating mount to rather quickly flick from one position to another when near the top of a rotation. This flicking action may momentary cancel out the z-acceleration before the imu starts to properly descend once again. This action can be seen in the video above. Another contributing factor may be that the rotating arm is weighted in an unbalanced way. If the counterweight is a bit heavier than the breadboard it would have a slight catapult effect when the IMU is near the top part of the rotation.

In the graph above, the minima where the acceleration drops to around -4m/s^2 represents the IMU at the lowest part of the rotation (6 o clock on a clock dial).

So if we integrate from one minima to a neighboring one this will give us the instantaneous velocity for each point in one rotation. For my displacement data experiment, I took the acceleration from one half rotation which was from the 6 o clock position to the 12 o clock position. In reality I was a bit off so it’s a bit more than one half but it doesn’t really matter as you will see in the graphs below.

If we integrate this velocity once more, displacement can be obtained.

See below for the graphs of acceleration, velocity and displacement:

This initial test has shown quite encouraging results. The length of the rotating arm is 1.5 meters and the IMU is mounted right at the end of the arm. This means going from the 6 o clock position to the 12 o clock position, the IMU will travel through a vertical distance of 1.5 meters which you can see is roughly the maximum displacement on the displacement graph.

### The Integration Problem:

From the graph above you can see the issue related to absolute 3d position tracking with IMU sensors. The fact that to get velocity you have to integrate an acceleration measurement means that even tiny errors will accumulate and result in a snowball effect as seen above. As a result, the general consensus is that IMU devices are not suitable for 3d position tracking.

The reason why wave sensors can get away with this is they use a statistical measurement approach. Measuring the height of a single wave may have a relatively large error margin but measuring the heights of say 1000 waves and reporting the significant or average wave height has been achieved by many commercial wave sensors. One step needed is to periodically reset the integration counter. In the first graph in this post of z-axis acceleration, the minima stand out on the graph as easy spots to reset the integration counter. This means that any error that accumulates would only have around 4 seconds to do so.

### Next Steps:

For the next week I will try to write some Python scripts that can accept a set of z-acceleration data, recognise the minima and integrate between them twice to give several displacement values. I’ll also do more research on how important the other two axes are in terms of vertical displacement measurement. Another important aspect is wave direction so I’ll be looking in to that also.