Added ability to recenter / recalibrate eyes through OSC

This commit is contained in:
Assassinsorrow 2022-11-01 14:24:39 +02:00
parent 5d8d4dcaec
commit 4a77fd6043
4 changed files with 43 additions and 11 deletions

View File

@ -35,6 +35,8 @@ class EyeTrackSettingsConfig:
gui_osc_address: "str" = "127.0.0.1"
gui_osc_port: "str" = "9000"
gui_osc_receiver_port: "str" = "9001"
gui_osc_recenter_address: "str" = "/avatar/parameters/etvr_recenter"
gui_osc_recalibrate_address: "str" = "/avatar/parameters/etvr_recalibrate"
gui_blob_maxsize: "float" = 25
gui_blob_minsize: "float" = 10
gui_recenter_eyes: "bool" = False

View File

@ -37,11 +37,8 @@ def main():
osc_queue: "queue.Queue[tuple[bool, int, int]]" = queue.Queue()
osc = VRChatOSC(cancellation_event, osc_queue, config)
osc_thread = threading.Thread(target=osc.run)
osc_receiver = VRChatOSCReceiver(cancellation_event, config)
osc_receiver_thread = threading.Thread(target=osc_receiver.run)
# start worker threads
osc_thread.start()
osc_receiver_thread.start()
# t2s_queue: "queue.Queue[str | None]" = queue.Queue()
# t2s_engine = SpeechEngine(t2s_queue)
@ -54,7 +51,7 @@ def main():
CameraWidget(EyeId.LEFT, config, osc_queue),
# CameraWidget(EyeId.SETTINGS, config, osc_queue),
]
settings = [
SettingsWidget(EyeId.SETTINGS, config, osc_queue),
]
@ -117,12 +114,18 @@ def main():
if config.eye_display_id in [EyeId.LEFT, EyeId.BOTH]:
eyes[1].start()
eyes[0].ransac.calibration_frame_counter
if config.eye_display_id in [EyeId.RIGHT, EyeId.BOTH]:
eyes[0].start()
if config.eye_display_id in [EyeId.SETTINGS, EyeId.BOTH]:
settings[0].start()
# the eye's needs to be running before it is passed to the OSC
osc_receiver = VRChatOSCReceiver(cancellation_event, config, eyes)
osc_receiver_thread = threading.Thread(target=osc_receiver.run)
osc_receiver_thread.start()
# Create the window
window = sg.Window("EyeTrackVR v0.1.7", layout, icon='Images/logo.ico', background_color='#292929')

View File

@ -1,6 +1,7 @@
from pythonosc import udp_client
from pythonosc import osc_server
from pythonosc import dispatcher
from winsound import PlaySound, SND_FILENAME, SND_ASYNC
import queue
import threading
from enum import IntEnum
@ -127,24 +128,32 @@ class VRChatOSC:
last_blink = time.time()
class VRChatOSCReceiver:
def __init__(self, cancellation_event: "threading.Event", main_config: EyeTrackConfig):
def __init__(self, cancellation_event: "threading.Event", main_config: EyeTrackConfig, eyes: []):
self.config = main_config.settings
self.cancellation_event = cancellation_event
self.dispatcher = dispatcher.Dispatcher()
self.eyes = eyes # we cant import CameraWidget so any type it is
self.server = osc_server.OSCUDPServer((self.config.gui_osc_address, int(self.config.gui_osc_receiver_port)), self.dispatcher)
def shutdown(self):
print("Shutting down OSC receiver")
self.server.shutdown()
def testOSC(self, address, value):
print(address, value)
def recenter_eyes(self, address, value):
if value == True:
for eye in self.eyes:
eye.settings.gui_recenter_eyes
def recalibrate_eyes(self, address, value):
if value == True:
for eye in self.eyes:
eye.ransac.calibration_frame_counter = 300
PlaySound('Audio/start.wav', SND_FILENAME | SND_ASYNC)
def run(self):
print("VRChatOSCReceiver serving on {}".format(self.server.server_address))
# bind what function to run when specified OSC message is received
self.dispatcher.map("/avatar/parameters/VelocityX", self.testOSC)
self.dispatcher.map("/avatar/parameters/VelocityZ", self.testOSC)
self.dispatcher.map("/avatar/parameters/VelocityY", self.testOSC)
self.dispatcher.map(self.config.gui_osc_recalibrate_address, self.recalibrate_eyes)
self.dispatcher.map(self.config.gui_osc_recenter_address, self.recenter_eyes)
# start the server
self.server.serve_forever()

View File

@ -39,7 +39,9 @@ class SettingsWidget:
self.gui_osc_address = f"-OSCADDRESS{widget_id}-"
self.gui_osc_port = f"-OSCPORT{widget_id}-"
self.gui_osc_receiver_port = f"OSCRECEIVERPORTsgf{widget_id}-"
self.gui_osc_receiver_port = f"OSCRECEIVERPORT{widget_id}-"
self.gui_osc_recenter_address = f"OSCRECENTERADDRESS{widget_id}-"
self.gui_osc_recalibrate_address = f"OSCRECALIBRATEADDRESS{widget_id}-"
# self.gui_algo_settings_layout = f"-ALGOSETTINGSLAYOUT{widget_id}-"
self.gui_blob_fallback = f"-BLOBFALLBACK{widget_id}-"
@ -170,6 +172,14 @@ class SettingsWidget:
[
sg.Text("OSC Receiver Port:", background_color='#424042'),
sg.InputText(self.config.gui_osc_receiver_port, key=self.gui_osc_receiver_port),
],
[
sg.Text("OSC Recenter Address:", background_color='#424042'),
sg.InputText(self.config.gui_osc_recenter_address, key=self.gui_osc_recenter_address),
],
[
sg.Text("OSC Recalibrate Address:", background_color='#424042'),
sg.InputText(self.config.gui_osc_recalibrate_address, key=self.gui_osc_recalibrate_address),
]
@ -272,6 +282,14 @@ class SettingsWidget:
self.config.gui_osc_address = values[self.gui_osc_address]
changed = True
if self.config.gui_osc_recenter_address != values[self.gui_osc_recenter_address]:
self.config.gui_osc_recenter_address = values[self.gui_osc_recenter_address]
changed = True
if self.config.gui_osc_recalibrate_address != values[self.gui_osc_recalibrate_address]:
self.config.gui_osc_recalibrate_address = values[self.gui_osc_recalibrate_address]
changed = True
if self.config.gui_min_cutoff != values[self.gui_min_cutoff]:
self.config.gui_min_cutoff = values[self.gui_min_cutoff]
changed = True