问题:对于这种结构的usd如何创建节点,添加碰撞体和刚体属性能否在最高层级xform设置,还是要一个一个设置,然后要把bas_01下面除了base_02下级的mesh与base_02下面的mesh设置关节,该如何设置
答:
可以按“一个运动部件 = 一个 link”的方式创建。你现在的层级需要先调整:
Root Xform + Articulation Root ├── base_01 Xform + Rigid Body │ ├── mesh21 │ ├── mesh22 │ └── 其他属于 base_01 的 Mesh ├── base_02 Xform + Rigid Body │ └── base_02 下的 Mesh └── base_03 Xform + Rigid Body关键点:
Root:只作为总容器和 Articulation Root,通常不要添加 Rigid Body。base_01/base_02/base_03:每个 Xform 添加一个 Rigid Body。- Mesh:每个 Mesh 添加 Collision。可以一次多选同一 link 下的所有 Mesh 批量添加,不需要逐个手动操作。
- 不要给每个 Mesh 添加 Rigid Body,否则会形成大量相互嵌套的刚体。
- 如果
base_02现在位于base_01下面,应先把base_02移到Root下,成为base_01的兄弟节点,并选择保持世界坐标。
你描述的“base_01下的 Mesh 与base_02下的 Mesh 设置关节”,实际应该是:
Joint_base01_base02 body0 = /Root/base_01 body1 = /Root/base_02 type = Revolute不要把 Mesh 和 Mesh 直接连接关节。base_01下所有相对固定的 Mesh 都属于同一个 link,不需要相互添加关节。关节连接的是两个刚体 Xform。
在 Isaac Sim 中大致操作:
- 重新整理
base_01、base_02、base_03为 Root 的直接子节点。 - 选中每个 link 下的 Mesh,执行
Physics/Colliders/Add。 - 选中
base_01、base_02、base_03,分别添加Rigid Body。 - 给
Root添加Articulation Root。 - 创建
Revolute Joint。 - 设置:
body0:父 link,例如base_01body1:子 link,例如base_02local pose 0/1:对齐关节位置axis:对齐旋转轴lower/upper limit:设置角度范围
如果base_01与base_02之间只是固定连接,则使用Fixed Joint,不要使用 Revolute Joint。
最终导出前应检查 URDF:
<link name="base_01"/> <link name="base_02"/> <joint name="joint_base01_base02" type="revolute"> <parent link="base_01"/> <child link="base_02"/> </joint>你现在的 USD 导出成只有一个Rootlink,说明需要先完成上述刚体和关节结构,不能只添加碰撞体就解决。