From 4a77fd60433f2f4dffd14d5dba8e27bbecd8a727 Mon Sep 17 00:00:00 2001 From: Assassinsorrow <49711232+ShyAssassin@users.noreply.github.com> Date: Tue, 1 Nov 2022 14:24:39 +0200 Subject: [PATCH] Added ability to recenter / recalibrate eyes through OSC --- EyeTrackApp/config.py | 2 ++ EyeTrackApp/eyetrackapp.py | 11 +++++++---- EyeTrackApp/osc.py | 21 +++++++++++++++------ EyeTrackApp/settings_widget.py | 20 +++++++++++++++++++- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/EyeTrackApp/config.py b/EyeTrackApp/config.py index ea1c9aa..255e91f 100644 --- a/EyeTrackApp/config.py +++ b/EyeTrackApp/config.py @@ -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 diff --git a/EyeTrackApp/eyetrackapp.py b/EyeTrackApp/eyetrackapp.py index fe3eb8e..00d86b3 100644 --- a/EyeTrackApp/eyetrackapp.py +++ b/EyeTrackApp/eyetrackapp.py @@ -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') diff --git a/EyeTrackApp/osc.py b/EyeTrackApp/osc.py index c1eb7a8..60ba0aa 100644 --- a/EyeTrackApp/osc.py +++ b/EyeTrackApp/osc.py @@ -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() diff --git a/EyeTrackApp/settings_widget.py b/EyeTrackApp/settings_widget.py index 3699f4d..dbfd6e0 100644 --- a/EyeTrackApp/settings_widget.py +++ b/EyeTrackApp/settings_widget.py @@ -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