1- """Launcher for Gazebo View""" ""
2- import time
31from src .manager .manager .launcher .launcher_interface import ILauncher
42from src .manager .manager .docker_thread .docker_thread import DockerThread
5-
3+ from src .manager .manager .vnc .vnc_server import Vnc_server
4+ import time
5+ import os
6+ import stat
67
78
89class LauncherGazeboView (ILauncher ):
9- """Launcher for Gazebo View"""
10+ exercise_id : str
1011 display : str
1112 internal_port : str
1213 external_port : str
@@ -16,35 +17,43 @@ class LauncherGazeboView(ILauncher):
1617 threads = []
1718
1819 def run (self , callback ):
19- xserver_cmd = f"/usr/bin/Xorg -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xdummy.log -config ./xorg.conf { self .display } "
20- xserver_thread = DockerThread (xserver_cmd )
21- xserver_thread .start ()
22- self .threads .append (xserver_thread )
23- time .sleep (0.1 )
24- # Start VNC server without password, forever running in background
25- x11vnc_cmd = f"x11vnc -display { self .display } -nopw -forever -xkb -bg -rfbport { self .internal_port } "
26- x11vnc_thread = DockerThread (x11vnc_cmd )
27- x11vnc_thread .start ()
28- self .threads .append (x11vnc_thread )
29-
30- # Start noVNC with default port 6080 listening to VNC server on 5900
31- novnc_cmd = f"/noVNC/utils/launch.sh --listen { self .external_port } --vnc localhost:{ self .internal_port } "
32- novnc_thread = DockerThread (novnc_cmd )
33- novnc_thread .start ()
34- self .threads .append (novnc_thread )
20+ DRI_PATH = os .path .join (
21+ "/dev/dri" , os .environ .get ("DRI_NAME" , "card0" ))
22+ ACCELERATION_ENABLED = self .check_device (DRI_PATH )
3523
3624 # Configure browser screen width and height for gzclient
3725 gzclient_config_cmds = f"echo [geometry] > ~/.gazebo/gui.ini; echo x=0 >> ~/.gazebo/gui.ini; echo y=0 >> ~/.gazebo/gui.ini; echo width={ self .width } >> ~/.gazebo/gui.ini; echo height={ self .height } >> ~/.gazebo/gui.ini;"
38- time .sleep (0.1 )
39- # Write display config and start gzclient
40- gzclient_cmd = (
41- f"export DISPLAY=:0; { gzclient_config_cmds } gzclient --verbose" )
26+ gz_vnc = Vnc_server ()
27+
28+ if ACCELERATION_ENABLED :
29+ gz_vnc .start_vnc_gpu (self .display , self .internal_port , self .external_port , DRI_PATH )
30+ # Write display config and start gzclient
31+ gzclient_cmd = (
32+ f"export DISPLAY=:0; { gzclient_config_cmds } export VGL_DISPLAY={ DRI_PATH } ; vglrun gzclient --verbose" )
33+ else :
34+ gz_vnc .start_vnc (self .display , self .internal_port , self .external_port )
35+ # Write display config and start gzclient
36+ gzclient_cmd = (
37+ f"export DISPLAY=:0; { gzclient_config_cmds } gzclient --verbose" )
38+
39+ # wait for vnc and gazebo servers to load properly
40+ if (self .exercise_id == "follow_person_newmanager" ):
41+ time .sleep (6 )
42+ else :
43+ time .sleep (0.1 )
44+
4245 gzclient_thread = DockerThread (gzclient_cmd )
4346 gzclient_thread .start ()
4447 self .threads .append (gzclient_thread )
4548
4649 self .running = True
4750
51+ def check_device (self , device_path ):
52+ try :
53+ return stat .S_ISCHR (os .lstat (device_path )[stat .ST_MODE ])
54+ except :
55+ return False
56+
4857 def is_running (self ):
4958 return self .running
5059
@@ -55,4 +64,4 @@ def terminate(self):
5564 self .running = False
5665
5766 def died (self ):
58- pass
67+ pass
0 commit comments