Skip to content

Commit fdf0fbd

Browse files
authored
Merge pull request #14 from commaai/future-target
Make future targets available to the controller
2 parents a615066 + d42dd27 commit fdf0fbd

File tree

4 files changed

+34
-15
lines changed

4 files changed

+34
-15
lines changed

controllers/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
11
class BaseController:
2-
def update(self, target_lataccel, current_lataccel, state):
2+
def update(self, target_lataccel, current_lataccel, state, target_future):
3+
"""
4+
Args:
5+
target_lataccel: The target lateral acceleration.
6+
current_lataccel: The current lateral acceleration.
7+
state: The current state of the vehicle.
8+
target_future: The future target lateral acceleration plan for the next N frames.
9+
Returns:
10+
The control signal to be applied to the vehicle.
11+
"""
312
raise NotImplementedError

controllers/open.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ class Controller(BaseController):
55
"""
66
An open-loop controller
77
"""
8-
def update(self, target_lataccel, current_lataccel, state):
8+
def update(self, target_lataccel, current_lataccel, state, target_future):
99
return target_lataccel

controllers/simple.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ class Controller(BaseController):
55
"""
66
A simple controller that is the error between the target and current lateral acceleration times some factor
77
"""
8-
def update(self, target_lataccel, current_lataccel, state):
8+
def update(self, target_lataccel, current_lataccel, state, target_future):
99
return (target_lataccel - current_lataccel) * 0.3

tinyphysics.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
signal.signal(signal.SIGINT, signal.SIG_DFL) # Enable Ctrl-C on plot windows
2121

2222
ACC_G = 9.81
23+
FPS = 10
2324
CONTROL_START_IDX = 100
25+
COST_END_IDX = 550
2426
CONTEXT_LENGTH = 20
2527
VOCAB_SIZE = 1024
2628
LATACCEL_RANGE = [-5, 5]
@@ -29,6 +31,8 @@
2931
DEL_T = 0.1
3032
LAT_ACCEL_COST_MULTIPLIER = 5.0
3133

34+
FUTURE_PLAN_STEPS = FPS * 5 # 5 secs
35+
3236
State = namedtuple('State', ['roll_lataccel', 'v_ego', 'a_ego'])
3337

3438

@@ -95,10 +99,12 @@ def __init__(self, model: TinyPhysicsModel, data_path: str, controller: BaseCont
9599

96100
def reset(self) -> None:
97101
self.step_idx = CONTEXT_LENGTH
98-
self.state_history = [self.get_state_target(i)[0] for i in range(self.step_idx)]
102+
state_targetfutures = [self.get_state_targetfuture(i) for i in range(self.step_idx)]
103+
self.state_history = [x['state'] for x in state_targetfutures]
99104
self.action_history = self.data['steer_command'].values[:self.step_idx].tolist()
100-
self.current_lataccel_history = [self.get_state_target(i)[1] for i in range(self.step_idx)]
101-
self.target_lataccel_history = [self.get_state_target(i)[1] for i in range(self.step_idx)]
105+
self.current_lataccel_history = [x['targetfuture'][0] for x in state_targetfutures]
106+
self.target_lataccel_history = [x['targetfuture'][0] for x in state_targetfutures]
107+
self.target_future = None
102108
self.current_lataccel = self.current_lataccel_history[-1]
103109
seed = int(md5(self.data_path.encode()).hexdigest(), 16) % 10**4
104110
np.random.seed(seed)
@@ -124,25 +130,29 @@ def sim_step(self, step_idx: int) -> None:
124130
if step_idx >= CONTROL_START_IDX:
125131
self.current_lataccel = pred
126132
else:
127-
self.current_lataccel = self.get_state_target(step_idx)[1]
133+
self.current_lataccel = self.get_state_targetfuture(step_idx)['targetfuture'][0]
128134

129135
self.current_lataccel_history.append(self.current_lataccel)
130136

131137
def control_step(self, step_idx: int) -> None:
132-
action = self.controller.update(self.target_lataccel_history[step_idx], self.current_lataccel, self.state_history[step_idx])
138+
action = self.controller.update(self.target_lataccel_history[step_idx], self.current_lataccel, self.state_history[step_idx], target_future=self.target_future)
133139
if step_idx < CONTROL_START_IDX:
134140
action = self.data['steer_command'].values[step_idx]
135141
action = np.clip(action, STEER_RANGE[0], STEER_RANGE[1])
136142
self.action_history.append(action)
137143

138-
def get_state_target(self, step_idx: int) -> Tuple[State, float]:
144+
def get_state_targetfuture(self, step_idx: int) -> Tuple[State, float]:
139145
state = self.data.iloc[step_idx]
140-
return State(roll_lataccel=state['roll_lataccel'], v_ego=state['v_ego'], a_ego=state['a_ego']), state['target_lataccel']
146+
return {
147+
'state': State(roll_lataccel=state['roll_lataccel'], v_ego=state['v_ego'], a_ego=state['a_ego']),
148+
'targetfuture': self.data['target_lataccel'].values[step_idx:step_idx + FUTURE_PLAN_STEPS].tolist()
149+
}
141150

142151
def step(self) -> None:
143-
state, target = self.get_state_target(self.step_idx)
144-
self.state_history.append(state)
145-
self.target_lataccel_history.append(target)
152+
state_targetfuture = self.get_state_targetfuture(self.step_idx)
153+
self.state_history.append(state_targetfuture['state'])
154+
self.target_lataccel_history.append(state_targetfuture['targetfuture'][0])
155+
self.target_future = state_targetfuture['targetfuture'][1:]
146156
self.control_step(self.step_idx)
147157
self.sim_step(self.step_idx)
148158
self.step_idx += 1
@@ -158,8 +168,8 @@ def plot_data(self, ax, lines, axis_labels, title) -> None:
158168
ax.set_ylabel(axis_labels[1])
159169

160170
def compute_cost(self) -> dict:
161-
target = np.array(self.target_lataccel_history)[CONTROL_START_IDX:]
162-
pred = np.array(self.current_lataccel_history)[CONTROL_START_IDX:]
171+
target = np.array(self.target_lataccel_history)[CONTROL_START_IDX:COST_END_IDX]
172+
pred = np.array(self.current_lataccel_history)[CONTROL_START_IDX:COST_END_IDX]
163173

164174
lat_accel_cost = np.mean((target - pred)**2) * 100
165175
jerk_cost = np.mean((np.diff(pred) / DEL_T)**2) * 100

0 commit comments

Comments
 (0)