如何在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
相关产品推荐
相关产品推荐

