API Reference
June 20, 2026 · View on GitHub
MjLidarWrapper
Main interface for LiDAR simulation.
Constructor
MjLidarWrapper(
mj_model: mujoco.MjModel,
site_name: str,
backend: str = "taichi",
cutoff_dist: float = 100.0,
args: dict = {}
)
Parameters:
mj_model: MuJoCo model objectsite_name: Name of LiDAR site in the modelbackend:"cpu","taichi","jax", or"warp"(default:"taichi")cutoff_dist: Maximum ray distance in meters (default: 100.0)args: Backend-specific arguments (see below)
Attributes:
backend: Selected backend namecutoff_dist: Maximum ray distancemj_model: MuJoCo model reference
Methods
trace_rays
trace_rays(data: mujoco.MjData, theta: np.ndarray, phi: np.ndarray) -> np.ndarray
Trace rays and return ranges.
Parameters:
data: MuJoCo data objecttheta: Azimuth angles in radiansphi: Elevation angles in radians
Returns:
ranges: Distance array (same shape as theta/phi)
Backend Arguments
CPU Backend
args = {
'geomgroup': np.ndarray | None, # Geometry group filter (0-5)
'bodyexclude': int # Body ID to exclude (-1 = none)
}
Taichi Backend
args = {
'max_candidates': int, # BVH candidates (default: 64)
'ti_init_args': {
'device_memory_GB': float, # GPU memory limit
'debug': bool, # Debug mode
'log_level': str # 'trace', 'debug', 'info', 'warn', 'error'
}
}
JAX Backend
args = {
'geom_ids': list | None # Geometry IDs to include (None = all)
}
Warp Backend
args = {
'geomgroup': np.ndarray | None, # Geometry group filter (0-5)
'bodyexclude': int, # Body ID to exclude (-1 = none)
'device': str | None, # Warp device, e.g. "cuda:0"
'use_bvh': bool # Use Warp BVH broad phase (default: True)
}
Scan Pattern Generators
All functions return (theta, phi) tuple of numpy arrays.
generate_HDL64
scan_gen.generate_HDL64() -> tuple[np.ndarray, np.ndarray]
Velodyne HDL-64E pattern (~110K rays).
generate_vlp32
scan_gen.generate_vlp32() -> tuple[np.ndarray, np.ndarray]
Velodyne VLP-32C pattern (~120K rays).
generate_os128
scan_gen.generate_os128() -> tuple[np.ndarray, np.ndarray]
Ouster OS-128 pattern.
generate_airy96
scan_gen.generate_airy96() -> tuple[np.ndarray, np.ndarray]
RoboSense Airy-96 pattern (~86K rays).
generate_grid_scan_pattern
scan_gen.generate_grid_scan_pattern(
num_ray_cols: int,
num_ray_rows: int,
theta_range: tuple = (-π, π),
phi_range: tuple = (-π/3, π/3)
) -> tuple[np.ndarray, np.ndarray]
Custom grid pattern.
create_lidar_single_line
scan_gen.create_lidar_single_line(
horizontal_resolution: int = 360,
horizontal_fov: float = 2π
) -> tuple[np.ndarray, np.ndarray]
Single horizontal scan line.
LivoxGenerator
from mujoco_lidar.scan_gen_livox_ti import LivoxGenerator
livox = LivoxGenerator(
pattern: str = "mid360", # "mid360", "mid70", "mid40", "tele", "avia"
samples: int = 100000
)
theta, phi = livox.sample_ray_angles()
Non-repetitive Livox scanning patterns.