验证等级

可见原生 Isaac 场景相机。 验收必须同时看到原生 Isaac 窗口,并得到由 sensors.overview 生成的 1280×720 PNG。桌面或 viewport 截图不能通过这个等级。

前置条件

  • 兼容 Python 3.12 环境中的 Isaac Lab 3.0 和 Isaac Sim 6.0。
  • 同一环境安装 FastSim 0.1.0a6unirobosim==0.10.0unirobosim-isaaclab==0.10.1
  • Pillow(python -m pip install Pillow)只负责把 RGB 字节编码成 PNG。
  • NVIDIA GPU 和正常显示环境。请在原生 application 可见的情况下验收;main.py 仍然只保存场景相机数据,不截取窗口。

配置

物体使用 _shared/assets/ 中的小型红色 USD 方块。sensor 是程序化 camera component, 不需要相机资产文件。

yaml
backend: isaaclab                         # 选择 Isaac Lab provider。
objects:
  red_cube:
    use: object://fastsim/demo-cube       # Registry 会选择 Isaac USD 变体。
    pose:
      xyz_m: [0.0, 0.0, 0.3]             # 放到 provider 地面之上。
      quat_xyzw: [0.0, 0.0, 1.0, 0.0]    # 绕世界 Z 轴半圈的合法姿态。
sensors:
  overview:
    use: sensor://fastsim/demo-rgb-camera # 1280×720,仅 RGB。
    pose:
      xyz_m: [1.4, -1.4, 1.0]            # 世界系相机光心,单位米。
      quat_xyzw: [0.5334021, 0.22094238, 0.31245971, 0.75434448]

相机四元数使用 XYZW 和 OpenGL optical 约定:局部 -Z 朝前,局部 +Y 朝上。 这个四元数看向方块。不能用修改资产 world up axis 来代替实例 pose;本例 USD 已明确 声明 upAxis = "Z"metersPerUnit = 1

逐行理解 Python

  1. fastsim.app(RUN_FILE) 编译 Run;相机查询不需要碰撞几何发布,所以不打开 planning reads。
  2. await simulation.start() 创建原生世界,并启动物理与渲染。
  3. camera_rgb("sensors.overview") 使用编译后的标准 sensor entity ID,最多等待 30 秒,返回不可变紧凑 RGB 数据。
  4. 离开 async with 会先关闭仿真器,再做普通文件编码。
  5. 显式尺寸检查会拒绝任何不是 1280×720 的帧。
  6. Image.frombytes(...) 按准确 rgb24 解释数据,不改分辨率或通道。
  7. OUTPUT_DIR.mkdir(...) 在需要时创建案例内已忽略的 output/ 目录。
  8. image.save(...) 不改变帧尺寸,写出 output/overview-1280x720.png

运行

bash
cd demo/fundamentals/06_camera_rgb_screenshot
fastsim config validate run.yaml --json
UNIROBOSIM_ISAACLAB_LAUNCH_PROFILE=visible \
  python main.py

预期结果:原生 Isaac 窗口打开,终端报告已经保存 1280x720 帧。输出文件是 output/overview-1280x720.png;打开后应从配置视角看到红色方块和 Isaac provider 地面。

UNIROBOSIM_ISAACLAB_LAUNCH_PROFILE=visible 要求本次验收保留原生 Isaac 应用窗口。 PNG 仍然来自场景相机,而不是窗口截图。完整 output/ 目录和 Python bytecode 已被 Git 忽略。

常见错误

  • UNSUPPORTED sensor.camera.rgb@1:provider 不具备相机能力,或安装了错误版本。
  • NOT_FOUND sensors.overview:必须使用带 sensors. 的编译后 entity ID。
  • 空白或朝向错误:检查 OpenGL optical 约定,并保证四元数单位长度。
  • No module named PIL:在同一个 Isaac Python 环境安装 Pillow。
  • 只改成 PyBullet/MuJoCo 后端:本共享相机验收只对 Isaac Lab 有文档和验证;没有 provider 能力检查与可视证据时,不应宣称渲染一致。

下一步

继续阅读 07 — 查看场景实体与实时状态