After spending many months tracking down all possible sources of error, I have come to the conclusion that the velocity and position reported by the UBlox LEA5H are not correct for the time reported by the module, but actually from many milliseconds in the past.
As part of a larger project, I am using the LEA5H reporting at 4Hz to observe and correct IMU data and biases. I have the time-pulse pin configured and triggering an external interrupt on my micro-controller to capture the exact time as dictated by the GPS's preceding UBX-TIM-TP message. This can then be correlated with the iTOW field in the NAV-VELNED & NAV-POSLLH messages to determine what local system time the velocity and position are supposed to correspond to. Keeping a history of what my IMU thought the velocity and speed was, I can compare the two at that moment and use the reported estimated accuracy to correct my internal estimates. Capturing all of this data in real-time at a rate of 200Hz, it is recorded to an on-board microSD card which can be analyzed post flight using parameter estimation software.
What I have found is that the speed and velocity indicated by the GPS are actually from an earlier time, and worse, they don't seem to be off by the same amount of time.
The position seems to lag by ~128ms and velocity by ~205ms. That is a lot of time for the accuracy that I am trying to achieve. These numbers pass visual inspection of the data as well as simulations and actual flight tests.
I'm wondering if anyone has any experience with this issue or can comment.