From e9884a96f1cf88f53d666e036f682fe2371a9022 Mon Sep 17 00:00:00 2001 From: Javier Izquierdo Hernandez Date: Thu, 2 Oct 2025 15:25:53 +0200 Subject: [PATCH 1/7] Add base o3de files --- manager/manager/launcher/launcher_o3de.py | 70 +++++++++++++++++++ manager/manager/launcher/launcher_o3de_api.py | 46 ++++++++++++ manager/manager/launcher/launcher_tools.py | 10 +++ manager/manager/launcher/launcher_world.py | 10 +++ 4 files changed, 136 insertions(+) create mode 100644 manager/manager/launcher/launcher_o3de.py create mode 100644 manager/manager/launcher/launcher_o3de_api.py diff --git a/manager/manager/launcher/launcher_o3de.py b/manager/manager/launcher/launcher_o3de.py new file mode 100644 index 0000000..a01a0ff --- /dev/null +++ b/manager/manager/launcher/launcher_o3de.py @@ -0,0 +1,70 @@ +import sys +from manager.manager.launcher.launcher_interface import ILauncher +from manager.manager.docker_thread.docker_thread import DockerThread +from manager.manager.vnc.vnc_server import Vnc_server +from manager.libs.process_utils import ( + wait_for_process_to_start, + check_gpu_acceleration, +) +import subprocess +import time +import os +import stat +from typing import List, Any +from manager.ram_logging.log_manager import LogManager + +class LauncherO3de(ILauncher): + display: str + internal_port: int + external_port: int + height: int + width: int + running: bool = False + threads: List[Any] = [] + acceptsMsgs: bool = False + gz_vnc: Any = Vnc_server() + + def run(self, config_file, callback): + + process_name = "gz sim" + wait_for_process_to_start(process_name, timeout=60) + + self.running = True + + def check_device(self, device_path): + try: + return stat.S_ISCHR(os.lstat(device_path)[stat.ST_MODE]) + except: + return False + + def is_running(self): + return self.running + + def terminate(self): + self.running = False + + def died(self): + pass + + def pause(self): + #TODO: add pause + pass + + def unpause(self): + #TODO: add resume + pass + + def reset(self): + #TODO: add reset + pass + + def get_dri_path(self): + directory_path = "/dev/dri" + dri_path = "" + if os.path.exists(directory_path) and os.path.isdir(directory_path): + files = os.listdir(directory_path) + if "card1" in files: + dri_path = os.path.join("/dev/dri", os.environ.get("DRI_NAME", "card1")) + else: + dri_path = os.path.join("/dev/dri", os.environ.get("DRI_NAME", "card0")) + return dri_path diff --git a/manager/manager/launcher/launcher_o3de_api.py b/manager/manager/launcher/launcher_o3de_api.py new file mode 100644 index 0000000..b4b271a --- /dev/null +++ b/manager/manager/launcher/launcher_o3de_api.py @@ -0,0 +1,46 @@ +import os +import sys +from typing import List, Any +import time +import stat + +from manager.manager.launcher.launcher_interface import ILauncher, LauncherException +from manager.manager.docker_thread.docker_thread import DockerThread +import subprocess + +import logging + + +class LauncherO3deApi(ILauncher): + type: str + module: str + launch_file: str + threads: List[Any] = [] + + def run(self, callback): + DRI_PATH = self.get_dri_path() + ACCELERATION_ENABLED = self.check_device(DRI_PATH) + + #TODO: add run here + + def terminate(self): + if self.threads is not None: + for thread in self.threads: + if thread.is_alive(): + thread.terminate() + thread.join() + self.threads.remove(thread) + + # TODO: processes to kill + to_kill = ["launch.py"] + + kill_cmd = "pkill -9 -f " + for i in to_kill: + cmd = kill_cmd + i + subprocess.call( + cmd, + shell=True, + stdout=subprocess.PIPE, + bufsize=1024, + universal_newlines=True, + ) diff --git a/manager/manager/launcher/launcher_tools.py b/manager/manager/launcher/launcher_tools.py index 416b159..125904a 100644 --- a/manager/manager/launcher/launcher_tools.py +++ b/manager/manager/launcher/launcher_tools.py @@ -32,6 +32,15 @@ "external_port": 6080, "internal_port": 5900, }, + "o3de": { + "type": "module", + "width": 1024, + "height": 768, + "module": "o3de", + "display": ":2", + "external_port": 6080, + "internal_port": 5900, + }, "rviz": { "module": "rviz", "display": ":3", @@ -61,6 +70,7 @@ simulator = { "gazebo": {"tool": "gazebo"}, "gz": {"tool": "gzsim"}, + "o3de": {"tool": "o3de"}, } diff --git a/manager/manager/launcher/launcher_world.py b/manager/manager/launcher/launcher_world.py index eeb23bc..7f6ba6d 100644 --- a/manager/manager/launcher/launcher_world.py +++ b/manager/manager/launcher/launcher_world.py @@ -26,6 +26,16 @@ } ], }, + "o3de": { + "2": [ + { + "type": "o3de", + "module": "o3de_api", + "parameters": [], + "launch_file": [], + } + ], + }, "physical": {}, } From 1f57e913d6ba6b29bd483ad62f013db589d4021f Mon Sep 17 00:00:00 2001 From: miniesda Date: Fri, 3 Oct 2025 11:58:21 +0200 Subject: [PATCH 2/7] Update launcher_o3de_api.py --- manager/manager/launcher/launcher_o3de_api.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/manager/manager/launcher/launcher_o3de_api.py b/manager/manager/launcher/launcher_o3de_api.py index b4b271a..0f89cce 100644 --- a/manager/manager/launcher/launcher_o3de_api.py +++ b/manager/manager/launcher/launcher_o3de_api.py @@ -6,6 +6,11 @@ from manager.manager.launcher.launcher_interface import ILauncher, LauncherException from manager.manager.docker_thread.docker_thread import DockerThread +from manager.manager.vnc.vnc_server import Vnc_server +from manager.libs.process_utils import ( + wait_for_process_to_start, + check_gpu_acceleration, +) import subprocess import logging @@ -16,6 +21,7 @@ class LauncherO3deApi(ILauncher): module: str launch_file: str threads: List[Any] = [] + gz_vnc: Any = Vnc_server() def run(self, callback): DRI_PATH = self.get_dri_path() @@ -23,7 +29,33 @@ def run(self, callback): #TODO: add run here + xserver_cmd = f"/usr/bin/Xorg -quiet -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xdummy.log -config ./xorg.conf :0" + xserver_thread = DockerThread(xserver_cmd) + xserver_thread.start() + self.threads.append(xserver_thread) + + if ACCELERATION_ENABLED: + # Starts xserver, x11vnc and novnc + self.gz_vnc.start_vnc_gpu( + self.display, self.internal_port, self.external_port, DRI_PATH + ) + # Write display config + o3decmd = f"export DISPLAY={self.display}; data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher" + else: + # Starts xserver, x11vnc and novnc + self.gz_vnc.start_vnc(self.display, self.internal_port, self.external_port) + # Write display config + o3decmd = f"export DISPLAY={self.display}; data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher" + + gzclient_thread = DockerThread(o3decmd) + gzclient_thread.start() + self.threads.append(gzclient_thread) + + process_name = "data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher" + wait_for_process_to_start(process_name, timeout=360) + def terminate(self): + self.gz_vnc.terminate() if self.threads is not None: for thread in self.threads: if thread.is_alive(): From 392e9bb1bc0b2c60f7ad4cb24f197ac7842254e3 Mon Sep 17 00:00:00 2001 From: Javier Izquierdo Hernandez Date: Mon, 20 Oct 2025 15:29:23 +0200 Subject: [PATCH 3/7] Update vnc --- manager/manager/launcher/launcher_o3de.py | 9 ++------- manager/manager/launcher/launcher_o3de_api.py | 5 +++++ manager/manager/launcher/launcher_tools.py | 5 ----- manager/manager/launcher/launcher_world.py | 5 +++++ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manager/manager/launcher/launcher_o3de.py b/manager/manager/launcher/launcher_o3de.py index a01a0ff..b8ef551 100644 --- a/manager/manager/launcher/launcher_o3de.py +++ b/manager/manager/launcher/launcher_o3de.py @@ -14,11 +14,6 @@ from manager.ram_logging.log_manager import LogManager class LauncherO3de(ILauncher): - display: str - internal_port: int - external_port: int - height: int - width: int running: bool = False threads: List[Any] = [] acceptsMsgs: bool = False @@ -26,8 +21,8 @@ class LauncherO3de(ILauncher): def run(self, config_file, callback): - process_name = "gz sim" - wait_for_process_to_start(process_name, timeout=60) + # process_name = "gz sim" + # wait_for_process_to_start(process_name, timeout=60) self.running = True diff --git a/manager/manager/launcher/launcher_o3de_api.py b/manager/manager/launcher/launcher_o3de_api.py index 0f89cce..25e7936 100644 --- a/manager/manager/launcher/launcher_o3de_api.py +++ b/manager/manager/launcher/launcher_o3de_api.py @@ -17,6 +17,11 @@ class LauncherO3deApi(ILauncher): + display: str + internal_port: int + external_port: int + height: int + width: int type: str module: str launch_file: str diff --git a/manager/manager/launcher/launcher_tools.py b/manager/manager/launcher/launcher_tools.py index 125904a..fee2eb5 100644 --- a/manager/manager/launcher/launcher_tools.py +++ b/manager/manager/launcher/launcher_tools.py @@ -34,12 +34,7 @@ }, "o3de": { "type": "module", - "width": 1024, - "height": 768, "module": "o3de", - "display": ":2", - "external_port": 6080, - "internal_port": 5900, }, "rviz": { "module": "rviz", diff --git a/manager/manager/launcher/launcher_world.py b/manager/manager/launcher/launcher_world.py index 7f6ba6d..d9ba862 100644 --- a/manager/manager/launcher/launcher_world.py +++ b/manager/manager/launcher/launcher_world.py @@ -29,6 +29,11 @@ "o3de": { "2": [ { + "width": 1024, + "height": 768, + "display": ":2", + "external_port": 6080, + "internal_port": 5900, "type": "o3de", "module": "o3de_api", "parameters": [], From 4fd12f208884d48d52459c04baec11454bcf1916 Mon Sep 17 00:00:00 2001 From: Javier Izquierdo Hernandez Date: Mon, 20 Oct 2025 15:58:36 +0200 Subject: [PATCH 4/7] Update terminal port --- manager/manager/launcher/launcher_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/manager/launcher/launcher_tools.py b/manager/manager/launcher/launcher_tools.py index fee2eb5..b7dbf21 100644 --- a/manager/manager/launcher/launcher_tools.py +++ b/manager/manager/launcher/launcher_tools.py @@ -11,7 +11,7 @@ "console": { "module": "console", "display": ":1", - "external_port": 1108, + "external_port": 6082, "internal_port": 5901, }, "gazebo": { From 38bbf3fa5a9603bbd582760858f28d6c936b83a9 Mon Sep 17 00:00:00 2001 From: David Rodriguez Rives - The Pirate Cat <63803821+miniesda@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:03:33 +0200 Subject: [PATCH 5/7] Add forceAdapter option to GameLauncher command --- manager/manager/launcher/launcher_o3de_api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manager/manager/launcher/launcher_o3de_api.py b/manager/manager/launcher/launcher_o3de_api.py index 25e7936..115b9b3 100644 --- a/manager/manager/launcher/launcher_o3de_api.py +++ b/manager/manager/launcher/launcher_o3de_api.py @@ -45,18 +45,18 @@ def run(self, callback): self.display, self.internal_port, self.external_port, DRI_PATH ) # Write display config - o3decmd = f"export DISPLAY={self.display}; data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher" + o3decmd = f'export DISPLAY={self.display}; data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher --forceAdapter="NVIDIA"' else: # Starts xserver, x11vnc and novnc self.gz_vnc.start_vnc(self.display, self.internal_port, self.external_port) # Write display config - o3decmd = f"export DISPLAY={self.display}; data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher" + o3decmd = f'export DISPLAY={self.display}; data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher --forceAdapter="NVIDIA"' gzclient_thread = DockerThread(o3decmd) gzclient_thread.start() self.threads.append(gzclient_thread) - process_name = "data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher" + process_name = 'data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher --forceAdapter="NVIDIA"' wait_for_process_to_start(process_name, timeout=360) def terminate(self): From 3be5c3d3f410b6864bfb5382ed270406bc39b327 Mon Sep 17 00:00:00 2001 From: David Rodriguez Rives - The Pirate Cat <63803821+miniesda@users.noreply.github.com> Date: Tue, 28 Oct 2025 16:27:47 +0100 Subject: [PATCH 6/7] Update launcher_o3de.py --- manager/manager/launcher/launcher_o3de.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/manager/launcher/launcher_o3de.py b/manager/manager/launcher/launcher_o3de.py index b8ef551..f633dc0 100644 --- a/manager/manager/launcher/launcher_o3de.py +++ b/manager/manager/launcher/launcher_o3de.py @@ -42,11 +42,11 @@ def died(self): pass def pause(self): - #TODO: add pause + self.running = False pass def unpause(self): - #TODO: add resume + self.running = True pass def reset(self): From 023ff7cc2800a7e2cd951eaf77d9d6e707d06a9b Mon Sep 17 00:00:00 2001 From: David Rodriguez Rives - The Pirate Cat <63803821+miniesda@users.noreply.github.com> Date: Thu, 30 Oct 2025 00:59:33 +0100 Subject: [PATCH 7/7] Update level selection in launcher --- manager/manager/launcher/launcher_o3de_api.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/manager/manager/launcher/launcher_o3de_api.py b/manager/manager/launcher/launcher_o3de_api.py index 115b9b3..b5c8697 100644 --- a/manager/manager/launcher/launcher_o3de_api.py +++ b/manager/manager/launcher/launcher_o3de_api.py @@ -15,7 +15,6 @@ import logging - class LauncherO3deApi(ILauncher): display: str internal_port: int @@ -38,7 +37,13 @@ def run(self, callback): xserver_thread = DockerThread(xserver_cmd) xserver_thread.start() self.threads.append(xserver_thread) - + + LevelSelect=f'echo "LoadLevel Levels/{self.launch_file}" > data/workspace/ROS2Demo/autoexec.cfg' + + LevelSelect_thread = DockerThread(LevelSelect) + LevelSelect_thread.start() + self.threads.append(LevelSelect_thread) + if ACCELERATION_ENABLED: # Starts xserver, x11vnc and novnc self.gz_vnc.start_vnc_gpu( @@ -56,7 +61,7 @@ def run(self, callback): gzclient_thread.start() self.threads.append(gzclient_thread) - process_name = 'data/workspace/ROS2Demo/build/linux/bin/profile/ROS2Demo.GameLauncher --forceAdapter="NVIDIA"' + process_name = 'ROS2Demo.GameLauncher' wait_for_process_to_start(process_name, timeout=360) def terminate(self): @@ -69,7 +74,7 @@ def terminate(self): self.threads.remove(thread) # TODO: processes to kill - to_kill = ["launch.py"] + to_kill = ["ROS2Demo.GameLauncher"] kill_cmd = "pkill -9 -f " for i in to_kill: