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()
运行与验证
- 运行环境:Isaac Sim 2023.1及以上版本,需启用omni.isaac.core扩展
- 执行方式:将代码保存为
configure_drive.py,在Isaac Sim的Python环境中运行:./python.sh configure_drive.py - 通过条件:
- 控制台输出两个关节的驱动器参数,刚度/阻尼值与代码设置一致
- 视口中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。
常见问题
- 关节名称错误:使用
articulation_view.get_dof_names()确认实际关节名称 - 驱动类型不匹配:棱柱关节使用
"linear",旋转关节使用"angular" - 参数不生效:确保在
world.reset()之后设置驱动器参数