📡 Raycaster Patterns#

Genesis provides multiple ray patterns for LiDAR and depth sensor simulation.

Pattern Types#

Pattern

Use Case

SphericalPattern

3D LiDAR (Velodyne, Ouster)

DepthCameraPattern

Depth cameras (RealSense, Kinect)

GridPattern

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