datetime:2025/12/27 12:51
author:nzb
该项目来源于mujoco_learning
worldbody

geom
type="[plane/hfield/sphere/capsule/ellipsoid/cylinder/box/mesh/sdf]size="0 0 0"(三个参数根据type选择填写)
| type | size参数量 | 描述 |
|---|---|---|
| plane | 3 | X 半长;Y半长;渲染时网格线间距。如果 X half-size或 Y half-size 为 0,则平面在尺寸为 0 的维度中呈现为无限 |
| hfield | 0 | 将忽略几何大小,并改用高度字段大小 |
| sphere | 1 | 球体的半径 |
| capsule | 1 or 2 | 胶囊两侧半球半径;不使用 fromto 时cylinder部分的半长,给了fromto就不要给size的第二个参数 |
| ellipsoid | 3 | X半径;Y 半径;Z 半径 |
| cylinder | 1 or 2 | 圆柱体半径;不使用 fromto 时的半长,给了fromto就不要给size的第二个参数 |
| box | 3 | X半长;Y半长;Z半长 |
| mesh | 0 | 将忽略几何尺寸,改用网格尺寸 |
pos="0 0 0"(在几何世界的位置)condim="[1/3/4/6]"摩擦计算(见下表)
| condim | Description |
|---|---|
| 1 | 无摩擦接触 |
| 3 | 有规律的摩擦接触,在切线平面上有相反的滑移 |
| 4 | 摩擦接触,切线平面的反向滑移和围绕接触法线的旋转。这是 可用于对软接触进行建模(与接触穿透无关) |
| 6 | 摩擦接触、切线平面内的反滑移、围绕接触法线旋转和旋转 围绕切线平面的两个轴。后一种摩擦效应有助于预防 无限滚动的对象 |
material="xxx"(材质名)rgba="0 0 0 0"(几何体颜色,比材质省资源)friction="1 0.005 0.0001"(滑动,扭矩,滚动摩擦系数)mass(质量,单位kg,它和密度只能有一个),density="0"(密度,单位kg/m³,它和质量拼了)shellinertia=[true/false](开了就是质量集中在边缘,关了就是均匀密度)fromto="0 0 0 0 0 0"(类似旋转通常代替旋转+长度,只能用于胶囊、盒子、圆柱体和椭球体,前三个是point1,后三个point2,几何体的Z轴正方向为point2->point1),能代表几何体的姿态和长度了quat, axisangle, xyaxes, zaxis, euler
- quat:wxyz,isaac gym:xyzw
- euler:xyz
priority="0"(碰撞优先级)- contype: 碰撞参数是一个32位的掩码,用于代表geom的碰撞类型。
- conaffinity 是geom可以和什么类型的geom发生碰撞,也是一个32位的掩码。
地板(plane)演示:
<texture name="grid" type="2d" builtin="checker" width="2048" height="2048" rgb1=".3 .4 .8" rgb2=".9 .9 .9" />
<geom name="ground" type="plane" size="100 100 .01" material="grid" />
球体演示:
<geom type="sphere" material="metal_material" size="1" mass="1"/>
胶囊/圆柱演示:
<geom type="capsule/cylinder" material="metal_material" size="1 2" mass="1"/>
立方体/椭球演示:
<geom type="box/ellipsoid" material="metal_material" size="1 2 1" mass="1"/>
自定义演示:
<msh name="forearm" file="forearm.stl"/>
<geom type="mesh" mesh="forearm" material="metal_material"/>
site
简易版geom,不作为碰撞体积和质量计算,只能使用简易几何体,用于标点,适用于在某些小部位安装传感器或者小结构渲染等,其属性和geom非常相近
body
在运动仿真过程中我们要实现整个机器人模型,也就是身体(骨骼+关节)拼接出来及对应body,gemo和joint,多个body嵌套就是机器人整体,整体也是呈树状嵌套。
在添加joint之前我们先学习一下mujoco中body的坐标树规则,这个和ros的tf树很像,可以类比。机器人对于世界有一个坐标,机器人每个坐标系都是基于上一个坐标系的相对位置,其中body在循环嵌套,每一层中的gemo都是对于这一层的body的相对位置,每个body的坐标都是对于上一个body的相对位置。这和tf树模式几乎差不多,就如下图一样:
嵌套演示:
<body name="support" pos="0 0 1">
<!-- 不加freejoint的body,默认是fixed,悬在空中的body -->
<!-- 一个body只能有一个freejoint,嵌套的也是在最外面一层,在里面body添加会报错 -->
<!-- 整个机器人啊,想在空间活动,你机器人内部的Joint是通过你的关节约束的,而但是它的空间自由度,只能是作为整个机器人整体,那也就是最外层才可以才可以添加freejoint释放的 -->
<freejoint/>
<geom type="cylinder" mass="100" size="0.05 0.5" rgba="0.2 0.2 0.2 1" />
<geom type="sphere" pos="0 0 0" mass="100" size="0.1" rgba="0 0 1 1" />
<body name="motor" pos="0 0 0.5">
<geom type="sphere" mass="100" size="0.1" rgba="0 0 0 0.3" />
<body name="motor2" pos="0 0 0">
<geom type="cylinder" mass="100" size="0.1 0.1" rgba="0 0 0 0.3" />
</body>
</body>
</body>