Skip to content

Commit ec82fdf

Browse files
committed
Update to leaderboard 2
1 parent e9063d9 commit ec82fdf

File tree

12 files changed

+114
-52
lines changed

12 files changed

+114
-52
lines changed

carla_ad_agent/launch/carla_ad_agent.launch

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010
<arg name="Kd_longitudinal" default="0.515"/>
1111
<arg name="control_time_step" default="0.05"/>
1212

13-
<node pkg="carla_ad_agent" type="ad_agent.py" name="carla_ad_agent_$(arg role_name)" output="screen">
14-
<param name="role_name" value="$(arg role_name)" />
15-
<param name="avoid_risk" value="$(arg avoid_risk)" />
16-
</node>
17-
1813
<node pkg="carla_ad_agent" type="local_planner.py" name="local_planner_$(arg role_name)" output="screen">
1914
<param name="role_name" value="$(arg role_name)" />
2015
<param name="Kp_lateral" value="$(arg Kp_lateral)" />
@@ -25,5 +20,12 @@
2520
<param name="Kd_longitudinal" value="$(arg Kd_longitudinal)" />
2621
<param name="control_time_step" value="$(arg control_time_step)" />
2722
</node>
23+
24+
<node pkg="carla_ad_agent" type="ad_agent.py" name="carla_ad_agent_$(arg role_name)" output="screen">
25+
<param name="role_name" value="$(arg role_name)" />
26+
<param name="avoid_risk" value="$(arg avoid_risk)" />
27+
</node>
28+
29+
2830
</launch>
2931

carla_ad_agent/src/carla_ad_agent/ad_agent.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def __init__(self):
5050
self._objects = {}
5151
self._lights_status = {}
5252
self._lights_info = {}
53-
self._target_speed = 0.
53+
self._target_speed = 8.33
5454

