đĄ Raycaster Patterns#
Genesis provides multiple ray patterns for LiDAR and depth sensor simulation.
Pattern Types#
Pattern |
Use Case |
|---|---|
|
3D LiDAR (Velodyne, Ouster) |
|
Depth cameras (RealSense, Kinect) |
|
Planar sensing, height maps |
SphericalPattern (LiDAR)#
import genesis as gs
# 360° horizontal, 60° vertical FOV
pattern = gs.sensors.SphericalPattern(
fov=(360.0, 60.0),
n_points=(128, 32),
)
lidar = scene.add_sensor(
gs.sensors.Lidar(
pattern=pattern,
entity_idx=robot.idx,
pos_offset=(0.0, 0.0, 0.15),
max_range=100.0,
min_range=0.1,
draw_debug=True,
)
)
SphericalPattern Parameters#
gs.sensors.SphericalPattern(
fov=(360.0, 60.0), # (horizontal, vertical) degrees
n_points=(128, 64), # (horizontal, vertical) rays
angular_resolution=(0.25, 0.5), # Alternative: degrees per ray
angles=(h_angles, v_angles), # Custom angle arrays
)
Real LiDAR Configurations#
# Velodyne VLP-16
velodyne = gs.sensors.SphericalPattern(fov=(360.0, 30.0), n_points=(1800, 16))
# Front-facing 120° FOV
front_lidar = gs.sensors.SphericalPattern(fov=((-60, 60), 30.0), n_points=(128, 32))
DepthCameraPattern#
pattern = gs.sensors.DepthCameraPattern(
res=(640, 480),
fov_horizontal=87.0,
)
depth_cam = scene.add_sensor(
gs.sensors.DepthCamera(
pattern=pattern,
entity_idx=robot.idx,
pos_offset=(0.0, 0.0, 0.05),
max_range=5.0,
)
)
DepthCameraPattern Parameters#
gs.sensors.DepthCameraPattern(
res=(640, 480), # Resolution (width, height)
fov_horizontal=90.0, # Horizontal FOV degrees
fov_vertical=None, # Auto-computed from aspect ratio
fx=None, fy=None, # Focal lengths (override FOV)
cx=None, cy=None, # Principal point
)
GridPattern#
Planar grid of parallel rays:
pattern = gs.sensors.GridPattern(
resolution=0.1, # 10cm spacing
size=(2.0, 2.0), # 2m x 2m grid
direction=(0.0, 0.0, -1.0), # Pointing down
)
Reading Sensor Data#
scene.build()
scene.step()
# LiDAR data
data = lidar.read()
points = data.points # Shape: (n_h, n_v, 3)
distances = data.distances # Shape: (n_h, n_v)
# Depth camera image
depth_image = depth_cam.read_image() # Shape: (H, W)
Common Options#
gs.sensors.Lidar(
pattern=pattern,
entity_idx=robot.idx,
pos_offset=(0.0, 0.0, 0.15),
euler_offset=(0.0, 0.0, 0.0),
max_range=100.0,
min_range=0.1,
return_world_frame=True,
draw_debug=True,
)
Multi-Environment#
scene.build(n_envs=4)
data = lidar.read()
print(data.points.shape) # (4, n_h, n_v, 3) for batched envs