Camera Tracking Guide - 机器人跟踪摄像机#
概述#
GenesisLab的camera系统现在支持将camera attach到机器人上,实现跟随拍摄功能。Camera会在机器人的frame下运动,跟随机器人一起移动。
快速开始#
1. 追逐镜头(Chase Camera)- 推荐#
最常用的跟踪模式,镜头在机器人后方上方,拍摄效果类似电影追逐镜头:
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
--headless \
--record-video \
--camera-track chase \
--max-steps 500
2. 其他跟踪模式#
# 跟随镜头(更近,肩后视角)
--camera-track follow
# 侧面视角
--camera-track side
# 俯视视角
--camera-track top
# 第一人称视角
--camera-track first_person
# 静态镜头(不跟随)
--camera-track static
跟踪模式详解#
Chase(追逐镜头)⭐ 推荐#
位置:机器人后方 3.5m,上方 2.5m
视角:向前看
FOV: 50°
效果:电影感十足的追逐镜头
适用:展示、演示视频、宣传片
camera=CameraCfg(
track_mode="chase",
entity_name="robot",
)
Follow(跟随镜头)#
位置:机器人正后方 2.0m,略微侧面,高度 1.8m
视角:肩后视角,向前看
FOV: 45°
效果:类似第三人称游戏视角
适用:更近距离观察机器人动作
camera=CameraCfg(
track_mode="follow",
entity_name="robot",
)
Side(侧面视角)#
位置:机器人侧面 3.0m,高度 1.5m
视角:从侧面观察
FOV: 45°
效果:观察机器人步态、侧向动作
适用:步态分析、侧面展示
camera=CameraCfg(
track_mode="side",
entity_name="robot",
)
Top(俯视镜头)#
位置:机器人正上方 5.0m
视角:向下俯视
FOV: 60°
效果:鸟瞰视角
适用:路径规划、地形导航展示
camera=CameraCfg(
track_mode="top",
entity_name="robot",
)
First Person(第一人称)#
位置:机器人头部/躯干(pelvis link)
视角:向前看
FOV: 75°(广角)
效果:机器人的”眼睛”视角
适用:导航、感知任务展示
camera=CameraCfg(
track_mode="first_person",
entity_name="robot",
)
Static(静态镜头)#
位置:世界坐标系固定位置
视角:固定方向
效果:不跟随机器人,固定视角
适用:观察全局场景
camera=CameraCfg(
track_mode="static",
entity_name=None, # 不attach到entity
)
高级用法#
自定义跟踪参数#
可以在使用track_mode的同时,微调camera位置:
camera=CameraCfg(
track_mode="chase", # 使用chase预设
entity_name="robot",
pos=(-4.0, 0.5, 3.0), # 覆盖默认位置(更远,更高,略微偏右)
fov=55.0, # 覆盖默认FOV
)
完全自定义Entity-Attached Camera#
不使用预设,完全手动配置:
camera=CameraCfg(
entity_name="robot", # Attach到robot
link_name="pelvis", # Attach到pelvis link
pos=(-2.5, 1.0, 2.0), # 在link local frame中的偏移
lookat=(1.0, 0.0, 0.5), # 在link local frame中的目标方向
fov=50.0,
backend="rasterizer",
)
坐标系说明:
当
entity_name设置时,pos和lookat是在entity的local frame中对于人形机器人(如G1):
+X: 向前
+Y: 向左
+Z: 向上
所以
pos=(-3.0, 0.0, 2.0)表示:后方3m,上方2m
Attach到特定Link#
# Attach到头部
camera=CameraCfg(
entity_name="robot",
link_name="head", # 或你的机器人的头部link名称
pos=(0.1, 0.0, 0.05), # 头部前方
lookat=(1.0, 0.0, 0.0), # 向前看
fov=75.0,
)
# Attach到手部
camera=CameraCfg(
entity_name="robot",
link_name="right_hand", # 右手
pos=(0.05, 0.0, 0.0), # 手前方
lookat=(0.2, 0.0, 0.0), # 向前
fov=90.0, # 广角
)
命令行使用示例#
基础跟踪录制#
# Chase模式(默认)
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
--headless \
--record-video \
--video-path output/chase.mp4 \
--camera-track chase \
--max-steps 1000
# First person视角
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
--headless \
--record-video \
--video-path output/first_person.mp4 \
--camera-track first_person \
--max-steps 1000
# 侧面跟踪
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
--headless \
--record-video \
--video-path output/side.mp4 \
--camera-track side \
--max-steps 1000
微调跟踪参数#
# Chase模式,但更高的视角
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
--headless \
--record-video \
--camera-track chase \
--camera-fov 60 \
--max-steps 1000
完全自定义#
python third_party/genPiHub/scripts/amo/genesislab/play_amo_mesh_terrain.py \
--headless \
--record-video \
--camera-track custom \
--camera-pos -3.0 0.5 2.5 \
--camera-lookat 0.0 0.0 0.5 \
--camera-fov 50 \
--max-steps 1000
编程使用#
在Task Config中配置#
from genesislab.envs import ManagerBasedRlEnvCfg
from genesislab.engine.scene import SceneCfg, CameraCfg, RecordingCfg
@configclass
class MyTaskEnvCfg(ManagerBasedRlEnvCfg):
scene: SceneCfg = SceneCfg(
num_envs=1,
viewer=False,
# 使用chase跟踪模式
camera=CameraCfg(
res=(1920, 1080),
track_mode="chase",
entity_name="robot",
),
recording=RecordingCfg(
enabled=True,
save_path="output/training_demo.mp4",
fps=60,
),
)
运行时修改(在create_env_cfg中)#
def create_amo_mesh_terrain_env_config(args, ...):
cfg = AmoGenesisEnvCfg()
# 配置chase camera跟踪机器人
cfg.scene.camera = CameraCfg(
res=(1920, 1080),
track_mode="chase",
entity_name="robot", # 跟踪名为"robot"的entity
)
# 可选:录制视频
if args.record_video:
cfg.scene.recording = RecordingCfg(
enabled=True,
save_path=args.video_path,
fps=60,
)
return cfg
技术细节#
Camera Attachment原理#
Entity Index:找到要attach的entity的索引
Link Index:在entity内找到要attach的link索引
Local Frame:Camera的pos/lookat在link的local frame中
自动跟随:每个simulation step,camera自动跟随link运动
坐标变换#
Camera的位置通过以下变换计算:
camera_world_pos = link_world_transform * camera_local_pos
所以camera会:
跟随link的平移
跟随link的旋转
保持相对link的固定offset
查找可用Links#
如果不确定entity有哪些links:
# 在env初始化后
entity = env.scene.entities["robot"]
links = entity.gs_entity.links_map
print("Available links:", list(links.keys()))
常见的人形机器人links:
pelvis,base_link,torso- 躯干head- 头部left_hand,right_hand- 手left_foot,right_foot- 脚
性能考虑#
Rasterizer backend(默认):快速,适合实时跟踪
Entity attachment:几乎无额外开销(Genesis原生支持)
分辨率影响:
1920x1080: 适合高质量视频,略微降低速度
1280x720: 平衡质量和速度
640x480: 最快,适合调试
常见问题#
Q: Camera不跟随机器人?#
检查:
是否设置了
entity_name="robot"Entity名称是否正确(默认是”robot”)
是否在scene build之后设置camera
Q: Camera视角奇怪?#
检查
pos坐标是否在entity的local frame中对于人形机器人,+X是前方,-X是后方
尝试使用预设的track_mode
Q: 如何让camera”看向”机器人?#
如果想要camera在世界坐标系某个位置,但”看向”移动的机器人:
# 这需要自定义实现,暂不支持
# 当前的lookat也是在entity local frame中
Q: 支持多个camera吗?#
当前实现每个scene支持一个camera。如果需要多个camera,需要手动使用Genesis API:
cam1 = scene.gs_scene.add_sensor(gs.sensors.RasterizerCameraOptions(...))
cam2 = scene.gs_scene.add_sensor(gs.sensors.RasterizerCameraOptions(...))
示例视频效果对比#
Track Mode |
视角描述 |
适用场景 |
|---|---|---|
|
电影追逐镜头,远距离跟随 |
展示、宣传片 |
|
肩后视角,中距离跟随 |
第三人称游戏风格 |
|
侧面跟随 |
步态分析 |
|
俯视跟随 |
路径规划 |
|
第一人称视角 |
导航、感知任务 |
|
固定不动 |
全局场景观察 |
下一步#
尝试不同的track_mode
录制对比视频
根据任务选择最佳视角
微调camera参数以获得最佳效果