5555
self.speed_command_publisher = self.new_publisher(
5656
Float64, "/carla/{}/speed_command".format(role_name),

carla_ad_agent/src/carla_ad_agent/local_planner.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from carla_ad_agent.misc import distance_vehicle
2323

2424
from carla_msgs.msg import CarlaEgoVehicleControl # pylint: disable=import-error
25+
from carla_waypoint_types.srv import ComputeRoute
2526
from nav_msgs.msg import Odometry, Path
2627
from std_msgs.msg import Float64
2728
from visualization_msgs.msg import Marker
@@ -67,6 +68,10 @@ def __init__(self):
6768
self._waypoints_queue = collections.deque(maxlen=20000)
6869
self._waypoint_buffer = collections.deque(maxlen=self._buffer_size)
6970

71+
self._compute_route_client = self.create_service_client(
72+
'/carla_waypoint_publisher/compute_route',
73+
ComputeRoute)
74+
7075
# subscribers
7176
self._odometry_subscriber = self.new_subscription(
7277
Odometry,
@@ -115,6 +120,17 @@ def path_cb(self, path_msg):
115120
self._waypoints_queue.clear()
116121
self._waypoints_queue.extend([pose.pose for pose in path_msg.poses])
117122

123+
def plan_cb(self, path_msg):
124+
request = get_service_request(ComputeRoute)
125+
request.locations = [pose.pose.position for pose in path_msg.poses]
126+
response = self.call_service(self._compute_route_client, request)
127+
with self.data_lock:
128+
self._waypoint_buffer.clear()
129+
self._waypoints_queue.clear()
130+
self._waypoints_queue.extend([pose.pose for pose in response.route.poses])
131+
132+
self._plan_publisher.publish(response.route)
133+
118134
def pose_to_marker_msg(self, pose):
119135
marker_msg = Marker()
120136
marker_msg.type = 0
@@ -158,6 +174,7 @@ def run_step(self):
158174
# move using PID controllers
159175
control_msg = self._vehicle_controller.run_step(
160176
self._target_speed, self._current_speed, self._current_pose, target_pose)
177+
control_msg.header.stamp = ros_timestamp(self.get_time(), from_sec=True)
161178

162179
# purge the queue of obsolete waypoints
163180
max_index = -1
@@ -176,6 +193,7 @@ def run_step(self):
176193

177194
def emergency_stop(self):
178195
control_msg = CarlaEgoVehicleControl()
196+
control_msg.header.stamp = ros_timestamp(self.get_time(), from_sec=True)
179197
control_msg.steer = 0.0
180198
control_msg.throttle = 0.0
181199
control_msg.brake = 1.0

carla_ros_bridge/src/carla_ros_bridge/actor_factory.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ def _update_thread(self):
9292
"""
9393
while not self.node.shutdown.is_set():
9494
time.sleep(ActorFactory.TIME_BETWEEN_UPDATES)
95-
self.world.wait_for_tick()
95+
try:
96+
self.world.wait_for_tick(seconds=5)
97+
except Exception as e:
98+
self.node.logwarn(str(e))
9699
self.update_available_objects()
97100

98101
def update_available_objects(self):
@@ -140,6 +143,9 @@ def update_actor_states(self, frame_id, timestamp):
140143
with self.lock:
141144
for actor_id in self.actors:
142145
try:
146+
actor = self.actors[actor_id]
147+
if isinstance(actor, Sensor):
148+
self.node.loginfo(actor.__class__.__name__)
143149
self.actors[actor_id].update(frame_id, timestamp)
144150
except RuntimeError as e:
145151
self.node.logwarn("Update actor {}({}) failed: {}".format(

carla_ros_bridge/src/carla_ros_bridge/bridge.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,9 @@ def initialize_bridge(self, carla_world, params):
156156
self.get_blueprints_service = self.new_service(GetBlueprints, "/carla/get_blueprints",
157157
self.get_blueprints, callback_group=self.callback_group)
158158

159-
self.carla_weather_subscriber = \
160-
self.new_subscription(CarlaWeatherParameters, "/carla/weather_control",
161-
self.on_weather_changed, qos_profile=10, callback_group=self.callback_group)
159+
#self.carla_weather_subscriber = \
160+
# self.new_subscription(CarlaWeatherParameters, "/carla/weather_control",
161+
# self.on_weather_changed, qos_profile=10, callback_group=self.callback_group)
162162

163163
def spawn_object(self, req, response=None):
164164
response = roscomp.get_service_response(SpawnObject)
@@ -358,7 +358,7 @@ def destroy(self):
358358
self.status_publisher.destroy()
359359
self.destroy_service(self.spawn_object_service)
360360
self.destroy_service(self.destroy_object_service)
361-
self.destroy_subscription(self.carla_weather_subscriber)
361+
#self.destroy_subscription(self.carla_weather_subscriber)
362362
self.carla_control_queue.put(CarlaControl.STEP_ONCE)
363363

364364
for uid in self._registered_actors:
@@ -411,19 +411,6 @@ def main(args=None):
411411
port=parameters['port'])
412412
carla_client.set_timeout(parameters['timeout'])
413413

414-
# check carla version
415-
dist = pkg_resources.get_distribution("carla")
416-
if LooseVersion(dist.version) != LooseVersion(CarlaRosBridge.CARLA_VERSION):
417-
carla_bridge.logfatal("CARLA python module version {} required. Found: {}".format(
418-
CarlaRosBridge.CARLA_VERSION, dist.version))
419-
sys.exit(1)
420-
421-
if LooseVersion(carla_client.get_server_version()) != \
422-
LooseVersion(carla_client.get_client_version()):
423-
carla_bridge.logwarn(
424-
"Version mismatch detected: You are trying to connect to a simulator that might be incompatible with this API. Client API version: {}. Simulator API version: {}"
425-
.format(carla_client.get_client_version(),
426-
carla_client.get_server_version()))
427414

428415
carla_world = carla_client.get_world()
429416

carla_ros_bridge/src/carla_ros_bridge/imu.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
Classes to handle Carla imu sensor
88
"""
99

10-
from transforms3d.euler import euler2quat
10+
import math
1111

12+
from sensor_msgs.msg import Imu
13+
14+
from carla_ros_bridge.sensor import Sensor
15+
from transforms3d.euler import euler2quat, quat2euler
1216
import carla_common.transforms as trans
1317

1418
from carla_ros_bridge.sensor import Sensor
@@ -69,7 +73,7 @@ def sensor_data_updated(self, carla_imu_measurement):
6973

7074
# Carla uses a left-handed coordinate convention (X forward, Y right, Z up).
7175
# Here, these measurements are converted to the right-handed ROS convention
72-
# (X forward, Y left, Z up).
76+
# (X forward, Y left, Z up).
7377
imu_msg.angular_velocity.x = -carla_imu_measurement.gyroscope.x
7478
imu_msg.angular_velocity.y = carla_imu_measurement.gyroscope.y
7579
imu_msg.angular_velocity.z = -carla_imu_measurement.gyroscope.z
@@ -78,11 +82,17 @@ def sensor_data_updated(self, carla_imu_measurement):
7882
imu_msg.linear_acceleration.y = -carla_imu_measurement.accelerometer.y
7983
imu_msg.linear_acceleration.z = carla_imu_measurement.accelerometer.z
8084

81-
roll, pitch, yaw = trans.carla_rotation_to_RPY(carla_imu_measurement.transform.rotation)
82-
quat = euler2quat(roll, pitch, yaw)
85+
quat = euler2quat(math.sin(-carla_imu_measurement.compass), math.cos(-carla_imu_measurement.compass), 0.0)
8386
imu_msg.orientation.w = quat[0]
8487
imu_msg.orientation.x = quat[1]
8588
imu_msg.orientation.y = quat[2]
8689
imu_msg.orientation.z = quat[3]
8790

91+
roll, pitch, yaw = quat2euler([
92+
imu_msg.orientation.w,
93+
imu_msg.orientation.x,
94+
imu_msg.orientation.y,
95+
imu_msg.orientation.z])
96+
compass = -math.atan2(roll, pitch) + 2*math.pi
97+
8898
self.imu_publisher.publish(imu_msg)

carla_ros_bridge/src/carla_ros_bridge/sensor.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,20 +107,16 @@ def __init__(self, # pylint: disable=too-many-arguments
107107
self._tf_broadcaster = tf2_ros.TransformBroadcaster(node)
108108

109109
def get_ros_transform(self, pose, timestamp):
110-
if self.synchronous_mode:
111-
if not self.relative_spawn_pose:
112-
self.node.logwarn("{}: No relative spawn pose defined".format(self.get_prefix()))
113-
return
114-
pose = self.relative_spawn_pose
115-
child_frame_id = self.get_prefix()
116-
if self.parent is not None:
117-
frame_id = self.parent.get_prefix()
118-
else:
119-
frame_id = "map"
120-
110+
if not self.relative_spawn_pose:
111+
self.node.logwarn("{}: No relative spawn pose defined".format(self.get_prefix()))
112+
return
113+
pose = self.relative_spawn_pose
114+
child_frame_id = self.get_prefix()
115+
if self.parent is not None:
116+
frame_id = self.parent.get_prefix()
121117
else:
122-
child_frame_id = self.get_prefix()
123118
frame_id = "map"
119+
self.node.loginfo("Haciendo relative tf: {}, {}".format(child_frame_id, frame_id))
124120

125121
transform = tf2_ros.TransformStamped()
126122
transform.header.stamp = roscomp.ros_timestamp(sec=timestamp, from_sec=True)

carla_ros_bridge/src/carla_ros_bridge/speedometer_sensor.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from carla_ros_bridge.pseudo_actor import PseudoActor
1515

16-
from std_msgs.msg import Float32
16+
from carla_msgs.msg import CarlaSpeedometer
1717

1818

1919
class SpeedometerSensor(PseudoActor):
@@ -41,7 +41,7 @@ def __init__(self, uid, name, parent, node):
4141
parent=parent,
4242
node=node)
4343

44-
self.speedometer_publisher = node.new_publisher(Float32,
44+
self.speedometer_publisher = node.new_publisher(CarlaSpeedometer,
4545
self.get_topic_prefix(),
4646
qos_profile=10)
4747

@@ -79,5 +79,9 @@ def update(self, frame, timestamp):
7979
np.sin(pitch)
8080
])
8181
speed = np.dot(vel_np, orientation)
82+
83+
speed_msg = CarlaSpeedometer()
84+
speed_msg.header = self.get_msg_header(timestamp=timestamp)
85+
speed_msg.speed = speed
8286

83-
self.speedometer_publisher.publish(Float32(data=speed))
87+
self.speedometer_publisher.publish(speed_msg)

carla_waypoint_publisher/src/carla_waypoint_publisher/carla_waypoint_publisher.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@
3131
from ros_compatibility.qos import QoSProfile, DurabilityPolicy
3232

3333
from 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

3940
class 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

Comments
 (0)