same problem here. I've been looking at this for about two weeks now, and I'm no closer to a solution. I'm adding here my trials and maybe others can see something that will help. I'm not adding it as a github issue, because I don't know how to describe the problem.
1. So the navmesh will give a list of points say, [(350,100), (400, 100) ....]. If the position of the object you are trying to move is not at the 100 height, then the
move function may fail because the whole move cannot be accomplished, resulting in an unpredictable behavior.
2. Even if tiles are pixel perfect, there seem to be some pixels out of place, which will results into a "bad" collision with your object.
3. Both 1 and 2 may bring the object into a situation where the distance that needs to be traveled is less than a pixel, resulting into a normalized direction of: 0.0001 by 0.00033, meaning some extremely small values resulting in very very small speed (or motion as defined in the above code), the 1 or 2 or both will return back the object to the initial distance, less than a pixel and a back and forth movement will occur.
What I did was to remove entirely the collision shape from the moving object, it still happens, maybe less frequent but I can't be sure, presumably discarding the second point I made.
Another thing I did, was to detect when the distance to travel is less than a pixel, and at that point used a force move,
move_to to a distance +1 px further away, this helps most of the times only when you are going: left/right, or up/down, when all directions are needed, then it's not working since +1 on y and x, will create wiggling.
I looked at the source code.. seems complex and difficult to understand, but there were no magical numbers, and the resulting path is always correct.. So ... back to square one...