3131from ros_compatibility .qos import QoSProfile , DurabilityPolicy
3232
3333from carla_msgs .msg import CarlaWorldInfo
34- from carla_waypoint_types .srv import GetWaypoint , GetActorWaypoint
35- from geometry_msgs .msg import PoseStamped
36- from nav_msgs .msg import Path
34+ from carla_waypoint_types .srv import ComputeRoute , GetWaypoint , GetActorWaypoint
35+
36+ from agents .navigation .global_route_planner import GlobalRoutePlanner
37+ from agents .navigation .global_route_planner_dao import GlobalRoutePlannerDAO
3738
3839
3940class CarlaToRosWaypointConverter (CompatibleNode ):
@@ -73,6 +74,12 @@ def __init__(self):
7374 '/carla_waypoint_publisher/{}/get_actor_waypoint' .format (self .role_name ),
7475 self .get_actor_waypoint )
7576
77+ self .compute_route_service = self .new_service (
78+ ComputeRoute ,
79+ '/carla_waypoint_publisher/compute_route' ,
80+ self .compute_route
81+ )
82+
7683 # set initial goal
7784 self .goal = self .world .get_map ().get_spawn_points ()[0 ]
7885
@@ -83,10 +90,6 @@ def __init__(self):
8390 self .on_goal ,
8491 qos_profile = 10 )
8592
86- # use callback to wait for ego vehicle
87- self .loginfo ("Waiting for ego vehicle..." )
88- self .on_tick = self .world .on_tick (self .find_ego_vehicle_actor )
89-
9093 def destroy (self ):
9194 """
9295 Destructor
@@ -133,6 +136,32 @@ def get_actor_waypoint(self, req, response=None):
133136 self .logwarn ("get_actor_waypoint(): Actor {} not valid." .format (req .id ))
134137 return response
135138
139+ def compute_route (self , req ):
140+ map_ = self .world .get_map ()
141+
142+ dao = GlobalRoutePlannerDAO (map_ , sampling_resolution = 1 )
143+ grp = GlobalRoutePlanner (dao )
144+ grp .setup ()
145+
146+ path , previous_waypoint = [], None
147+ for location in req .locations :
148+ waypoint = map_ .get_waypoint (trans .ros_point_to_carla_location (location ))
149+ if previous_waypoint :
150+ route_segment = grp .trace_route (previous_waypoint .transform .location , waypoint .transform .location )
151+ path .extend (route_segment )
152+
153+ previous_waypoint = waypoint
154+
155+ response = get_service_response (ComputeRoute )
156+ response .route .header .frame_id = "map"
157+ response .route .header .stamp = ros_timestamp (self .get_time (), from_sec = True )
158+ for wp in path :
159+ pose = PoseStamped ()
160+ pose .pose = trans .carla_transform_to_ros_pose (wp [0 ].transform )
161+ response .route .poses .append (pose )
162+
163+ return response
164+
136165 def on_goal (self , goal ):
137166 """
138167 Callback for /move_base_simple/goal
0 commit comments