Problem: I have a self-stabilizing system that utilizes an intertial measurement unit (IMU) attached to the hull of a vessel. The system self stabilizes by performing matrix rotations based on the output of Euler angles of the IMU, effectively driving the motion in the opposite direction to compensate for the motion of the vessel. In simulation, and with a system that has a large maximum acceleration and velocity, the algorithm works great. The issue is that there exists a very real lag in the motion of the physical output of the drive.
Question: What are some techniques for compensating for this lag?
Current Attempt: I characterize the motor/output drive by analyzing the amount of lag given a set of velocities. That is, I run the motor at various velocities and measure the difference between the expected position and the actual position of the output drive. From these measurements I deduce a polynomial equation (second order) which effectively predicts the lag of the motor given a certain velocity. This is worked into an ABG filter, which estimates the current velocity and acceleration of the system given positional input. As the IMU data comes in, it is passed through the ABG filter and the coefficients derived from the aforementioned polynomial is applied as a velocity feedforward, which adjusts the output proportionally to the rate at which the roll and pitch are adjusted. Adjusting the coefficients of the ABG filter, heuristically, should theoretically alter the predicted path such that the IMU output is seen as an "adjusted" or otherwise contrived value intended to force the motors to perform a velocity/acceleration larger than the actual (unadjusted) output of the IMU would require, effectively reducing the error between the desired position of the motor/drive and the actual position of the motor/drive.
The lag of the motors/output appears as a phase difference between the IMU output and measured position of the output drive. It seems to always lag by about 200 milliseconds. My assumption was that by increasing the target position, the motor would effectively move quicker. To some extent this works well, but there's a lingering error between where I want to be and where I am at any given point in time.
Further Considerations: After reading some research papers on the topic, it appears that use of a PID loop is preferred over the use of the filter/feedforward in my original question.
Any help is much appreciated.