关于 isaac-camera
isaac-camera 是用于在 Isaac Sim 6 / Kit 110 中创建和配置相机的技术技能,涵盖 USD 相机设置、RTX 捕获、标定、畸变、多相机设备组和动画。
主要功能
- 01创建 USD 和 RTX 相机
- 02采集 RGB、深度、分割和边界框
- 03配置 OpenCV 镜头畸变模型
- 04转换 OpenCV 和 ROS 标定数据
- 05构建立体、平铺及多相机设备组
- 06制作相机路径和姿态动画
适用场景
- 01搭建经过标定的相机采集流程
- 02模拟鱼眼或针孔镜头畸变
- 03采集多视角或立体数据
- 04为场景采集制作相机动画
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ isaac-sim/ isaacsim --skill isaac-camera安装后在 Claude Code 中输入/isaac-camera确认已加载。
详细介绍
相机(Isaac Sim 6 / Kit 110)
用途
为 Isaac Sim 6 传感器管线创建和配置 USD 相机、渲染产品、内参、AOV 和镜头畸变模型。
先决条件
- 已构建 Isaac Sim(
$ISAAC_SIM_DIR或_build/linux-x86_64/release)。 - 配备当前驱动程序的 NVIDIA GPU(
nvidia-smi)。 isaac-sim-orchestrator提供的 Shell 环境变量约定:$ISAAC_SIM_DIR、$ISAAC_LAB_DIR、$WORKSPACE_DIR。
限制
- 除非某个章节另有说明,否则适用于 Isaac Sim 6 / Kit 110。
- 无法替代 NVIDIA 官方文档中关于不受支持的边缘情况的说明。
故障排除
| 错误 / 症状 | 原因 | 解决方案 |
|---|---|---|
| 未找到扩展或导入项 | $ISAAC_SIM_DIR 错误或构建过期 | 将环境变量指向 _build/linux-x86_64/release,或重新构建 |
| 画面全黑或为空 | 缺少灯光或未使用 RTX 渲染模式 | 添加穹顶灯 / 主光源;确认 RTX / PathTracing 设置 |
| 加载场景或首次渲染时卡住 | MDL 编译或场景过大 | 按照 isaac-sim-troubleshooting 中的隔离步骤操作 |
分为两层:
UsdGeomCamera— USD 相机基元(焦距、光圈、裁剪范围、变换)。isaacsim.sensors.experimental.rtx— 运行时传感器封装(创建设定类 + 运行时传感器类)。任何用于采集画面、附加标注器或应用镜头畸变的新代码都应使用此封装。
旧版 isaacsim.sensors.camera.Camera 类仍可使用,但该扩展本身是一个桩(没有 Python 代码)。实现已移至 isaacsim.sensors.experimental.rtx;新代码应使用后者。
迁移: 请参阅下方
从 isaacsim.sensors.camera.Camera 迁移表格,以及官方相机迁移指南,了解完整的 API 变更内容。
适用场景
- 在 USD 场景中创建或配置相机基元。
- 为采集附加 RGB / 深度 / 分割 / 边界框标注器。
- 应用镜头畸变(OpenCV 针孔、OpenCV 鱼眼、LUT)。
- 将真实世界的标定数据(OpenCV / ROS)转换为 Omniverse 单位。
- 构建立体、多传感器或平铺式多相机设备。
- 制作相机动画(关键帧、运动路径、环绕、飞行浏览)。
- 使用 Replicator 随机化生成合成数据。
- 为 MEGA 场景设置 Metropolis 相机。
基础知识
单位系统
OpenUSD 使用场景单位的十分之一表示光学属性。
| 属性 | 单位 | 说明 |
|---|---|---|
| 焦距 | 场景单位的十分之一 | 场景单位为 cm 时,35 = 35 mm |
| 水平光圈 | 场景单位的十分之一 | 传感器 / 胶片宽度 |
| 垂直光圈 | 场景单位的十分之一 | 传感器 / 胶片高度 |
| 对焦距离 | 场景单位 | 完全清晰的距离 |
| 裁剪范围 | 场景单位 | 近 / 远裁剪平面 |
以米为单位的场景:25 mm 焦距对应 0.025。
坐标系
相机沿 -Z 方向观察;+Y 朝上,+X 朝右。无论场景使用哪种上轴,规则都相同。
创建与采集 — RtxCamera + CameraSensor
在 Isaac Sim 6 中,使用 RtxCamera + CameraSensor 创建相机并进行采集。RtxCamera 将应用了 OmniSensorAPI 的 UsdGeom.Camera 基元封装起来;CameraSensor 在此基础上创建 Replicator 渲染产品并提供标注器。两者都扩展自 isaacsim.core.experimental.prims.XformPrim 系列,因此适用标准位姿 / 变换方法。
from isaacsim.sensors.experimental.rtx import RtxCamera, CameraSensor
import isaacsim.core.experimental.utils.app as app_utils
cam = RtxCamera(
"/World/cam",
tick_rate=30.0, # 0 = autotrigger
aux_output_level="NONE", # RtxCamera supports NONE only
)
cam.camera.set_focal_lengths(24.0)
cam.camera.set_clipping_ranges(0.01, 1000.0)
sensor = CameraSensor(
cam,
resolution=(480, 640), # (height, width)
annotators=["rgb", "distance_to_image_plane"],
)
app_utils.play(commit=True)
data = sensor.get_data("rgb")
直接在 RtxCamera 上设置位姿(它是一个 XformPrim):在构造函数中传入 positions= / translations= / orientations=(四元数 wxyz),或之后调用 set_world_poses(...)。
cam.set_world_poses(positions=[[2.0, 2.0, 2.0]],
orientations=[[1.0, 0.0, 0.0, 0.0]]) # wxyz
TiledCameraSensor 可将多个相机批量合并到一次渲染调用中,适用于多视角 RL 数据采集。SingleViewDepthCameraSensor 通过 OmniSensorDepthSensorSingleViewAPI 模拟立体深度。
镜头畸变(OpenCV 鱼眼 / 针孔)
在创作时通过 API 架构和 USD 属性进行设置。架构和属性名称保持稳定;可通过 RtxCamera 的 schemas 和 attributes 构造参数使用,或直接在相机 prim 上应用 Apply。
from isaacsim.sensors.experimental.rtx import RtxCamera
from pxr import Gf
cam = RtxCamera(
"/World/fisheye",
schemas=["OmniLensDistortionOpenCvFisheyeAPI"],
attributes={
"omni:lensdistortion:opencvFisheye:fx": 500.0,
"omni:lensdistortion:opencvFisheye:fy": 500.0,
"omni:lensdistortion:opencvFisheye:cx": 640.0,
"omni:lensdistortion:opencvFisheye:cy": 360.0,
"omni:lensdistortion:opencvFisheye:k1": 0.05,
"omni:lensdistortion:opencvFisheye:imageSize": Gf.Vec2i(1280, 720),
},
)
等效的 OpenCV 针孔架构:OmniLensDistortionOpenCvPinholeAPI(属性 omni:lensdistortion:opencvPinhole:{fx,fy,cx,cy,k1,k2,p1,p2,...})。基于 LUT 的畸变使用 OmniLensDistortionLutAPI。
动画
from pxr import Usd, Gf
for frame, pos in enumerate(camera_positions):
cam.GetPrim().GetAttribute("xformOp:translate").Set(
Gf.Vec3d(*pos), Usd.TimeCode(frame)
)
Replicator 随机化
import omni.replicator.core as rep
with rep.new_layer():
cameras = rep.get.prims(path_pattern="/World/Camera.*")
with rep.trigger.on_frame(num_frames=200):
with cameras:
rep.modify.pose(
position=rep.distribution.uniform((-5, -5, 2), (5, 5, 8)),
look_at="/World/Target",
)
传感器检查器 / 支持的配置
对于由资产驱动的激光雷达 / 相机配置和验证辅助工具,请参阅 isaacsim.sensors.experimental.rtx.SUPPORTED_LIDAR_CONFIGS 以及扩展中附带的 sensor_checker 模块。Replicator AOV 注释器名称与标准注册表一致:rgb、distance_to_image_plane、distance_to_camera、normals、semantic_segmentation、instance_segmentation、bounding_box_2d_tight、bounding_box_2d_loose、bounding_box_3d、camera_params、pointcloud、occlusion。
从 isaacsim.sensors.camera.Camera 迁移
完整指南:isaacsim.sensors.camera → isaacsim.sensors.experimental.rtx。
| 旧版 | 新版 |
|---|---|
isaacsim.sensors.camera.Camera("/World/cam", resolution=(1280, 720)) | RtxCamera("/World/cam") + CameraSensor(cam, resolution=(720, 1280), annotators=["rgb"]) |
camera.set_focal_length(24) | cam.camera.set_focal_lengths(24.0) |
camera.set_clipping_range(0.01, 1000) | cam.camera.set_clipping_ranges(0.01, 1000) |
camera.initialize() 然后 camera.get_current_frame() | app_utils.play(commit=True) 然后 sensor.get_data(annotator) |
Carb 设置畸变(/<path>/distortionModel) | 相机 prim 上的 OmniLensDistortion*API 架构 |