Skip to content

Commit 87163d6

Browse files
committed
move launch control logic out of gem.py and gem_hardware.py and into the planners (pure_pursuit and stanley)
1 parent d163c60 commit 87163d6

4 files changed

Lines changed: 49 additions & 69 deletions

File tree

GEMstack/onboard/interface/gem.py

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def hardware_faults(self) -> List[str]:
135135
"""
136136
raise NotImplementedError()
137137

138-
def simple_command(self, acceleration_mps2: float, steering_wheel_angle: float, state: VehicleState = None, brake_override: Optional[float] = None, launch_control: bool = False) -> GEMVehicleCommand:
138+
def simple_command(self, acceleration_mps2: float, steering_wheel_angle: float, state: VehicleState = None) -> GEMVehicleCommand:
139139
""""
140140
Returns a command according to a desired acceleration and steering angle
141141
@@ -147,29 +147,8 @@ def simple_command(self, acceleration_mps2: float, steering_wheel_angle: float,
147147
pitch = state.pose.pitch if state is not None and state.pose.pitch is not None else 0.0
148148
v = state.v if state is not None else 0.0
149149
gear = state.gear if state is not None else 1
150-
stage_duration = settings.get('control.launch_control.stage_duration', 0.5)
151-
152-
if launch_control and v < 0.1:
153-
if not hasattr(self,'_launch_start_time'):
154-
self._launch_start_time = self.time()
155-
elapsed = self.time() - self._launch_start_time
156-
if elapsed < stage_duration:
157-
acc_pos = 0.0
158-
brake_pos = 1.0
159-
elif elapsed < 2 * stage_duration:
160-
acc_pos = 1.0
161-
brake_pos = 1.0
162-
else:
163-
acc_pos = 1.0
164-
brake_pos = 0.0
165-
else:
166-
if hasattr(self, '_launch_start_time'):
167-
del self._launch_start_time
168-
if brake_override is not None:
169-
acc_pos = np.clip(acceleration_mps2 / self.max_accel, 0.0, 1.0)
170-
brake_pos = np.clip(brake_override, 0.0, 1.0)
171-
else:
172-
acc_pos, brake_pos, gear = acceleration_to_pedal_positions(acceleration_mps2, v, pitch, gear)
150+
151+
acc_pos, brake_pos, gear = acceleration_to_pedal_positions(acceleration_mps2, v, pitch, gear)
173152

174153

175154
# acc_pos,brake_pos,gear = acceleration_to_pedal_positions(acceleration_mps2, v, pitch, gear)

GEMstack/onboard/interface/gem_hardware.py

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,6 @@ def __init__(self):
101101
/pacmod/as_rx/wiper_cmd
102102
"""
103103

104-
# Launch Control Timing
105-
# 0 - 5 Seconds 100% brake 0% throttle
106-
# 5 - 6 Seconds 100% brake 100% throttle
107-
# 6 - 7 Seconds 0% brake 100% throttle
108-
# TODO add option launch control
109-
self.start_time = rospy.get_time()
110-
111104
#TODO: publish TwistStamped to /front_radar/front_radar/vehicle_motion to get better radar tracks
112105

113106
#subscribers should go last because the callback might be called before the object is initialized
@@ -335,39 +328,6 @@ def send_command(self, command : GEMVehicleCommand):
335328
self.accel_cmd.enable = True
336329
self.accel_cmd.clear = False
337330
self.accel_cmd.ignore = False
338-
339-
# enable_launch_control = settings.get('control.launch_control.enable', False)
340-
# stage_duration = 0.5
341-
# currTime = rospy.get_time() - self.start_time
342-
343-
344-
# Launch control
345-
# if enable_launch_control:
346-
# total_stage_time = 3 * stage_duration
347-
# if currTime < total_stage_time:
348-
# if currTime < stage_duration:
349-
# self.brake_cmd.f64_cmd = maxbrake
350-
# self.accel_cmd.f64_cmd = 0
351-
# elif currTime < 2 * stage_duration:
352-
# self.brake_cmd.f64_cmd = maxbrake
353-
# self.accel_cmd.f64_cmd = maxacc
354-
# else:
355-
# self.brake_cmd.f64_cmd = 0
356-
# self.accel_cmd.f64_cmd = maxacc
357-
# else:
358-
# enable_launch_control = False
359-
360-
# if command.launch_control and self.last_reading.speed == 0:
361-
# self.brake_cmd.f64_cmd = command.brake_pedal_position
362-
# self.accel_cmd.f64_cmd = command.accelerator_pedal_position
363-
# else:
364-
# self.accel_cmd.f64_cmd = command.accelerator_pedal_position
365-
# if command.brake_pedal_position > 0.0:
366-
# self.accel_cmd.f64_cmd = 0.0
367-
# self.brake_cmd.f64_cmd = command.brake_pedal_position
368-
369-
# self.brake_cmd.f64_cmd = maxbrake
370-
# self.accel_cmd.f64_cmd = 0
371331

372332

373333
self.gear_cmd.ui16_cmd = PacmodCmd.SHIFT_FORWARD

GEMstack/onboard/planning/pure_pursuit.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ..interface.gem import GEMVehicleCommand
99
from ..component import Component
1010
import numpy as np
11+
import rospy
1112

1213
class PurePursuit(object):
1314
"""Implements a pure pursuit controller on a second-order Dubins vehicle."""
@@ -241,6 +242,8 @@ class PurePursuitTrajectoryTracker(Component):
241242
def __init__(self,vehicle_interface=None, **args):
242243
self.pure_pursuit = PurePursuit(**args)
243244
self.vehicle_interface = vehicle_interface
245+
self.enable_launch_control = settings.get('control.launch_control.enable', False) # and vehicle.v < 0.1
246+
self.stage_duration = settings.get('control.launch_control.stage_duration', 0.5)
244247

245248
def rate(self):
246249
return 50.0
@@ -258,8 +261,26 @@ def update(self, vehicle : VehicleState, trajectory: Trajectory):
258261
steering_angle = np.clip(front2steer(wheel_angle), self.pure_pursuit.steering_angle_range[0], self.pure_pursuit.steering_angle_range[1])
259262
#print("Desired steering angle",steering_angle)
260263

261-
launch_control = self.pure_pursuit.enable_launch_control and vehicle.v < 0.1
262-
self.vehicle_interface.send_command(self.vehicle_interface.simple_command(accel,steering_angle, vehicle, launch_control=launch_control))
264+
cmd = self.vehicle_interface.simple_command(accel, steering_angle, vehicle)
265+
266+
if self.enable_launch_control:
267+
print("launch control active")
268+
if not hasattr(self,'_launch_start_time'):
269+
self._launch_start_time = rospy.get_time()
270+
elapsed = rospy.get_time() - self._launch_start_time
271+
if elapsed < self.stage_duration:
272+
cmd.accelerator_pedal_position = 0.0
273+
cmd.brake_pedal_position = 1.0
274+
elif elapsed < 2 * self.stage_duration:
275+
cmd.accelerator_pedal_position = 1.0
276+
cmd.brake_pedal_position = 1.0
277+
elif elapsed < 3 * self.stage_duration:
278+
cmd.accelerator_pedal_position = 1.0
279+
cmd.brake_pedal_position = 0.0
280+
else:
281+
self.enable_launch_control = False
282+
283+
self.vehicle_interface.send_command(cmd)
263284

264285
def healthy(self):
265286
return self.pure_pursuit.path is not None

GEMstack/onboard/planning/stanley.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
import rospy
23
from math import sin, cos, atan2
34

45
# These imports match your existing project structure
@@ -70,7 +71,6 @@ def __init__(
7071
i = settings.get('control.longitudinal_control.pid_i')
7172
self.pid_speed = PID(p, d, i, windup_limit=20)
7273

73-
self.enable_launch_control = settings.get('control.launch_control.enable', False)
7474
self.stage_duration = settings.get('control.launch_control.stage_duration', 0.5)
7575
self.launch_start_time = None
7676

@@ -306,6 +306,8 @@ def __init__(self, vehicle_interface=None, **kwargs):
306306
self.stanley = Stanley(**kwargs)
307307
self.vehicle_interface = vehicle_interface
308308
self.desired_speed_source = settings.get('control.stanley.desired_speed', 'path')
309+
self.stage_duration = settings.get('control.launch_control.stage_duration', 0.5)
310+
self.enable_launch_control = settings.get('control.launch_control.enable', False) # and vehicle.v < 0.1
309311

310312
def rate(self):
311313
"""Control frequency in Hz."""
@@ -337,7 +339,6 @@ def update(self, vehicle: VehicleState, trajectory: Trajectory):
337339
else:
338340
self.stanley.set_path(trajectory)
339341
accel, f_delta = self.stanley.compute(vehicle, self)
340-
launch_control = self.stanley.enable_launch_control and vehicle.v < 0.01
341342

342343
# If your low-level interface expects steering wheel angle:
343344
steering_angle = front2steer(f_delta)
@@ -347,7 +348,26 @@ def update(self, vehicle: VehicleState, trajectory: Trajectory):
347348
settings.get('vehicle.geometry.max_steering_angle', 0.5)
348349
)
349350

350-
cmd = self.vehicle_interface.simple_command(accel, steering_angle, vehicle, launch_control=launch_control)
351+
cmd = self.vehicle_interface.simple_command(accel, steering_angle, vehicle)
352+
353+
if self.enable_launch_control:
354+
print("launch control active")
355+
if not hasattr(self,'_launch_start_time'):
356+
self._launch_start_time = rospy.get_time()
357+
elapsed = rospy.get_time() - self._launch_start_time
358+
if elapsed < self.stage_duration:
359+
cmd.accelerator_pedal_position = 0.0
360+
cmd.brake_pedal_position = 1.0
361+
elif elapsed < 2 * self.stage_duration:
362+
cmd.accelerator_pedal_position = 1.0
363+
cmd.brake_pedal_position = 1.0
364+
elif elapsed < 3 * self.stage_duration:
365+
cmd.accelerator_pedal_position = 1.0
366+
cmd.brake_pedal_position = 0.0
367+
else:
368+
self.enable_launch_control = False
369+
370+
351371
self.vehicle_interface.send_command(cmd)
352372

353373
def healthy(self):

0 commit comments

Comments
 (0)