in safety_gym/envs/engine.py [0:0]
def obs_compass(self, pos):
'''
Return a robot-centric compass observation of a list of positions.
Compass is a normalized (unit-lenght) egocentric XY vector,
from the agent to the object.
This is equivalent to observing the egocentric XY angle to the target,
projected into the sin/cos space we use for joints.
(See comment on joint observation for why we do this.)
'''
pos = np.asarray(pos)
if pos.shape == (2,):
pos = np.concatenate([pos, [0]]) # Add a zero z-coordinate
# Get ego vector in world frame
vec = pos - self.world.robot_pos()
# Rotate into frame
vec = np.matmul(vec, self.world.robot_mat())
# Truncate
vec = vec[:self.compass_shape]
# Normalize
vec /= np.sqrt(np.sum(np.square(vec))) + 0.001
assert vec.shape == (self.compass_shape,), f'Bad vec {vec}'
return vec