You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SDF中而非解析后将Drake(pydrake)中的桌体焊接到世界坐标系?

解决方案

当然可以在SDF内直接完成桌体到世界坐标系的固定,不需要后续通过Python代码操作。以下是具体实现方式:

核心思路

你之前尝试的drake:parent标签之所以无效,是因为当table作为子模型被包含在iiwa_and_table父模型内部时,该标签只会将table的父框架设置为父模型的根框架,而非世界坐标系。要直接固定到世界,有两种可靠方式:

方式一:添加固定关节连接桌体与世界

在你的SDF中,直接新增一个fixed类型的关节,将桌体的主体框架与世界坐标系绑定。修改后的完整SDF如下:

<?xml version="1.0" ?>
<sdf version="1.7">
  <model name="iiwa_and_table">
    <include>
      <uri>package://drake/manipulation/models/iiwa_description/urdf/iiwa14_spheres_collision.urdf</uri>
      <name>robot</name>
      <pose>0 0 0 0 0 0</pose>
    </include>
    <include>
      <uri>src/mast/descriptions/sdf/table.sdf</uri>
      <name>table</name>
      <pose>0 0 -0.5 0 0 0</pose>
    </include>
    <!-- 固定机械臂到桌体 -->
    <joint name="static_joint" type="fixed">
      <parent>table::table</parent>
      <child>robot::base</child>
      <pose>0 0 0 0 0 0</pose>
    </joint>
    <!-- 将桌体直接固定到世界坐标系 -->
    <joint name="table_to_world" type="fixed">
      <parent>world</parent>
      <child>table::table</child>
      <pose>0 0 0 0 0 0</pose>
    </joint>
  </model>
</sdf>

这里新增的table_to_world关节会在加载模型时自动将桌体固定到世界坐标系,include标签里的pose参数已经指定了桌体相对于世界的偏移量,无需额外调整。

方式二:将桌体设为静态模型

如果你的table.sdf中,模型本身已经设置了<static>true</static>属性,那么桌体会自动被固定到世界坐标系,此时甚至不需要添加额外关节。你可以检查table.sdf的内容,比如:

<!-- table.sdf 示例 -->
<sdf version="1.7">
  <model name="table" static="true">
    <!-- 桌体的链接、碰撞等定义 -->
  </model>
</sdf>

只要static属性为true,加载时桌体就会直接固定在include指定的pose位置,无需后续代码操作。

验证效果

使用修改后的SDF加载模型时,你可以完全移除Python代码中self.plant.WeldFrames(...)这部分逻辑,桌体和机械臂的位置关系会自动按照SDF定义生效。

内容的提问来源于stack exchange,提问作者L Wall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:10:35