Camera and Recording Implementation Summary#

实现的功能#

完成所有需求

  1. ✅ 对env添加config,配置camera用于headless render and save

  2. ✅ 视频recording功能

  3. ✅ 都在headless模式下完成

  4. ✅ 通过config进行配置

  5. ✅ camera可以留空(设为None)

文件结构#

新增文件#

  1. camera_cfg.py

    • CameraCfg: Camera配置类(使用@configclass)

    • RecordingCfg: Recording配置类(使用@configclass)

    • 支持所有Genesis camera参数和recording选项

修改文件#

  1. lab_scene_cfg.py

    • 添加 camera: CameraCfg = None 字段

    • 添加 recording: RecordingCfg = None 字段

    • 保留旧的 record_video_path 以保持向后兼容

  2. lab_scene.py

    • 添加 _setup_camera_and_recording() 方法

    • 添加 camera property

    • 添加 render_camera() 方法

    • build() 中集成camera和recording设置

  3. init.py

    • 导出 CameraCfgRecordingCfg

  4. play_amo_mesh_terrain.py

    • 添加camera和recording的命令行参数

    • 在env配置中使用新的CameraCfg和RecordingCfg

    • 支持headless模式下的视频录制

文档文件#

  1. CAMERA_RECORDING_EXAMPLE.md

    • 完整的使用指南和示例

    • 配置参数参考

    • 常见问题解答

  2. test_camera_recording.py

    • 配置类的单元测试

    • 验证所有配置选项

核心设计#

1. CameraCfg(Camera配置)#

@configclass
class CameraCfg:
    res: tuple[int, int] = (1280, 720)          # 分辨率
    pos: tuple[float, float, float] = (3.5, 0.0, 2.5)  # 位置
    lookat: tuple[float, float, float] = (0.0, 0.0, 0.5)  # 目标
    fov: float = 40.0                            # 视野
    entity_name: Optional[str] = None            # 可选:挂载到entity
    link_name: Optional[str] = None              # 可选:挂载到link
    backend: Literal["rasterizer", "raytracer", "batch_renderer"] = "rasterizer"
    show_in_gui: bool = False

特点

  • 使用 @configclass(遵循GenesisLab规范)

  • 可以设为 None 来禁用camera

  • 支持静态camera和entity-attached camera

  • 支持三种backend(rasterizer/raytracer/batch_renderer)

2. RecordingCfg(Recording配置)#

@configclass
class RecordingCfg:
    enabled: bool = False                        # 启用/禁用
    save_path: str = "output/recording.mp4"     # 输出路径
    fps: int = 60                                # 帧率
    codec: str = "libx264"                       # 编码器
    codec_preset: str = "veryfast"               # 编码速度
    codec_tune: Optional[str] = "zerolatency"    # 编码优化
    render_rgb: bool = True                      # RGB
    render_depth: bool = False                   # Depth
    render_segmentation: bool = False            # Segmentation
    render_normal: bool = False                  # Normal

特点

  • 可以设为 Noneenabled=False 来禁用recording

  • 自动创建输出目录

  • 灵活的codec配置

  • 支持多种render模式

3. 集成到SceneCfg#

@configclass
class SceneCfg:
    # ... 其他字段 ...
    camera: CameraCfg = None      # 可选的camera配置
    recording: RecordingCfg = None  # 可选的recording配置

4. LabScene自动设置#

LabScene.build() 中:

  1. Scene build完成后

  2. 检查 cfg.camera 是否配置

  3. 如果配置了,调用 _setup_camera_and_recording()

  4. 创建camera(根据backend)

  5. 如果 cfg.recording.enabled=True,启动recording

使用示例#

基础用法(测试脚本)#

# Headless + 录制视频
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
    --headless \
    --record-video \
    --video-path output/amo_demo.mp4 \
    --camera-res 1920 1080 \
    --max-steps 500

# Headless 不录制(camera仍然配置,但不recording)
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
    --headless \
    --max-steps 500

# 带viewer(不需要camera/recording)
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
    --viewer \
    --max-steps 500

编程用法#

from genesislab.engine.scene import SceneCfg, CameraCfg, RecordingCfg

