cmbruns / pyopenxr_examples

Sample programs using the pyopenxr python AR/VR bindings
Apache License 2.0
20 stars 6 forks source link

Create a headless example #6

Open cmbruns opened 2 years ago

cmbruns commented 2 years ago

I recently noticed XR_MND_headless is an available extension on my Linux/SteamVR platform. So now I might be able to create an example for this without spinning my wheels trying to get Monado installed.

SurprisinglySuspicious commented 2 years ago

Hey, Thanks for making this. I've recently been trying to make a very simple (accessibility) program in SteamVR that just runs in the background while playing a game and just print text (for now) when 4 buttons are touched on the L&R index or quest 2 controllers. I've gotten the code to work, but since SteamVR can't run 2 things at once and doesn't support XR overlays yet, I can't run the code and another game at the same time... XR_MND_headless seems to be my last resort.

I'm no great programmer but I have tried so hard to break my head and get it to work by myself and I've looked far and wide but without examples online, I think I jumped into something bigger than I can handle.

Basically all of this to say: My very very simple project might be screwed without this and I'm hoping I could understand and learn from it when it's done. Thanks!

hiinaspace commented 2 years ago

I briefly tried this on win10/steamvr which also reports that XR_MND_headless is available. Changed the setup of track_hmd.py to

with xr.InstanceObject(application_name="track_hmd", enabled_extensions=["XR_MND_headless"]) as instance, \
        xr.SystemObject(instance) as system, \
        xr.SessionObject(system, graphics_binding=None) as session:

and it will print hmd poses while remaining in the steamvr polar grid. However, I tried removing the sessiong.wait_frame() begin/end frame calls and got

(venv) PS C:\Users\s\source\repos\pyopenxr\pyopenxr_examples> python .\xr_examples\track_hmd.py
Traceback (most recent call last):
  File "C:\Users\s\source\repos\pyopenxr\pyopenxr_examples\xr_examples\track_hmd.py", line 21, in <module>
    view_state, views = session.locate_views()
  File "C:\Users\s\source\repos\pyopenxr\venv\lib\site-packages\xr\classes.py", line 234, in locate_views
    return locate_views(self.handle, view_locate_info)
  File "C:\Users\s\source\repos\pyopenxr\venv\lib\site-packages\xr\functions.py", line 705, in locate_views
    raise result
xr.exception.TimeInvalidError: The provided basetype:XrTime was zero, negative, or out of range.

https://github.com/cmbruns/pyopenxr/blob/85bdaf3ae249192f77c047a6bd766c8be321867d/src/xr/classes.py#L225-L227 looks like it tries to take the predicted display time from the (presumably blank) frame_state; I'm not yet familiar enough with openxr to debug beyond this.

Unfortunately, with the frame calls in, launching track_hmd.py does make steamvr kill whatever else is running (I'm also looking for a solution to make an "overlay" application through openxr). I know https://github.com/LunarG/OpenXR-OverlayLayer is out there and I roughly understand it functions as a "API layer" that can in theory run on top of steamvr. I don't know if anybody's tried that yet.