fix: pre-set camera aperture on USD prim before Camera init

Camera.__init__() checks aperture consistency against resolution
before we can call set_horizontal_aperture(). Pre-set the aperture
values directly on the USD prim via UsdGeom.Camera API to eliminate
the mismatch warnings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Tangger
2026-04-03 12:07:16 +08:00
parent 8d2fec09e0
commit 1105a49e8f

View File

@@ -32,16 +32,7 @@ class CustomCamera(Camera):
reference_path: Reference prim path for camera mounting
name: Camera name
"""
# ===== Initialize camera =====
super().__init__(
prim_path=prim_path,
name=name,
resolution=(cfg["params"]["resolution_width"], cfg["params"]["resolution_height"]),
*args,
**kwargs,
)
# ===== From cfg =====
# ===== Pre-compute camera parameters =====
pixel_size = cfg["params"].get("pixel_size")
f_number = cfg["params"].get("f_number")
focus_distance = cfg["params"].get("focus_distance")
@@ -50,18 +41,38 @@ class CustomCamera(Camera):
height = cfg["params"].get("resolution_height")
self.output_mode = cfg.get("output_mode", "rgb")
# ===== Compute and set camera parameters (before initialize to avoid aperture mismatch warnings) =====
horizontal_aperture = pixel_size * 1e-3 * width
vertical_aperture = pixel_size * 1e-3 * height
horizontal_aperture = pixel_size * 1e-3 * width / 10.0
vertical_aperture = pixel_size * 1e-3 * height / 10.0
focal_length_x = fx * pixel_size * 1e-3
focal_length_y = fy * pixel_size * 1e-3
focal_length = (focal_length_x + focal_length_y) / 2
focal_length = (focal_length_x + focal_length_y) / 2 / 10.0
self.set_focal_length(focal_length / 10.0)
# Pre-set aperture on USD prim before Camera.__init__ to avoid mismatch warnings
from pxr import UsdGeom
import omni.usd
stage = omni.usd.get_context().get_stage()
cam_prim = stage.GetPrimAtPath(prim_path)
if cam_prim.IsValid():
cam = UsdGeom.Camera(cam_prim)
cam.GetHorizontalApertureAttr().Set(horizontal_aperture * 10.0) # USD uses mm
cam.GetVerticalApertureAttr().Set(vertical_aperture * 10.0)
cam.GetFocalLengthAttr().Set(focal_length * 10.0)
# ===== Initialize camera =====
super().__init__(
prim_path=prim_path,
name=name,
resolution=(width, height),
*args,
**kwargs,
)
# ===== Set camera parameters =====
self.set_focal_length(focal_length)
self.set_focus_distance(focus_distance)
self.set_lens_aperture(f_number * 100.0)
self.set_horizontal_aperture(horizontal_aperture / 10.0)
self.set_vertical_aperture(vertical_aperture / 10.0)
self.set_horizontal_aperture(horizontal_aperture)
self.set_vertical_aperture(vertical_aperture)
self.set_clipping_range(0.05, 1.0e5)
try:
self.set_lens_distortion_model("pinhole")