Skip to content

Commit ab5996d

Browse files
PabloVDglopezdiestglopezdiest
authored
Create follow trajectory behavior for osc2 (#1149)
* Create follow trajectory modifier and adapt ChangeActorWaypoints for osc2 * Added follow trajectory prototype beahvior * Added control types * Minor improvmenet to velocity control * Moved csv files to examples folder * code cleanup * Removed update_speed * Merge branch 'master' into pablo/osc2_trajectory Co-Authored-By: glopezdiest <[email protected]> Co-Authored-By: glopezdiest <[email protected]>
1 parent fc85c34 commit ab5996d

File tree

15 files changed

+1902
-39
lines changed

15 files changed

+1902
-39
lines changed

srunner/examples/basic.osc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ unit mmph of velocity is SI(m: 1, s: -1, factor: 0.000000278)
2828
unit millimeter_per_hour of velocity is SI(m: 1, s: -1, factor: 0.000000278)
2929
# end::library-physical-velocity[]
3030

31+
# tag::library-physical-angle[]
32+
type angle is SI(rad: 1)
33+
unit degree of angle is SI(rad: 1, factor: 57.295779513)
34+
unit deg of angle is SI(rad: 1, factor: 57.295779513)
35+
unit radian of angle is SI(rad: 1, factor: 1)
36+
unit rad of angle is SI(rad: 1, factor: 1)
37+
# end::library-physical-angle[]
38+
3139
actor dut
3240
actor Path
3341
modifier Path.set_map
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import basic.osc
2+
3+
scenario top:
4+
path: Path # A path in the map
5+
path.set_map("Town10HD_Opt") # Map to employ
6+
path.path_min_driving_lanes(2) # Path should have at least two lanes
7+
8+
ego_vehicle: Model3 # Ego car
9+
npc1: Rubicon # Another car
10+
npc2: Rubicon # Anotherother car
11+
12+
do parallel(duration: 18s): # Execute the following lines in parallel
13+
14+
ego_vehicle.drive(path) with:
15+
follow_trajectory(input_file: "srunner/examples/resources/ego_logs.csv", control:"physics")
16+
17+
npc1.drive(path) with:
18+
follow_trajectory(input_file: "srunner/examples/resources/npc1_logs.csv", control:"physics")
19+
20+
npc2.drive(path) with:
21+
follow_trajectory(input_file: "srunner/examples/resources/npc2_logs.csv", control:"physics")

srunner/examples/resources/ego_logs.csv

Lines changed: 631 additions & 0 deletions
Large diffs are not rendered by default.

srunner/examples/resources/npc1_logs.csv

Lines changed: 417 additions & 0 deletions
Large diffs are not rendered by default.

srunner/examples/resources/npc2_logs.csv

Lines changed: 498 additions & 0 deletions
Large diffs are not rendered by default.

srunner/osc2_stdlib/modifier.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,29 @@ def __init__(self, actor_name: str, name: str) -> None:
156156

157157
def get_accelerate(self):
158158
return self.args["acceleration"]
159+
160+
161+
class FollowTrajectoryModifier(Modifier):
162+
def __init__(self, actor_name: str, name: str) -> None:
163+
super().__init__(actor_name, name)
164+
165+
def get_points(self):
166+
if self.args.get("points"):
167+
return self.args.get("points")
168+
else:
169+
return None
170+
171+
def get_times(self):
172+
if self.args.get("times"):
173+
return self.args.get("times")
174+
else:
175+
return None
176+
177+
def get_control(self):
178+
if self.args.get("control"):
179+
return self.args.get("control")
180+
else:
181+
return None
182+
183+
def get_trigger_point(self) -> str:
184+
return self.args.get("at", "all")

srunner/osc2_stdlib/path.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ def path_explicit(cls, start_point, end_point, tolerance):
105105
start_point = start_point.split(",")
106106
end_point = end_point.split(",")
107107
cls.is_explicit = PathExplicit(start_point, end_point, tolerance)
108-
print(cls.is_explicit)
109108

110109
@classmethod
111110
def path_over_speed_limit_change(cls, first_speed, sec_speed):

srunner/scenariomanager/actorcontrols/actor_control.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,15 @@ def update_target_speed(self, target_speed, start_time=None):
106106
if start_time:
107107
self._last_longitudinal_command = start_time
108108

109-
def update_waypoints(self, waypoints, start_time=None):
109+
def update_waypoints(self, waypoints, times=None, start_time=None):
110110
"""
111111
Update the actor's waypoints
112112
113113
Args:
114114
waypoints (List of carla.Transform): List of new waypoints.
115115
start_time (float): Start time of the new "maneuver" [s].
116116
"""
117-
self.control_instance.update_waypoints(waypoints)
117+
self.control_instance.update_waypoints(waypoints, times)
118118
if start_time:
119119
self._last_waypoint_command = start_time
120120

srunner/scenariomanager/actorcontrols/basic_control.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class BasicControl(object):
3333
_waypoints (list of carla.Transform): List of target waypoints the actor
3434
should travel along. A waypoint here is of type carla.Transform!
3535
Defaults to [].
36+
_times (list of float): List of target times for each waypoint. Optional.
37+
Defaults to False.
3638
_waypoints_updated (boolean):
3739
Defaults to False.
3840
_reached_goal (boolean):
@@ -42,11 +44,13 @@ class BasicControl(object):
4244
_actor = None
4345
_waypoints = []
4446
_waypoints_updated = False
47+
_times = []
4548
_offset = 0
4649
_offset_updated = False
4750
_target_speed = 0
4851
_reached_goal = False
4952
_init_speed = False
53+
_start_time = None
5054

5155
def __init__(self, actor):
5256
"""
@@ -64,15 +68,18 @@ def update_target_speed(self, speed):
6468
self._target_speed = speed
6569
self._init_speed = False
6670

67-
def update_waypoints(self, waypoints, start_time=None):
71+
def update_waypoints(self, waypoints, times=None, start_time=None):
6872
"""
6973
Update the actor's waypoints
7074
7175
Args:
7276
waypoints (List of carla.Transform): List of new waypoints.
77+
times (List of float): List of new times. Optional.
7378
"""
7479
self._waypoints = waypoints
80+
self._times = times
7581
self._waypoints_updated = True
82+
self._start_time = start_time
7683

7784
def update_offset(self, offset, start_time=None):
7885
"""
@@ -83,6 +90,7 @@ def update_offset(self, offset, start_time=None):
8390
"""
8491
self._offset = offset
8592
self._offset_updated = True
93+
self._start_time = start_time
8694

8795
def set_init_speed(self):
8896
"""

srunner/scenariomanager/actorcontrols/npc_vehicle_control.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from srunner.scenariomanager.carla_data_provider import CarlaDataProvider
1919
from srunner.scenariomanager.actorcontrols.basic_control import BasicControl
20+
from srunner.scenariomanager.timer import GameTime
2021

2122

2223
class NpcVehicleControl(BasicControl):
@@ -99,6 +100,18 @@ def run_step(self):
99100
self._offset_updated = False
100101
self._update_offset()
101102

103+
# Times have been specified, modify the speed accordingly
104+
if self._times:
105+
if self._start_time is None:
106+
self._start_time = GameTime.get_time()
107+
plan_len = len(self._local_planner.get_plan())
108+
current_index = len(self._waypoints) - plan_len
109+
target_time = self._times[current_index]
110+
delta_time = target_time - (GameTime.get_time() - self._start_time)
111+
target_location = self._local_planner.get_plan()[0][0].transform.location
112+
target_distance = self._actor.get_location().distance(target_location)
113+
self._target_speed = target_distance / max(delta_time, 0.001)
114+
102115
target_speed = self._target_speed
103116
# If target speed is negavite, raise an exception
104117
if target_speed < 0:
@@ -126,16 +139,3 @@ def run_step(self):
126139
vx = math.cos(yaw) * target_speed
127140
vy = math.sin(yaw) * target_speed
128141
self._actor.set_target_velocity(carla.Vector3D(vx, vy, 0))
129-
130-
# Change Brake light state
131-
if (current_speed > target_speed or target_speed < 0.2) and not self._brake_lights_active:
132-
light_state = self._actor.get_light_state()
133-
light_state |= carla.VehicleLightState.Brake
134-
self._actor.set_light_state(carla.VehicleLightState(light_state))
135-
self._brake_lights_active = True
136-
137-
if self._brake_lights_active and current_speed < target_speed:
138-
self._brake_lights_active = False
139-
light_state = self._actor.get_light_state()
140-
light_state &= ~carla.VehicleLightState.Brake
141-
self._actor.set_light_state(carla.VehicleLightState(light_state))

0 commit comments

Comments
 (0)