In your program, you are timing the loop, not the acquisition. The timer value is probably read at the start of each loop (never can be sure with parallel processes). The acquisition takes a few loops before it synchronizes with the timer value.
If you want to time your acquisition more accurately, put the timer read in a sequence with the acquisition. Immediately after completing the acquisition, the timer will be read.
Another option would require counter-timers, so the timing could be done completely in hardware and would be more accurate.
Even accounting for the timing irregularities, it looks like you may be missing the first frame. I would probably set up a continuous buffer instead of using grab to make sure no frames are missed.
Bruce
Bruce Ammons
Ammons Engineering