Source code for isaaclab.utils.sensors
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
import logging
# import logger
logger = logging.getLogger(__name__)
[docs]def convert_camera_intrinsics_to_usd(
intrinsic_matrix: list[float], width: int, height: int, focal_length: float | None = None
) -> dict:
"""Creates USD camera properties from camera intrinsics and resolution.
Args:
intrinsic_matrix: Intrinsic matrix of the camera in row-major format.
The matrix is defined as [f_x, 0, c_x, 0, f_y, c_y, 0, 0, 1]. Shape is (9,).
width: Width of the image (in pixels).
height: Height of the image (in pixels).
focal_length: Perspective focal length (in cm) used to calculate pixel size. Defaults to None,
in which case, the focal length will be calculated as 1 / width.
Returns:
A dictionary of USD camera parameters for focal_length, horizontal_aperture, vertical_aperture,
horizontal_aperture_offset, and vertical_aperture_offset.
"""
# extract parameters from matrix
f_x = intrinsic_matrix[0]
f_y = intrinsic_matrix[4]
c_x = intrinsic_matrix[2]
c_y = intrinsic_matrix[5]
# warn about non-square pixels
if abs(f_x - f_y) > 1e-4:
logger.warning("Camera non square pixels are not supported by Omniverse. The average of f_x and f_y are used.")
# warn about aperture offsets
if abs((c_x - float(width) / 2) > 1e-4 or (c_y - float(height) / 2) > 1e-4):
logger.warning(
"Camera aperture offsets are not supported by Omniverse. c_x and c_y will be half of width and height"
)
# calculate usd camera parameters
# pixel_size does not need to be exact it is just used for consistent sizing of aperture and focal_length
# https://docs.omniverse.nvidia.com/isaacsim/latest/features/sensors_simulation/isaac_sim_sensors_camera.html#calibrated-camera-sensors
if focal_length is None:
pixel_size = 1 / float(width)
else:
pixel_size = focal_length / ((f_x + f_y) / 2)
usd_params = {
"horizontal_aperture": pixel_size * float(width),
"vertical_aperture": pixel_size * float(height),
"focal_length": pixel_size * (f_x + f_y) / 2, # The focal length in mm
"horizontal_aperture_offset": 0.0,
"vertical_aperture_offset": 0.0,
}
return usd_params