def observe(self) -> np.ndarray: if not self.env.road: return np.zeros( (3, 3, int(self.horizon * self.env.config["policy_frequency"]))) grid = compute_ttc_grid(self.env, vehicle=self.observer_vehicle, time_quantization=1 / self.env.config["policy_frequency"], horizon=self.horizon) padding = np.ones(np.shape(grid)) padded_grid = np.concatenate([padding, grid, padding], axis=1) obs_lanes = 3 l0 = grid.shape[1] + self.observer_vehicle.lane_index[ 2] - obs_lanes // 2 lf = grid.shape[1] + self.observer_vehicle.lane_index[ 2] + obs_lanes // 2 clamped_grid = padded_grid[:, l0:lf + 1, :] repeats = np.ones(clamped_grid.shape[0]) repeats[np.array([0, -1])] += clamped_grid.shape[0] padded_grid = np.repeat(clamped_grid, repeats.astype(int), axis=0) obs_speeds = 3 v0 = grid.shape[0] + self.observer_vehicle.speed_index - obs_speeds // 2 vf = grid.shape[0] + self.observer_vehicle.speed_index + obs_speeds // 2 clamped_grid = padded_grid[v0:vf + 1, :, :] return clamped_grid
def observe(self) -> np.ndarray: if not self.env.road: return np.zeros(self.space().shape) # Add ego-vehicle df = pd.DataFrame.from_records([self.observer_vehicle.to_dict()])[self.features] # Add nearby traffic # sort = self.order == "sorted" close_vehicles = self.env.road.close_vehicles_to(self.observer_vehicle, self.env.PERCEPTION_DISTANCE, count=self.vehicles_count - 1, see_behind=self.see_behind) if close_vehicles: origin = self.observer_vehicle if not self.absolute else None df = df.append(pd.DataFrame.from_records( [v.to_dict(origin, observe_intentions=self.observe_intentions) for v in close_vehicles[-self.vehicles_count + 1:]])[self.features], ignore_index=True) # Normalize and clip if self.normalize: df = self.normalize_obs(df) # Fill missing rows if df.shape[0] < self.vehicles_count: rows = np.zeros((self.vehicles_count - df.shape[0], len(self.features))) df = df.append(pd.DataFrame(data=rows, columns=self.features), ignore_index=True) # Reorder df = df[self.features] obs = df.values.copy() if self.order == "shuffled": self.env.np_random.shuffle(obs[1:]) # Flatten if not self.env.road: return np.zeros((3, 3, int(self.horizon * self.env.config["policy_frequency"]))) grid = compute_ttc_grid(self.env, vehicle=self.observer_vehicle, time_quantization=1/self.env.config["policy_frequency"], horizon=self.horizon) padding = np.ones(np.shape(grid)) padded_grid = np.concatenate([padding, grid, padding], axis=1) obs_lanes = 3 l0 = grid.shape[1] + self.observer_vehicle.lane_index[2] - obs_lanes // 2 lf = grid.shape[1] + self.observer_vehicle.lane_index[2] + obs_lanes // 2 clamped_grid = padded_grid[:, l0:lf+1, :] repeats = np.ones(clamped_grid.shape[0]) repeats[np.array([0, -1])] += clamped_grid.shape[0] padded_grid = np.repeat(clamped_grid, repeats.astype(int), axis=0) obs_speeds = 3 v0 = grid.shape[0] + self.observer_vehicle.speed_index - obs_speeds // 2 vf = grid.shape[0] + self.observer_vehicle.speed_index + obs_speeds // 2 clamped_grid = padded_grid[v0:vf + 1, :, :] return np.append(obs.flatten(),clamped_grid.flatten(),axis=0)
def observe(self): grid = compute_ttc_grid(self.env, time_quantization=1/self.env.config["policy_frequency"], horizon=self.horizon) padding = np.ones(np.shape(grid)) padded_grid = np.concatenate([padding, grid, padding], axis=1) obs_lanes = 3 l0 = grid.shape[1] + self.env.vehicle.lane_index[2] - obs_lanes // 2 lf = grid.shape[1] + self.env.vehicle.lane_index[2] + obs_lanes // 2 clamped_grid = padded_grid[:, l0:lf+1, :] repeats = np.ones(clamped_grid.shape[0]) repeats[np.array([0, -1])] += clamped_grid.shape[0] padded_grid = np.repeat(clamped_grid, repeats.astype(int), axis=0) obs_velocities = 3 v0 = grid.shape[0] + self.env.vehicle.velocity_index - obs_velocities // 2 vf = grid.shape[0] + self.env.vehicle.velocity_index + obs_velocities // 2 clamped_grid = padded_grid[v0:vf + 1, :, :] return clamped_grid