Sorry for not replying sooner, I was a little busy.
Your code looks fine, I don’t see anything wrong with it. Now I think what you’re rubbing up against is just sync jitter.
You’re already aware that the physics loop and the game/display loop are essentially independent and run at different rates. The physics loop operates at a fixed rate, which is 0.02 seconds per iteration by default. The game loop, on the other hand, has no speed limitation and runs as fast as it can pump out frames unless it is specifically limited to a maximum frame rate in the application settings. If the physics loop is running slower than the game loop, then objects controlled by the physics engine may not be updated every frame. This can easily result in “vibrations” in those objects if your camera or other objects are being controlled in the game loop at a different update rate.
There are a few ways to reduce the effects of sync jitter. Ideally, the physics loop and game loop should operate at the same rate. You can change the physics engine’s fixed timestep in Edit->Project Settings->Time to be closer to the game loop’s expected time step. However, this is not always easy to predict beforehand, and reducing the fixed timestep increases the amount of work that the physics loop performs and this will reduce the game’s overall performance. Another thing you can do is adjust the game loop’s target frame rate by modifying Application.targetFrameRate. You may be able to find an acceptable balance between the physics engine’s rate and the game loop’s rate by adjusting these values.
Be mindful of the rate that the position and orientation of all objects in the scene, including the camera, are being updated at. For example… If your camera is translating or rotating in the Update() loop, but you have kinematic objects being updated in FixedUpdate(), and if the physics loop is slower than the game loop (frame rate), then those kinematic objects will probably suffer from jittering. In this case, move the kinematic object’s code into Update(), or move the camera’s code into the FixedUpdate() call and see if things improve.
I’ve noticed in experiments that Rigidbody.MovePosition() and MoveRotation() don’t work with RigidBody interpolation. I don’t know if this is a bug or if it is working as intended. Interpolation only appears to work if the object is being moved via force methods (i.e. AddForce(), AddTorque(), etc… ), in which case Rigidbody.isKinematic must be false.
I hope some of this advice is useful. I might throw together an app that demonstrates sync jitter, the reason it happens, and its solutions.