Skip to content

Commit 321e1e7

Browse files
committed
Proper termination for the simulate window
1 parent aef5948 commit 321e1e7

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

python/rcs/sim.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import atexit
2-
import time
32
import multiprocessing as mp
3+
import time
44
import uuid
55
from copy import deepcopy
66
from logging import getLogger
@@ -35,12 +35,13 @@
3535
FRAME_DURATION = 1.0 / FPS
3636

3737

38-
def gui_loop(model_bytes: bytes, close_event: Event, gui_uuid: str):
38+
def gui_loop(gui_uuid: str, close_event: Event):
39+
gui_client = _GuiClient(gui_uuid)
40+
model_bytes = gui_client.get_model_bytes()
3941
with NamedTemporaryFile(mode="wb") as f:
4042
f.write(model_bytes)
4143
model = mujoco.MjModel.from_binary_path(f.name)
4244
data = mujoco.MjData(model)
43-
gui_client = _GuiClient(gui_uuid)
4445
gui_client.set_model_and_data(model._address, data._address)
4546
mujoco.mj_step(model, data)
4647
with mujoco.viewer.launch_passive(model, data) as viewer:
@@ -69,28 +70,29 @@ def __init__(self, mjmdl: str | PathLike):
6970
logger.error(msg)
7071
self.data = mj.MjData(self.model)
7172
super().__init__(self.model._address, self.data._address)
72-
self._gui_uuid: Optional[str] = None
7373
self._mp_context = mp.get_context("spawn")
74+
self._gui_uuid: Optional[str] = None
7475
self._gui_client: Optional[GuiClient] = None
75-
self._gui_thread: Optional[Thread] = None
76+
self._gui_process: Optional[mp.Process] = None
77+
self._stop_event: Optional[mp.Event] = None
78+
79+
def close_gui(self):
80+
if self._stop_event is not None:
81+
self._stop_event.set()
82+
if self._gui_process is not None:
83+
self._gui_process.join()
84+
self._stop_gui_server()
7685

7786
def open_gui(self):
7887
if self._gui_uuid is None:
7988
self._gui_uuid = "rcs_" + str(uuid.uuid4())
8089
self._start_gui_server(self._gui_uuid)
81-
atexit.register(self._stop_gui_server)
8290
if self._gui_client is None:
83-
self._gui_client = _GuiClient(self._gui_uuid)
84-
model_bytes = self._gui_client.get_model_bytes()
8591
ctx = mp.get_context("spawn")
8692
self._stop_event = ctx.Event()
8793
self._gui_process = ctx.Process(
8894
target=gui_loop,
89-
args=(model_bytes, self._stop_event, self._gui_uuid),
95+
args=(self._gui_uuid, self._stop_event),
9096
)
9197
self._gui_process.start()
92-
93-
def __del__(self):
94-
self._stop_event.set()
95-
self._gui_process.join()
96-
self._stop_gui_server()
98+
atexit.register(self.close_gui)

0 commit comments

Comments
 (0)