Skip to content

Commit 20bb3be

Browse files
Merge pull request #109 from Intelligent-Testing-Lab/108-migrate-autoware_carla_interface-into-cawsr
108 migrate autoware carla interface into cawsr
2 parents b4213c2 + c05aca5 commit 20bb3be

10 files changed

Lines changed: 1062 additions & 12 deletions

File tree

cawsr.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,7 @@
6262

6363

6464
class AWScenarioRunner(object):
65-
# global class instances
66-
67-
aw_agent = None
65+
aw_agent = None # autoware agent
6866

6967
def __init__(self, cawsr_config: dict, carla_conf: CARLA) -> None:
7068
"""
@@ -147,6 +145,7 @@ def run_scenario(
147145
self.carla_client.load_world(env_config.town)
148146

149147
logger.info("Updating world settings:")
148+
150149
# tick asynchronously until then
151150
settings = self.carla_world.get_settings()
152151
settings.synchronous_mode = True
@@ -160,8 +159,9 @@ def run_scenario(
160159

161160
logger.info("Spawning ego...")
162161
ego = EgoVehicle(env_config)
163-
self.ego_vehicles.append(ego.spawn())
164-
logger.info("Spawned ego...")
162+
actor = ego.spawn()
163+
self.ego_vehicles.append(actor)
164+
logger.info(f"Spawned ego with id: {actor.id}")
165165

166166
self.carla_world.tick() # client must tick to spawn actors
167167

srunner/autoagents/autoware_agent.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@
1414
from srunner.autoagents.autoware_nodes import tick_node
1515

1616
from srunner.autoagents.agent_state import autoware_state
17-
1817
from srunner.scenarioconfigs.environment_configuration import EnvironmentConfig
18+
from srunner.autoagents.autoware_carla_interface.carla_autoware import (
19+
InitializeInterface,
20+
)
1921

2022
import threading
2123
import rclpy
2224
import time
2325
import logging
2426

27+
2528
logger = logging.getLogger("scenario-runner")
2629
logger.propagate = False
2730

@@ -32,7 +35,7 @@ class AutowareAgent(AutonomousAgent):
3235
counter = 0
3336
last_tick = time.perf_counter_ns()
3437

35-
def setup(self, config: EnvironmentConfig | None = None) -> None:
38+
def setup(self, config: EnvironmentConfig) -> None:
3639
"""Setup the Autoware Agent.
3740
- Initialise the state
3841
- Setup nodes
@@ -46,6 +49,8 @@ def setup(self, config: EnvironmentConfig | None = None) -> None:
4649

4750
self.autoware_state = autoware_state.AutowareState("ego_vehicle", None)
4851

52+
self.carla_interface = InitializeInterface(self.config)
53+
4954
self.state_node = state_node.StateNode(self.autoware_state)
5055
self.state_node.reset_autoware(self.config.town, self.config.ego_name)
5156

@@ -57,6 +62,7 @@ def setup(self, config: EnvironmentConfig | None = None) -> None:
5762
self._multi_thread_executor.add_node(self.route_node)
5863
self._multi_thread_executor.add_node(self.state_node)
5964
self._multi_thread_executor.add_node(self.autoware_node)
65+
self._multi_thread_executor.add_node(self.carla_interface.interface.ros2_node) # type:ignore
6066

