python side of hobo_vr
Project description
virtualreality
python side of hobo_vr
mainly used for writing posers
has many helpful utilities for positional tracking, serial/socket/bluetooth communication, etc.
has an async socket server
installation
to install the module, run the following command:
python -m pip install virtualreality
if you want to have camera based tracking, install it with the camera
extra
python -m pip install virtualreality[camera]
to install the development version, do the following:
git clone https://github.com/okawo80085/hobo_vr
cd ./hobo_vr
python -m pip install -e .
quick example
import asyncio
import time
import numpy as np
from virtualreality import templates
class MyPoser(templates.PoserTemplate):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@templates.PoserTemplate.register_member_thread(1 / 100)
async def example_thread1(self):
'''moves the headset in a circle'''
h = 0
while self.coro_keep_alive["example_thread1"].is_alive:
try:
self.pose.x = np.sin(h)
self.pose.y = np.cos(h)
h += 0.01
await asyncio.sleep(self.coro_keep_alive["example_thread1"].sleep_delay)
except Exception as e:
print(f"example_thread1 failed: {e}")
break
self.coro_keep_alive["example_thread1"].is_alive = False
@templates.PoserTemplate.register_member_thread(1 / 100, runInDefaultExecutor=True)
def example_thread2(self):
'''moves the left controller up and down'''
h = 0
while self.coro_keep_alive["example_thread2"].is_alive:
try:
self.pose_controller_l.y = 1+np.cos(h*3)/5
h += 0.01
time.sleep(self.coro_keep_alive["example_thread2"].sleep_delay)
except Exception as e:
print(f"example_thread2 failed: {e}")
break
self.coro_keep_alive["example_thread2"].is_alive = False
poser = MyPoser()
asyncio.run(poser.main())
poser client example
import asyncio
import time
import numpy as np
from virtualreality import templates
poser = templates.PoserClient()
@poser.thread_register(1/60)
async def example_thread():
'''moves the headset in a circle'''
h = 0
while poser.coro_keep_alive["example_thread"].is_alive:
poser.pose.y = round(np.sin(h), 4)
poser.pose.x = round(np.cos(h), 4)
h += 0.01
await asyncio.sleep(poser.coro_keep_alive["example_thread"].sleep_delay)
@poser.thread_register(1/60, runInDefaultExecutor=True)
def example_thread2():
'''moves the controller up and down'''
while poser.coro_keep_alive["example_thread2"].is_alive:
poser.pose_controller_l.x = 1+np.cos(h*3)/5
time.sleep(poser.coro_keep_alive["example_thread2"].sleep_delay)
asyncio.run(poser.main())
udu poser client example
u - unlimited
d - devices
u - upgrade
buts its more like a mode
here is an example
"""
udu poser client example
more info: help(templates.UduPoserTemplate)
"""
import asyncio
import time
import numpy as np
import pyrr
from virtualreality import templates
from virtualreality.server import server
poser = templates.UduPoserClient("h c t")
# ^^^^^
# this dictates devices used
# for this example its:
# hmd controller tracker
# poser = templates.UduPoserClient("h c c") btw normal posers use this device configuration
@poser.thread_register(1 / 60)
async def example_thread():
# spins all devices in an orbit
h = 0
while poser.coro_keep_alive["example_thread"].is_alive:
x, y, z, w = pyrr.Quaternion.from_y_rotation(h)
for i in range(len(poser.poses)):
poser.poses[i].x = np.sin(h / (i + 1))
poser.poses[i].z = np.cos(h / (i + 1))
poser.poses[i].r_x = x
poser.poses[i].r_y = y
poser.poses[i].r_z = z
poser.poses[i].r_w = w
h += 0.01
await asyncio.sleep(poser.coro_keep_alive["example_thread"].sleep_delay)
# any poser can do this actually
@poser.thread_register(1 / 60)
async def example_receive_haptics_thread():
while poser.coro_keep_alive["example_receive_haptics_thread"].is_alive:
# check for new reads
if poser.last_read:
print (poser.last_read) # print received
poser.last_read = b"" # reset
await asyncio.sleep(poser.coro_keep_alive["example_receive_haptics_thread"].sleep_delay)
asyncio.run(poser.main())
unlike normal posers, udu posers generate pose structs on start
you then need use those pose structs as the value for DeviceManifestList
in the driver config
more examples
there is also poser_3dof_hmd_only.py
, its an udu poser with actual 3dof(hmd only) tracking(more info in the example itself)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file virtualreality-0.1.2.tar.gz
.
File metadata
- Download URL: virtualreality-0.1.2.tar.gz
- Upload date:
- Size: 46.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 635d453fe6f35bf6ae102951af83e3e08eb7a908cbf5e2c3eadfb690aefca029 |
|
MD5 | 06220f4808a7757395f8cf7859bb52da |
|
BLAKE2b-256 | 0300016f3a661716b5680d6acbfb7984bb59cb266695f561d4caf1b3a22eae50 |
File details
Details for the file virtualreality-0.1.2-py3-none-any.whl
.
File metadata
- Download URL: virtualreality-0.1.2-py3-none-any.whl
- Upload date:
- Size: 56.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6b3a9492730074e22b0f01c0751214152ef674c1b94f8f8c338896a911614ae4 |
|
MD5 | bc27b2951fdffc9868f8a8bec5868cfa |
|
BLAKE2b-256 | 149de5c294566be3744f9264b53ba250725c14d5bb15dc0d10d25c2653742b8f |