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/2] 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/2] 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():