6167
self._executor_thread = threading.Thread(
6268
target=self._multi_thread_executor.spin, daemon=True
@@ -65,9 +71,12 @@ def setup(self, config: EnvironmentConfig | None = None) -> None:
6571

6672
self.sent_route = False
6773

68-
self.setup_tick_service()
74+
self.carla_interface.load_world()
75+
self.carla_interface.run_bridge()
76+
# self.setup_tick_service()
6977

7078
def setup_tick_service(self):
79+
# no need to setup tick service anymore
7180
self.tick_node = tick_node.TickNode()
7281
self._tick_executor = rclpy.executors.SingleThreadedExecutor()
7382

@@ -157,7 +166,7 @@ def run_step_init(self) -> bool:
157166
if self.autoware_state.route_set() and not self.autoware_state.sent_engage:
158167
return True
159168

160-
self.tick_node.autoware_tick()
169+
self.carla_interface.tick_bridge()
161170
return False
162171

163172
def run_step(self) -> None:
@@ -173,5 +182,4 @@ def run_step(self) -> None:
173182
if self.autoware_state.route_set() and not self.autoware_state.sent_engage:
174183
self.autoware_node.publish_engage(True)
175184

176-
# tick autoware
177-
self.tick_node.autoware_tick()
185+
self.carla_interface.tick_bridge()

srunner/autoagents/autoware_carla_interface/_init__.py

Whitespace-only changes.
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# Copyright 2024 Tier IV, Inc.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.sr/bin/env python
14+
15+
import signal
16+
import time
17+
18+
19+
from srunner.autoagents.autoware_carla_interface.modules.carla_wrapper import (
20+
SensorReceivedNoData,
21+
)
22+
from srunner.autoagents.autoware_carla_interface.modules.carla_wrapper import (
23+
SensorWrapper,
24+
)
25+
from srunner.autoagents.autoware_carla_interface.carla_ros import carla_ros2_interface
26+
from srunner.scenariomanager.carla_data_provider import CarlaDataProvider
27+
from srunner.scenariomanager.timer import GameTime
28+
29+
from srunner.scenarioconfigs.environment_configuration import EnvironmentConfig
30+
31+
32+
class SensorLoop(object):
33+
def __init__(self):
34+
self.start_game_time = None
35+
self.start_system_time = None
36+
self.sensor = None
37+
self.ego_actor = None
38+
self.running = False
39+
self.timestamp_last_run = 0.0
40+
self.timeout = 20.0
41+
42+
def _stop_loop(self):
43+
self.running = False
44+
45+
def _tick_sensor(self, timestamp):
46+
if self.timestamp_last_run < timestamp.elapsed_seconds and self.running:
47+
self.timestamp_last_run = timestamp.elapsed_seconds
48+
try:
49+
ego_action = self.sensor()
50+
except SensorReceivedNoData as e:
51+
raise RuntimeError(e)
52+
self.ego_actor.apply_control(ego_action)
53+
54+
55+
class InitializeInterface(object):
56+
def __init__(self, config: EnvironmentConfig):
57+
self.interface = carla_ros2_interface()
58+
self.param_ = self.interface.get_param()
59+
self.world = None
60+
self.sensor_wrapper = None
61+
self.ego_actor = None
62+
self.prev_tick_wall_time = 0.0
63+
64+
self.config = config
65+
66+
def load_world(self):
67+
self.ego_actor = CarlaDataProvider.get_actor_by_name(self.config.ego_name)
68+
self.interface.ego_actor = self.ego_actor # TODO improve design
69+
self.interface.physics_control = self.ego_actor.get_physics_control()
70+
71+
self.sensor_wrapper = SensorWrapper(self.interface)
72+
self.sensor_wrapper.setup_sensors(self.ego_actor, False)
73+
74+
def run_bridge(self):
75+
self.bridge_loop = SensorLoop()
76+
self.bridge_loop.sensor = self.sensor_wrapper
77+
self.bridge_loop.ego_actor = self.ego_actor
78+
self.bridge_loop.start_system_time = time.time()
79+
self.bridge_loop.start_game_time = GameTime.get_time()
80+
self.bridge_loop.running = True
81+
82+
def tick_bridge(self):
83+
timestamp = None
84+
world = CarlaDataProvider.get_world()
85+
if world:
86+
snapshot = world.get_snapshot()
87+
if snapshot:
88+
timestamp = snapshot.timestamp
89+
if timestamp:
90+
self.prev_tick_wall_time = time.time()
91+
self.bridge_loop._tick_sensor(timestamp)
92+
93+
def _stop_loop(self, sign, frame):
94+
self.bridge_loop._stop_loop()
95+
96+
def _cleanup(self):
97+
self.sensor_wrapper.cleanup()
98+
CarlaDataProvider.cleanup()
99+
if self.ego_actor:
100+
self.ego_actor.destroy()
101+
self.ego_actor = None
102+
103+
if self.interface:
104+
self.interface.shutdown()
105+
self.interface = None
106+
107+
108+
def main():
109+
carla_bridge = InitializeInterface()
110+
carla_bridge.load_world()
111+
signal.signal(signal.SIGINT, carla_bridge._stop_loop)
112+
carla_bridge.run_bridge()
113+
carla_bridge._cleanup()
114+
115+
116+
if __name__ == "__main__":
117+
main()

0 commit comments

Comments
 (0)