It took me a while but after searching through the source code, after looking through several other issues related to mine and reading up on everything, I finally found the cause and a fix.
First, why does this happen?
This issue is caused by the decision made by Godot's team to get tracking information immediately prior to rendering, in the visual_server_viewport source file in the Godot engine code, in the function draw_viewports, it checks if ARVR is enabled then calls it's process function.
This means that the information we get in script and for physics processing is actually from the last frame, causing the frame delay that I saw. This is actually a good decision, because it means that for most VR games, where you're not moving the origin node like I am, it keeps the tracking information up to date for rendering, where it is most important, to minimize any lag one might feel in VR.
The Fix.
Someone had opened a ticket on the OpenVR Godot Github issue tracker who had a similar issue with the VR stuff being a frame behind, they proposed this work around:
self.notification(NOTIFICATION_INTERNAL_PROCESS)
for c in [ $OVRController, $OVRController2, $OVRController3, $OVRController4 ]:
if (c.get_controller_name() != "Not connected"):
c.notification(NOTIFICATION_INTERNAL_PROCESS)
Throwing this in the _process
function in the ARVR Origin node forces the VR stuff to update, removing the problematic delay.