'Note: override this method with great care, as it post-processes the
observations, etc.'

@overrides
def step(self, action):

    reward_computer = self.compute_reward(action)
    action = self._inject_action_noise(action)
    for _ in range(self.frame_skip):
        self.forward_dynamics(action)
    next(reward_computer)
    reward = next(reward_computer)
    self._invalidate_state_caches()
    done = self.is_current_done()
    next_obs = self.get_current_obs()
    return Step(observation=next_obs, reward=reward, done=done)
