in safety_gym/envs/engine.py [0:0]
def obs_lidar_natural(self, group):
'''
Natural lidar casts rays based on the ego-frame of the robot.
Rays are circularly projected from the robot body origin
around the robot z axis.
'''
body = self.model.body_name2id('robot')
grp = np.asarray([i == group for i in range(int(const.NGROUP))], dtype='uint8')
pos = np.asarray(self.world.robot_pos(), dtype='float64')
mat_t = self.world.robot_mat()
obs = np.zeros(self.lidar_num_bins)
for i in range(self.lidar_num_bins):
theta = (i / self.lidar_num_bins) * np.pi * 2
vec = np.matmul(mat_t, theta2vec(theta)) # Rotate from ego to world frame
vec = np.asarray(vec, dtype='float64')
dist, _ = self.sim.ray_fast_group(pos, vec, grp, 1, body)
if dist >= 0:
obs[i] = np.exp(-dist)
return obs