Skip to content

Commit 297d36d

Browse files
committed
Adding neutral tools
1 parent 69932b0 commit 297d36d

7 files changed

Lines changed: 317 additions & 321 deletions

File tree

manager/manager/launcher/launcher_console.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class LauncherConsole(ILauncher):
1212
internal_port: int
1313
external_port: int
1414
running: bool = False
15+
acceptsMsgs: bool = False
1516
threads: List[Any] = []
1617
console_vnc: Any = Vnc_server()
1718

@@ -38,6 +39,15 @@ def run(self, config_file, callback):
3839

3940
self.running = True
4041

42+
def pause(self):
43+
pass
44+
45+
def unpause(self):
46+
pass
47+
48+
def reset(self):
49+
pass
50+
4151
def is_running(self):
4252
return self.running
4353

manager/manager/launcher/launcher_gazebo_view.py renamed to manager/manager/launcher/launcher_gazebo.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from manager.manager.launcher.launcher_interface import ILauncher
23
from manager.manager.docker_thread.docker_thread import DockerThread
34
from manager.manager.vnc.vnc_server import Vnc_server
@@ -11,14 +12,25 @@
1112
import stat
1213
from typing import List, Any
1314

15+
def call_service(self, service, service_type, request_data="{}"):
16+
command = f"ros2 service call {service} {service_type} '{request_data}'"
17+
subprocess.call(
18+
f"{command}",
19+
shell=True,
20+
stdout=sys.stdout,
21+
stderr=subprocess.STDOUT,
22+
bufsize=1024,
23+
universal_newlines=True,
24+
)
1425

15-
class LauncherGazeboView(ILauncher):
26+
class LauncherGazebo(ILauncher):
1627
display: str
1728
internal_port: int
1829
external_port: int
1930
height: int
2031
width: int
2132
running: bool = False
33+
acceptsMsgs: bool = False
2234
threads: List[Any] = []
2335
gz_vnc: Any = Vnc_server()
2436

@@ -51,6 +63,15 @@ def run(self, config_file, callback):
5163

5264
self.running = True
5365

66+
def pause(self):
67+
call_service("/pause_physics", "std_srvs/srv/Empty")
68+
69+
def unpause(self):
70+
call_service("/unpause_physics", "std_srvs/srv/Empty")
71+
72+
def reset(self):
73+
call_service("/reset_world", "std_srvs/srv/Empty")
74+
5475
def is_running(self):
5576
return self.running
5677

manager/manager/launcher/launcher_gzsim_view.py renamed to manager/manager/launcher/launcher_gzsim.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from manager.manager.launcher.launcher_interface import ILauncher
23
from manager.manager.docker_thread.docker_thread import DockerThread
34
from manager.manager.vnc.vnc_server import Vnc_server
@@ -10,9 +11,44 @@
1011
import os
1112
import stat
1213
from typing import List, Any
14+
from manager.ram_logging.log_manager import LogManager
1315

16+
def call_gzservice(self, service, reqtype, reptype, timeout, req):
17+
command = f"gz service -s {service} --reqtype {reqtype} --reptype {reptype} --timeout {timeout} --req '{req}'"
18+
subprocess.call(
19+
f"{command}",
20+
shell=True,
21+
stdout=sys.stdout,
22+
stderr=subprocess.STDOUT,
23+
bufsize=1024,
24+
universal_newlines=True,
25+
)
1426

15-
class LauncherGzsimView(ILauncher):
27+
def call_service(self, service, service_type, request_data="{}"):
28+
command = f"ros2 service call {service} {service_type} '{request_data}'"
29+
subprocess.call(
30+
f"{command}",
31+
shell=True,
32+
stdout=sys.stdout,
33+
stderr=subprocess.STDOUT,
34+
bufsize=1024,
35+
universal_newlines=True,
36+
)
37+
38+
def is_ros_service_available(self, service_name):
39+
try:
40+
result = subprocess.run(
41+
["ros2", "service", "list", "--include-hidden-services"],
42+
capture_output=True,
43+
text=True,
44+
check=True,
45+
)
46+
return service_name in result.stdout
47+
except subprocess.CalledProcessError as e:
48+
LogManager.logger.exception(f"Error checking service availability: {e}")
49+
return False
50+
51+
class LauncherGzsim(ILauncher):
1652
display: str
1753
internal_port: int
1854
external_port: int
@@ -73,6 +109,41 @@ def terminate(self):
73109
def died(self):
74110
pass
75111

112+
def pause(self):
113+
call_gzservice(
114+
"$(gz service -l | grep '^/world/\w*/control$')",
115+
"gz.msgs.WorldControl",
116+
"gz.msgs.Boolean",
117+
"3000",
118+
"pause: true",
119+
)
120+
121+
def unpause(self):
122+
call_gzservice(
123+
"$(gz service -l | grep '^/world/\w*/control$')",
124+
"gz.msgs.WorldControl",
125+
"gz.msgs.Boolean",
126+
"3000",
127+
"pause: false",
128+
)
129+
130+
def reset(self):
131+
if is_ros_service_available("/drone0/platform/state_machine/_reset"):
132+
call_service(
133+
"/drone0/platform/state_machine/_reset",
134+
"std_srvs/srv/Trigger",
135+
"{}",
136+
)
137+
call_gzservice(
138+
"$(gz service -l | grep '^/world/\w*/control$')",
139+
"gz.msgs.WorldControl",
140+
"gz.msgs.Boolean",
141+
"3000",
142+
"reset: {all: true}",
143+
)
144+
if is_ros_service_available("/drone0/controller/_reset"):
145+
call_service("/drone0/controller/_reset", "std_srvs/srv/Trigger", "{}")
146+
76147
def get_dri_path(self):
77148
directory_path = "/dev/dri"
78149
dri_path = ""
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from manager.libs.applications.compatibility.server import Server
2+
from manager.ram_logging.log_manager import LogManager
3+
from manager.comms.new_consumer import ManagerConsumer
4+
from typing import Optional
5+
from manager.libs.applications.compatibility.file_watchdog import FileWatchdog
6+
7+
8+
class LauncherStateMonitor:
9+
file: str
10+
consumer: ManagerConsumer
11+
running: bool = False
12+
acceptsMsgs: bool = True
13+
14+
def __init__(self, type, module, file, consumer):
15+
self.file = file
16+
self.consumer = consumer
17+
self.server = FileWatchdog("/tmp/tree_state", self.update)
18+
19+
def update(self, data):
20+
LogManager.logger.debug(f"Sending update to client")
21+
if self.consumer is not None:
22+
self.consumer.send_message({"update": data}, command="update")
23+
24+
def run(self, config_file, callback):
25+
self.server.start()
26+
self.running = True
27+
28+
def get_msg(self, data):
29+
self.server.send(data)
30+
31+
def is_running(self):
32+
return self.running
33+
34+
def terminate(self):
35+
self.server.stop()
36+
self.running = False
37+
38+
def pause(self):
39+
pass
40+
41+
def unpause(self):
42+
pass
43+
44+
def reset(self):
45+
pass
46+
47+
def died(self):
48+
pass
49+
50+
def from_config(cls, config):
51+
obj = cls(**config)
52+
return obj

0 commit comments

Comments
 (0)