API 参考
本文按对象和用途说明 Lambda Sim 的常用 Python API、参数、返回值和调用约束。完整操作流程见快速开始,本页不重复机器人示例和环境安装步骤。
Lambda Sim 接口以 src/lambdasim/ 当前源码为准;LambdaRenderer、RenderConfig 和 RenderOutput 来自匹配版本的 path-tracer。签名摘要省略 self 和部分低频参数,... 表示仍有其他参数,不是需要传入的值。
1. API 概览
| 使用场景 | 模块 | 常用接口 |
|---|---|---|
| 场景导入与生命周期 | lambdasim.scene.scene | Scene、add_usd()、add_rigid_usd()、add_solid_usd()、finalize() |
| 状态、控制与推进 | lambdasim.scene.scene | get_model()、get_simdata()、add_solver()、upload_control()、step() |
| 相机与渲染 | lambdasim.scene.scene、path_tracer | add_sensor_camera()、LambdaRenderer、RenderConfig、RenderOutput |
| 刚体与机器人求解 | lambdasim.solvers.solver_mujoco | SolverMuJoCoMusa |
| 布料求解 | lambdasim.solvers.solver_verafiber | SolverVeraFiber |
| 刚体与布料单向耦合 | lambdasim.solvers.solver_mujoco_verafiber_oneway | SolverMuJoCoToVeraFiberOneWay |
| 程序化场景构建 | lambdasim.scene.builder | Builder |
| 几何与 USD 工具 | lambdasim.geometry、lambdasim.usd | Mesh、GeoType、get_mesh()、get_transform() |
| 辅助数据处理 | lambdasim.data_synth、lambdasim.data_synth_stitch | render_usd_camera_images()、stitch_data_synth_sequence() |
常用顺序为:构建或导入场景 → finalize() → 按需注册求解器 → 更新控制并推进状态 → 更新渲染器并生成图像。只做静态渲染或 USD 动画回放时,不需要注册动力学求解器。
项目依赖包括 ektro、alphacore-ektro、path-tracer、usd-core、imageio、imageio-ffmpeg 和 OpenImageIO;MuJoCo 流程还需要对应后端的 mujoco-warp。具体版本见 pyproject.toml。设备支持取决于所用组件,不能把数组支持 CPU 等同于整个渲染或求解流程支持 CPU。
2. 场景导入与生命周期
2.1 创建场景
from lambdasim.scene.scene import Scene
scene = Scene()
Scene() 返回空场景。导入和构建阶段准备场景数据,finalize() 创建运行时对象;两者都不会自动开始物理求解。
2.2 选择导入接口
| 接口 | 主要用途 | 返回值 |
|---|---|---|
Scene.add_usd() | 场景展示、渲染和已有 USD 动画回放 | 导入结果;常用auto、rigid、solid 路径返回字典 |
Scene.add_rigid_usd() | 通过刚体装配路径导入物体或关节机器人 | 刚体导入结果字典 |
Scene.add_solid_usd() | 导入固体力学所需的几何与约束,例如布料和软体 | 几何与约束导入结果字典 |
导入结果中的 Stage、路径映射和统计信息随入口而异,不是 Model 或 SimData。运行时对象应在 finalize() 后通过对应 getter 获取。
Scene.add_usd()
签名:
add_usd(
usd_path, prim_path="/", namespace="auto", imports=None,
ignore_paths=None, rigid_read_only=True,
time_code_mode="start", time_code=None,
hide_collision_shapes=False, force_show_colliders=False, static=False
)
| 参数 | 默认值 | 说明 |
|---|---|---|
usd_path | 必填 | USD、USDA 或 USDC 文件路径 |
prim_path | "/" | 导入根 Prim 路径 |
namespace | "auto" | 常用值为auto、rigid、solid;auto 按场景内容组织导入 |
imports | None | 显式导入列表,条目可包含root_path、namespace 和路径过滤信息 |
ignore_paths | None | 忽略的 Prim 路径 |
rigid_read_only | True | 使用刚体只读导入路径,适合展示和回放 |
time_code_mode | "start" | default、start 或 explicit |
time_code | None | explicit 模式使用的时间码 |
hide_collision_shapes | False | 隐藏碰撞形状的渲染显示 |
force_show_colliders | False | 强制显示碰撞形状 |
static | False | 是否导入到静态场景构建器 |
显式 imports 的命名空间仅支持 rigid 和 solid。重叠根路径等不符合导入契约的配置会被拒绝。
namespace="auto" 不等于自动装配可控制的机器人。交互式刚体或机器人应使用 add_rigid_usd();namespace="rigid"、未提供 imports 且 rigid_read_only=False 的调用会被拒绝。
Scene.add_rigid_usd()
签名摘要:
add_rigid_usd(
usd_path, prim_path="/", pos=(0, 0, 0), quat=(0, 0, 0, 1),
floating=None, base_joint=None, parent_body=-1,
collapse_fixed_joints=False, enable_self_collisions=True,
apply_up_axis_from_stage=False, joint_ordering="dfs",
skip_mesh_approximation=True, hide_collision_shapes=False, ...
)
| 参数 | 默认值 | 说明 |
|---|---|---|
usd_path、prim_path | 必填、"/" | 输入文件及导入根 Prim |
pos、quat | 零平移、单位四元数 | 导入时施加的根变换;四元数顺序为(x, y, z, w) |
floating | None | 是否为根节点创建自由关节;None 使用导入器默认处理 |
parent_body | -1 | 根节点关联的父 body;-1 为世界 |
collapse_fixed_joints | False | 是否合并固定关节连接的 body |
enable_self_collisions | True | 是否允许导入结构内部的自碰撞 |
joint_ordering | "dfs" | 关节遍历顺序,可选dfs 或 bfs |
skip_mesh_approximation | True | 是否跳过 USD 中声明的碰撞网格近似 |
hide_collision_shapes | False | 是否隐藏碰撞几何的渲染显示 |
body_gravcomp | 0.0 | 刚体重力补偿系数 |
joint_armature、joint_passive_damping、joint_friction | None | 关节惯性、被动阻尼和摩擦覆盖参数 |
joint_limits、locked_joints | None | 关节限位覆盖和锁定关节列表 |
驱动模式、增益、关节布局及碰撞数据应与求解器匹配。导入成功不表示已经建立了控制器或完成了物理参数验证。
Scene.add_solid_usd()
签名:
add_solid_usd(
geometry_usd, *, constraint_usd=None,
pos=(0, 0, 0), quat=(0, 0, 0, 1),
geometry_prim_path=None, constraint_prim_path="/",
constraint_mode="usd", apply_up_axis_from_stage=False,
time_code_mode="start", time_code=None, import_uvs=True, static=False
)
| 参数 | 默认值 | 说明 |
|---|---|---|
geometry_usd | 必填 | 几何 USD |
constraint_usd | None | 约束 USD;默认约束模式下必须提供 |
geometry_prim_path | None | 几何根路径;当前实现将None 解析为 /Geometry/SimMesh |
constraint_prim_path | "/" | 约束根路径 |
constraint_mode | "usd" | 从 USD 加载约束;"none" 表示不加载约束 |
pos、quat | 零平移、单位四元数 | 导入变换 |
import_uvs | True | 是否导入 UV |
apply_up_axis_from_stage | False | 是否应用 USD Stage 的 up-axis 变换 |
constraint_mode="usd" 缺少 constraint_usd 时会报错;"generated" 当前抛出 NotImplementedError,不能用来自动生成约束。几何、属性和约束必须满足实际求解器的数据要求。
2.3 创建和释放运行时对象
| 接口 | 返回值 | 说 明 |
|---|---|---|
finalize(device, env_num, primvar_map={}) | None | 创建指定设备和环境数量的Model、SimData、RenderScene |
get_model() | Model | 获取模型与物理参数 |
get_simdata() | SimData | 获取运行时状态和控制数据 |
get_render_scene() | RenderScene | 获取渲染场景 |
close() | None | 关闭场景运行时资源,保留 host 侧构建器数据 |
device 和 env_num 是 finalize() 的必填参数。primvar_map 用于传递自定义属性映射,通常可以省略。获取运行时对象、注册求解器或推进前必须完成 finalize();关闭场景后不要继续使用原运行时对象。
3. 状态、控制与推进
3.1 模型和状态对象
| 对象 | 获取方式 | 职责 |
|---|---|---|
Model | scene.get_model() | 场景结构、物理参数、标签及索引关系 |
SimData | scene.get_simdata() | 刚体位姿、关节状态、固体状态及控制缓冲区 |
RenderScene | scene.get_render_scene() | 渲染几何、变换、材质、相机和灯光 |
物理状态与渲染状态不是同一个对象。直接修改 SimData 不等于渲染器已经接收到更新;必要时需要同步渲染状态并调用渲染器的 update_scene()。
3.2 求解器注册与物理推进
| 接口 | 返回值 | 前提与行为 |
|---|---|---|
add_solver(solver) | 注册的求解器对象 | 先完成finalize();内部调用 solver.initialize(sim_data) |
remove_solver(*, close=True) | 原求解器或None | 移除当前求解器;默认调用其close(),保留场景运行时状态 |
upload_control() | None | 将当前控制数据交给已注册求解器 |
step(dt, sync_render=True) | None | 调用已注册求解器推进,默认同步渲染状态 |
sync_render_from_sim_data() | None | 将运行时物理状态同步到渲染场景 |
dt 必须为正的有限数值,表示此次推进的仿真时间。Scene 同时只允许一个活动求解器;耦合场景应注册组合求解器,而不是重复调用 add_solver()。
Scene.step() 已有动力学推进实现,但只有注册求解器后才会调用物理求解。未注册求解器时,不会自动生成物体运动。
使用 step(dt, sync_render=False) 时,通常 应在需要输出图像前调用一次 sync_render_from_sim_data();若启用了 USD 序列导出,捕获帧时仍会按导出需要同步状态。
3.3 关节控制与状态读取
以下方法均要求场景已完成 finalize():
| 接口 | 返回值或用途 |
|---|---|
get_joint_positions(joint_ids, env_index=0) | 返回所选关节的位置坐标 NumPy 数组 |
get_joint_velocities(joint_ids, env_index=0) | 返回所选关节的速度自由度 NumPy 数组 |
set_joint_position_targets(joint_ids, values, env_index=None) | 写入关节位置控制目标,返回None |
set_joint_velocity_targets(joint_ids, values, env_index=None) | 写入关节速度控制目标,返回None |
set_joint_effort_targets(joint_ids, values, env_index=None) | 写入力矩或力目标,返回None |
get_link_world_pose(body_id, env_index=0) | 返回(px, py, pz, qx, qy, qz, qw) |
joint_ids 是关节索引,不是展开后的自由度索引。位置状态按关节坐标数量组织,控制目标按关节自由度组织;不能假定每个关节都只对应一个数值。写入方法的 env_index=None 可作用于所有环境,数组形状必须匹配目标缓冲区。
控制目标应与关节驱动模式一致。设置目标后,通过 upload_control() 上传,再用 step() 推进;这不同于直接覆盖关节状态。
3.4 USD 动画回放
| 接口 | 返回值 | 说明 |
|---|---|---|
update_by_frame(frame=None) | None | 按 USD 时间采样更新场景状态 |
GetStartTimeCode() | float 或 None | 已导入回放数据的最小起始时间码 |
GetEndTimeCode() | float 或 None | 已导入回放数据的最大结束时间码 |
时间码不等于秒。update_by_frame() 回放已有 USD 数据,不运行控制器或动力学积分;物理推进应使用 step()。
4. 相机与渲染
4.1 相机接口
| 接口 | 返回值 | 说明 |
|---|---|---|
add_sensor_camera(pos=(0, 0, 0), lookat=(0, 0, -1), up=(0, 1, 0), vfov=60.0, focal_length=35.0, static=True) | 相机索引int | 添加传感器相机;相机索引从0 开始 |
set_camera_transform(camera_index, transform, env_index=None) | None | 设置相机额外的世界空间变换,要求已完成finalize() |
get_light_list() | list[int] | 获取当前渲染场景的灯光索引 |
set_camera_transform() 的 transform 是 7 个数值组成的序列,顺序为 (px, py, pz, qx, qy, qz, qw)。env_index=None 更新模型中的相机变换并同步所有环境;指定环境索引时只修改该环境的渲染变换。
相机选择与相机位姿修改是不同操作。set_camera_index() 只选择已有相机,不创建相机,也不改变其位姿。
4.2 渲染器接口
导入路径:
from path_tracer.config import EnvironmentLightMode, RenderConfig, RenderOutput
from path_tracer.lambda_renderer import LambdaRenderer
| 调用形式 | 作用 |
|---|---|
LambdaRenderer(render_scene, env_index, device_id=0) | 创建指定环境和 GPU 编号的渲染器 |
set_render_config(config) | 应用渲染配置 |
update_scene(render_scene, light_indices) | 更新场景和灯光,不接收相机索引 |
set_camera_index(camera_index) | 选择本次渲染使用的传感器相机 |
render() | 执行渲染,返回以输出通道名为键的字典 |
env_index 是场景环境索引,device_id 是 GPU 编号,二者不是相机索引。渲染设备应与模型使用的后端和设备匹配。
4.3 渲染配置与输出
下表列的是常用字段和示例配置值,不是全部字段的默认值。外部 path-tracer 的默认值和可用字段取决于安装版本。
| 字段 | 示例值 | 说明 |
|---|---|---|
enable_path_tracing | True | 启用路径追踪 |
width、height | 640、480 | 输出分辨率 |
spp | 32 | 每像素采样数 |
max_bounces | 6 | 路径最大反弹深度 |
output_mask | RenderOutput.COLOR | 选择需要返回的输出通道 |
use_env_light | True | 环境光开关 |
environment_light_mode | EnvironmentLightMode.DOME | 使用场景 Dome 环境;也可选择BUILTIN |
enable_denoising | False | ReLAX 降噪开关 |
enable_taa | False | TAA 开关 |
taa_max_accumulated_frames | 6 | TAA 历史累积长度 |
enable_oidn_denoising | True | OIDN 降噪开关,需要渲染器包含对应支持 |
ssaa | 1 | 超采样倍率,需安装版本支持 |
新版时序处理使用 enable_taa;不应继续用旧的 use_temp_denoiser 字段说明如何控制 TAA。向普通配置对象赋一个属性成功,并不能证明渲染器支持该字段。
RenderOutput 可以组合选择通道:
| 标志 | 返回字典的键 | 数据说明 |
|---|---|---|
RenderOutput.COLOR | "color" | 彩色图像,当前接口测试使用(height, width, 3) |
RenderOutput.DEPTH | "depth" | 深度数组,形状为(height, width) |
RenderOutput.SEGMENTATION | "segmentation" | 分割标识数组,当前接口测试使用(height, width, 2) |
例如 RenderOutput.COLOR | RenderOutput.DEPTH 请求彩色和深度。只读取已启用的返回键,不要将整个返回字典传给图像保存函数。
4.4 最小渲染调用
以下片段要求 scene 已完成 finalize(device="musa:0", env_num=1),包含可用相机,并且尚未关闭:
from path_tracer.config import RenderConfig, RenderOutput
from path_tracer.lambda_renderer import LambdaRenderer
renderer = LambdaRenderer(scene.get_render_scene(), 0, device_id=0)
config = RenderConfig()
config.enable_path_tracing = True
config.width = 640
config.height = 480
config.spp = 32
config.output_mask = RenderOutput.COLOR
renderer.set_render_config(config)
renderer.update_scene(scene.get_render_scene(), scene.get_light_list())
renderer.set_camera_index(0)
outputs = renderer.render()
image = outputs["color"]
物理推进后先确保渲染状态已同步,再更新渲染器。多相机输出时,同一物理时刻更新一次场景,然后遍历相机索引,逐个选择相机并渲染;不要为不同相机分别推进物理时间。