class_docstr: A wrapper for reward shaping, note this wrapper must be the first wrapper 
class_docstr_tok: ["A","wrapper","for","reward","shaping",",","note","this","wrapper","must","be","the","first","wrapper"]
code: def step(self, action, **kwargs):
      self.step_count += 1
      obs, r, done, info = self.env.step(action, **kwargs)
  
      info = self.reward_shaping(obs, r, done, action, info)
  
      target_vel = np.linalg.norm(
          [obs["v_tgt_field"][0][5][5], obs["v_tgt_field"][1][5][5]]
      )
      info["target_changed"] = False
      if self.last_target_vel is not None:
          if np.abs(target_vel - self.last_target_vel) > 0.2:
              info["target_changed"] = True
      self.last_target_vel = target_vel
  
      assert "shaping_reward" in info
      timeout = False
      if self.step_count >= self.max_timelimit:
          timeout = True
  
      info["timeout"] = timeout
      self.pre_state_desc = obs
      return obs, r, done, info
  
imports: import copy
  import numpy
  import gym
  import abc
  import math
  from osim.env import L2M2019Env
  from parl.utils import logger
label_desc: Use image node_id 3 for calling the RewardShaping obj's underlying member method code with example usage: obj.step(action) and returns: obs,  r,  done,  info