Camera and Recording Implementation Summary#
实现的功能#
✅ 完成所有需求:
✅ 对env添加config,配置camera用于headless render and save
✅ 视频recording功能
✅ 都在headless模式下完成
✅ 通过config进行配置
✅ camera可以留空(设为None)
文件结构#
新增文件#
-
CameraCfg: Camera配置类(使用@configclass)RecordingCfg: Recording配置类(使用@configclass)支持所有Genesis camera参数和recording选项
修改文件#
-
添加
camera: CameraCfg = None字段添加
recording: RecordingCfg = None字段保留旧的
record_video_path以保持向后兼容
-
添加
_setup_camera_and_recording()方法添加
cameraproperty添加
render_camera()方法在
build()中集成camera和recording设置
-
导出
CameraCfg和RecordingCfg
-
添加camera和recording的命令行参数
在env配置中使用新的CameraCfg和RecordingCfg
支持headless模式下的视频录制
文档文件#
-
完整的使用指南和示例
配置参数参考
常见问题解答
-
配置类的单元测试
验证所有配置选项
核心设计#
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
特点:
可以设为
None或enabled=False来禁用recording自动创建输出目录
灵活的codec配置
支持多种render模式
3. 集成到SceneCfg#
@configclass
class SceneCfg:
# ... 其他字段 ...
camera: CameraCfg = None # 可选的camera配置
recording: RecordingCfg = None # 可选的recording配置
4. LabScene自动设置#
在 LabScene.build() 中:
Scene build完成后
检查
cfg.camera是否配置如果配置了,调用
_setup_camera_and_recording()创建camera(根据backend)
如果
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
预期结果:
程序在headless模式运行
显示 “🎥 Video recording enabled” 消息
显示 “[LabScene] Started video recording: output/amo_test.mp4”
运行300 steps后
在
output/amo_test.mp4生成视频文件
技术细节#
Genesis API调用流程#
Camera创建(
_setup_camera_and_recording)camera = scene.add_camera(res=..., pos=..., lookat=...) # 或 camera = scene.add_sensor(gs.sensors.RasterizerCameraOptions(...))
Recording启动
scene.start_recording( data_func=lambda: camera.render(rgb=True)[0], rec_options=gs.recorders.VideoFile( filename="output.mp4", fps=60, codec="libx264", ), )
自动录制
每次
scene.step()调用时Genesis自动调用
data_func渲染camera并写入video file
停止录制(可选)
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训练
关键改进#
向后兼容:保留
record_video_path,不破坏现有代码灵活配置:camera和recording可以独立配置或禁用
遵循规范:使用
@configclass(符合GenesisLab规范)清晰API:配置类语义明确,参数有文档
易于测试:配置类可以独立测试
Headless支持:完全支持无viewer的渲染和录制
下一步#
用户可以:
运行测试脚本验证基础配置
使用AMO脚本测试实际录制
在自己的任务中集成camera和recording
根据需要调整camera参数和recording设置
命令行参数参考#
参数 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
flag |
False |
启用视频录制 |
|
str |
output/amo_mesh_terrain.mp4 |
视频输出路径 |
|
int |
60 |
视频帧率 |
|
int int |
1920 1080 |
Camera分辨率 |
|
float float float |
5.0 0.0 3.0 |
Camera位置 |
|
float float float |
0.0 0.0 0.5 |
Camera目标点 |
|
float |
45.0 |
视野角度 |
|
flag |
False |
禁用viewer |
|
flag |
False |
启用viewer |
注意事项#
Recording需要camera:如果
recording.enabled=True,必须配置cameraHeadless模式:Camera在headless模式下正常工作,无需viewer
输出目录:自动创建,不需要手动mkdir
视频格式:建议使用
.mp4后缀性能:Recording会略微降低仿真速度(取决于分辨率和编码设置)