# 方式1:只配置camera(不录制)
cfg.scene.camera = CameraCfg(
    res=(1920, 1080),
    pos=(5.0, 0.0, 3.0),
    lookat=(0.0, 0.0, 0.5),
)
cfg.scene.recording = None  # 不录制

# 方式2:camera + recording
cfg.scene.camera = CameraCfg(
    res=(1920, 1080),
    pos=(5.0, 0.0, 3.0),
    lookat=(0.0, 0.0, 0.5),
)
cfg.scene.recording = RecordingCfg(
    enabled=True,
    save_path="output/video.mp4",
    fps=60,
)

# 方式3:禁用camera
cfg.scene.camera = None
cfg.scene.recording = None

测试验证#

配置测试#

python test_camera_recording.py

结果:

✅ CameraCfg OK
✅ RecordingCfg OK
✅ SceneCfg with camera/recording OK
✅ SceneCfg without camera OK

实际使用测试#

测试AMO脚本:

cd /home/ununtu/code/glab/genesislab
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
    --headless \
    --record-video \
    --video-path output/amo_test.mp4 \
    --video-fps 60 \
    --camera-res 1920 1080 \
    --camera-pos 5.0 0.0 3.0 \
    --max-steps 300

预期结果:

  1. 程序在headless模式运行

  2. 显示 “🎥 Video recording enabled” 消息

  3. 显示 “[LabScene] Started video recording: output/amo_test.mp4”

  4. 运行300 steps后

  5. output/amo_test.mp4 生成视频文件

技术细节#

Genesis API调用流程#

  1. Camera创建_setup_camera_and_recording

    camera = scene.add_camera(res=..., pos=..., lookat=...)
    # 或
    camera = scene.add_sensor(gs.sensors.RasterizerCameraOptions(...))
    
  2. Recording启动

    scene.start_recording(
        data_func=lambda: camera.render(rgb=True)[0],
        rec_options=gs.recorders.VideoFile(
            filename="output.mp4",
            fps=60,
            codec="libx264",
        ),
    )
    
  3. 自动录制

    • 每次 scene.step() 调用时

    • Genesis自动调用 data_func

    • 渲染camera并写入video file

  4. 停止录制(可选)

    scene.stop_recording()  # 手动停止
    # 或程序结束时自动停止
    

Entity Attachment#

如果配置了 entity_name

entity_idx = self._entities[cam_cfg.entity_name].gs_entity.idx
link_idx_local = entity.gs_entity.links_map[cam_cfg.link_name]

Camera会跟随entity/link移动。

Backend选择#

  • rasterizer: 默认,快速,适合大多数场景

  • raytracer: 高质量,慢,适合最终渲染

  • batch_renderer: 超快,适合大规模RL训练

关键改进#

  1. 向后兼容:保留 record_video_path,不破坏现有代码

  2. 灵活配置:camera和recording可以独立配置或禁用

  3. 遵循规范:使用 @configclass(符合GenesisLab规范)

  4. 清晰API:配置类语义明确,参数有文档

  5. 易于测试:配置类可以独立测试

  6. Headless支持:完全支持无viewer的渲染和录制

下一步#

用户可以:

  1. 运行测试脚本验证基础配置

  2. 使用AMO脚本测试实际录制

  3. 在自己的任务中集成camera和recording

  4. 根据需要调整camera参数和recording设置

命令行参数参考#

参数

类型

默认值

说明

--record-video

flag

False

启用视频录制

--video-path

str

output/amo_mesh_terrain.mp4

视频输出路径

--video-fps

int

60

视频帧率

--camera-res

int int

1920 1080

Camera分辨率

--camera-pos

float float float

5.0 0.0 3.0

Camera位置

--camera-lookat

float float float

0.0 0.0 0.5

Camera目标点

--camera-fov

float

45.0

视野角度

--headless

flag

False

禁用viewer

--viewer

flag

False

启用viewer

注意事项#

  1. Recording需要camera:如果 recording.enabled=True,必须配置 camera

  2. Headless模式:Camera在headless模式下正常工作,无需viewer

  3. 输出目录:自动创建,不需要手动mkdir

  4. 视频格式:建议使用 .mp4 后缀

  5. 性能:Recording会略微降低仿真速度(取决于分辨率和编码设置)