mirror of
https://github.com/EyeTrackVR/EyeTrackVR.git
synced 2025-11-04 14:39:42 +08:00
Added ability to recenter / recalibrate eyes through OSC
This commit is contained in:
parent
5d8d4dcaec
commit
4a77fd6043
@ -35,6 +35,8 @@ class EyeTrackSettingsConfig:
|
|||||||
gui_osc_address: "str" = "127.0.0.1"
|
gui_osc_address: "str" = "127.0.0.1"
|
||||||
gui_osc_port: "str" = "9000"
|
gui_osc_port: "str" = "9000"
|
||||||
gui_osc_receiver_port: "str" = "9001"
|
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_maxsize: "float" = 25
|
||||||
gui_blob_minsize: "float" = 10
|
gui_blob_minsize: "float" = 10
|
||||||
gui_recenter_eyes: "bool" = False
|
gui_recenter_eyes: "bool" = False
|
||||||
|
|||||||
@ -37,11 +37,8 @@ def main():
|
|||||||
osc_queue: "queue.Queue[tuple[bool, int, int]]" = queue.Queue()
|
osc_queue: "queue.Queue[tuple[bool, int, int]]" = queue.Queue()
|
||||||
osc = VRChatOSC(cancellation_event, osc_queue, config)
|
osc = VRChatOSC(cancellation_event, osc_queue, config)
|
||||||
osc_thread = threading.Thread(target=osc.run)
|
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
|
# start worker threads
|
||||||
osc_thread.start()
|
osc_thread.start()
|
||||||
osc_receiver_thread.start()
|
|
||||||
|
|
||||||
# t2s_queue: "queue.Queue[str | None]" = queue.Queue()
|
# t2s_queue: "queue.Queue[str | None]" = queue.Queue()
|
||||||
# t2s_engine = SpeechEngine(t2s_queue)
|
# t2s_engine = SpeechEngine(t2s_queue)
|
||||||
@ -54,7 +51,7 @@ def main():
|
|||||||
CameraWidget(EyeId.LEFT, config, osc_queue),
|
CameraWidget(EyeId.LEFT, config, osc_queue),
|
||||||
# CameraWidget(EyeId.SETTINGS, config, osc_queue),
|
# CameraWidget(EyeId.SETTINGS, config, osc_queue),
|
||||||
]
|
]
|
||||||
|
|
||||||
settings = [
|
settings = [
|
||||||
SettingsWidget(EyeId.SETTINGS, config, osc_queue),
|
SettingsWidget(EyeId.SETTINGS, config, osc_queue),
|
||||||
]
|
]
|
||||||
@ -117,12 +114,18 @@ def main():
|
|||||||
|
|
||||||
if config.eye_display_id in [EyeId.LEFT, EyeId.BOTH]:
|
if config.eye_display_id in [EyeId.LEFT, EyeId.BOTH]:
|
||||||
eyes[1].start()
|
eyes[1].start()
|
||||||
|
eyes[0].ransac.calibration_frame_counter
|
||||||
if config.eye_display_id in [EyeId.RIGHT, EyeId.BOTH]:
|
if config.eye_display_id in [EyeId.RIGHT, EyeId.BOTH]:
|
||||||
eyes[0].start()
|
eyes[0].start()
|
||||||
|
|
||||||
if config.eye_display_id in [EyeId.SETTINGS, EyeId.BOTH]:
|
if config.eye_display_id in [EyeId.SETTINGS, EyeId.BOTH]:
|
||||||
settings[0].start()
|
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
|
# Create the window
|
||||||
window = sg.Window("EyeTrackVR v0.1.7", layout, icon='Images/logo.ico', background_color='#292929')
|
window = sg.Window("EyeTrackVR v0.1.7", layout, icon='Images/logo.ico', background_color='#292929')
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
from pythonosc import udp_client
|
from pythonosc import udp_client
|
||||||
from pythonosc import osc_server
|
from pythonosc import osc_server
|
||||||
from pythonosc import dispatcher
|
from pythonosc import dispatcher
|
||||||
|
from winsound import PlaySound, SND_FILENAME, SND_ASYNC
|
||||||
import queue
|
import queue
|
||||||
import threading
|
import threading
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
@ -127,24 +128,32 @@ class VRChatOSC:
|
|||||||
last_blink = time.time()
|
last_blink = time.time()
|
||||||
|
|
||||||
class VRChatOSCReceiver:
|
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.config = main_config.settings
|
||||||
self.cancellation_event = cancellation_event
|
self.cancellation_event = cancellation_event
|
||||||
self.dispatcher = dispatcher.Dispatcher()
|
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)
|
self.server = osc_server.OSCUDPServer((self.config.gui_osc_address, int(self.config.gui_osc_receiver_port)), self.dispatcher)
|
||||||
|
|
||||||
def shutdown(self):
|
def shutdown(self):
|
||||||
print("Shutting down OSC receiver")
|
print("Shutting down OSC receiver")
|
||||||
self.server.shutdown()
|
self.server.shutdown()
|
||||||
|
|
||||||
def testOSC(self, address, value):
|
def recenter_eyes(self, address, value):
|
||||||
print(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):
|
def run(self):
|
||||||
print("VRChatOSCReceiver serving on {}".format(self.server.server_address))
|
print("VRChatOSCReceiver serving on {}".format(self.server.server_address))
|
||||||
# bind what function to run when specified OSC message is received
|
# bind what function to run when specified OSC message is received
|
||||||
self.dispatcher.map("/avatar/parameters/VelocityX", self.testOSC)
|
self.dispatcher.map(self.config.gui_osc_recalibrate_address, self.recalibrate_eyes)
|
||||||
self.dispatcher.map("/avatar/parameters/VelocityZ", self.testOSC)
|
self.dispatcher.map(self.config.gui_osc_recenter_address, self.recenter_eyes)
|
||||||
self.dispatcher.map("/avatar/parameters/VelocityY", self.testOSC)
|
|
||||||
# start the server
|
# start the server
|
||||||
self.server.serve_forever()
|
self.server.serve_forever()
|
||||||
|
|||||||
@ -39,7 +39,9 @@ class SettingsWidget:
|
|||||||
|
|
||||||
self.gui_osc_address = f"-OSCADDRESS{widget_id}-"
|
self.gui_osc_address = f"-OSCADDRESS{widget_id}-"
|
||||||
self.gui_osc_port = f"-OSCPORT{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_algo_settings_layout = f"-ALGOSETTINGSLAYOUT{widget_id}-"
|
||||||
|
|
||||||
self.gui_blob_fallback = f"-BLOBFALLBACK{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.Text("OSC Receiver Port:", background_color='#424042'),
|
||||||
sg.InputText(self.config.gui_osc_receiver_port, key=self.gui_osc_receiver_port),
|
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]
|
self.config.gui_osc_address = values[self.gui_osc_address]
|
||||||
changed = True
|
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]:
|
if self.config.gui_min_cutoff != values[self.gui_min_cutoff]:
|
||||||
self.config.gui_min_cutoff = values[self.gui_min_cutoff]
|
self.config.gui_min_cutoff = values[self.gui_min_cutoff]
|
||||||
changed = True
|
changed = True
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user