3. 配置关节驱动器

配置关节驱动器 学习卡片

任务目标

在Isaac Sim中为机器人关节配置驱动器(Articulation Drive),实现位置、速度或力控制模式的选择与参数设置,并通过Python API验证配置结果。

核心实现

本案例使用Isaac Sim自带的cartpole资产,演示如何通过Python脚本为关节配置驱动器。核心操作包括:获取关节驱动器、设置控制模式(位置/速度/力)、调整驱动刚度与阻尼参数。

from isaacsim import SimulationApp
sim_app = SimulationApp({"headless": False})

from isaacsim.core.api import World
from isaacsim.core.utils.stage import add_reference_to_stage
from isaacsim.core.utils.prims import get_prim_at_path
from isaacsim.core.api.articulations import ArticulationView
import omni.usd
import carb

# 1. 加载cartpole资产
assets_root_path = "/Isaac/Samples/Articulations/Stage/cartpole.usd"
add_reference_to_stage(usd_path=assets_root_path, prim_path="/World/Cartpole")

# 2. 创建世界并获取articulation视图
world = World()
world.scene.add_default_ground_plane()
articulation_view = ArticulationView(prim_paths_expr="/World/Cartpole", name="cartpole_view")
world.reset()

# 3. 获取关节驱动器并配置
# cartpole包含两个关节:cart_joint(棱柱关节)和pole_joint(旋转关节)
drive_paths = ["/World/Cartpole/cart_joint", "/World/Cartpole/pole_joint"]

for path in drive_paths:
    prim = get_prim_at_path(path)
    drive = omni.usd.get_context().get_stage().GetPrimAtPath(path)
    
    # 获取或创建PhysicsJointDriveAPI
    from pxr import UsdPhysics
    drive_api = UsdPhysics.DriveAPI.Apply(drive, "angular" if "pole" in path else "linear")
    
    # 设置控制模式:位置控制(position)、速度控制(velocity)、力控制(force)
    # 此处演示位置控制模式
    drive_api.GetTargetPositionAttr().Set(0.0)
    drive_api.GetTargetVelocityAttr().Set(0.0)
    
    # 设置驱动参数
    if "cart" in path:
        # 线性驱动:刚度与阻尼
        drive_api.GetStiffnessAttr().Set(10000.0)
        drive_api.GetDampingAttr().Set(100.0)
        drive_api.GetMaxForceAttr().Set(1000.0)
    else:
        # 旋转驱动
        drive_api.GetStiffnessAttr().Set(500.0)
        drive_api.GetDampingAttr().Set(50.0)
        drive_api.GetMaxForceAttr().Set(500.0)

# 4. 验证配置
def verify_drive_config():
    stage = omni.usd.get_context().get_stage()
    for path in drive_paths:
        prim = stage.GetPrimAtPath(path)
        drive_api = UsdPhysics.DriveAPI.Get(prim, "linear" if "cart" in path else "angular")
        stiffness = drive_api.GetStiffnessAttr().Get()
        damping = drive_api.GetDampingAttr().Get()
        max_force = drive_api.GetMaxForceAttr().Get()
        print(f"关节 {path.split('/')[-1]}: 刚度={stiffness}, 阻尼={damping}, 最大力={max_force}")

# 5. 仿真步进验证
for i in range(10):
    world.step(render=True)
    if i == 5:
        # 施加位置指令
        articulation_view.set_joint_position_targets([0.5, 0.3])

verify_drive_config()
sim_app.close()

运行与验证

  1. 运行环境:Isaac Sim 2023.1及以上版本,需启用omni.isaac.core扩展
  2. 执行方式:将代码保存为configure_drive.py,在Isaac Sim的Python环境中运行:./python.sh configure_drive.py
  3. 通过条件:
    • 控制台输出两个关节的驱动器参数,刚度/阻尼值与代码设置一致
    • 视口中cartpole的cart关节在位置指令0.5m处稳定,pole关节在0.3rad附近
    • 仿真过程中无物理错误或关节抖动

控制模式切换说明

如需切换为速度控制,将drive_api.GetTargetPositionAttr().Set(0.0)替换为drive_api.GetTargetVelocityAttr().Set(0.5),并设置GetStiffnessAttr().Set(0.0)(速度控制时刚度应为0)。力控制模式则直接通过GetMaxForceAttr()施加恒定力,同时将刚度和阻尼设为0。

关节驱动器配置流程 获取关节Prim DriveAPI.Apply 控制模式 位置/速度/力 刚度/阻尼 验证

常见问题

  • 关节名称错误:使用articulation_view.get_dof_names()确认实际关节名称
  • 驱动类型不匹配:棱柱关节使用"linear",旋转关节使用"angular"
  • 参数不生效:确保在world.reset()之后设置驱动器参数