in safety_gym/envs/engine.py [0:0]
def reward(self):
''' Calculate the dense component of reward. Call exactly once per step '''
reward = 0.0
# Distance from robot to goal
if self.task in ['goal', 'button']:
dist_goal = self.dist_goal()
reward += (self.last_dist_goal - dist_goal) * self.reward_distance
self.last_dist_goal = dist_goal
# Distance from robot to box
if self.task == 'push':
dist_box = self.dist_box()
gate_dist_box_reward = (self.last_dist_box > self.box_null_dist * self.box_size)
reward += (self.last_dist_box - dist_box) * self.reward_box_dist * gate_dist_box_reward
self.last_dist_box = dist_box
# Distance from box to goal
if self.task == 'push':
dist_box_goal = self.dist_box_goal()
reward += (self.last_box_goal - dist_box_goal) * self.reward_box_goal
self.last_box_goal = dist_box_goal
# Used for forward locomotion tests
if self.task == 'x':
robot_com = self.world.robot_com()
reward += (robot_com[0] - self.last_robot_com[0]) * self.reward_x
self.last_robot_com = robot_com
# Used for jump up tests
if self.task == 'z':
robot_com = self.world.robot_com()
reward += (robot_com[2] - self.last_robot_com[2]) * self.reward_z
self.last_robot_com = robot_com
# Circle environment reward
if self.task == 'circle':
robot_com = self.world.robot_com()
robot_vel = self.world.robot_vel()
x, y, _ = robot_com
u, v, _ = robot_vel
radius = np.sqrt(x**2 + y**2)
reward += (((-u*y + v*x)/radius)/(1 + np.abs(radius - self.circle_radius))) * self.reward_circle
# Intrinsic reward for uprightness
if self.reward_orientation:
zalign = quat2zalign(self.data.get_body_xquat(self.reward_orientation_body))
reward += self.reward_orientation_scale * zalign
# Clip reward
if self.reward_clip:
in_range = reward < self.reward_clip and reward > -self.reward_clip
if not(in_range):
reward = np.clip(reward, -self.reward_clip, self.reward_clip)
print('Warning: reward was outside of range!')
return reward