我是在Ubuntu22.04下操作的~
想要实现机器人相关控制,你需要正确地安装ROS2、mujoco等~
关于URDF
URDF(Universal Robot Description Format)是一种用于描述机器人模型的标准格式,其实就相当于3维模型~ 常用于仿真。URDF文件(.urdf
)通常以XML格式编写,允许定义机器人的链接(links)、关节(joints)、材料(materials)、碰撞(collisions)、视觉(visuals)等属性。
URDF代码结构主要包括<robot>
、<link>
、<joint>
等。
因为URDF是XML语法,所以先了解下xml基本语法:
-
以尖括号(
< >
)包围的元素,各元素可以是自闭合的(如<mesh/>
)或有开始和结束标记(如<link></link>
)。元素之间可以嵌套,内容可以是文本、属性或其他子元素。属性通过name
-value
对的形式书写在开始标签内,详述了元素的特性。而一个基本的URDF文件通常会以<?xml version="1.0"?>
作为开头声明文件版本。紧接着是根元素<robot>
标签,这个标签有一个属性name
,用来指定机器人的名称。 -
在
<robot>
标签内部,可以定义多个<link>
标签来表示机器人上的各个部件或关节末端。每个<link>
可以包含几何信息,如碰撞体(collision)、可视化模型(visual)等,这些信息通过<geometry>
标签及其子标签如<mesh>
、<box>
、<cylinder>
等来描述。 -
此外,
<joint>
标签用来定义连接不同<link>
的关节。每个<joint>
标签同样有若干属性,包括定义关节名称的name
、描述关节类型的type
(如revolute、prismatic等),以及定义关节所连接的父链接和子链接的parent
和child
属性。关节还可以定义运动范围限制(limit)、物理属性(如摩擦力friction)等细节,这些都是通过<limit>
、<dynamics>
等子标签实现的。 -
xml允许使用注释
<!-- -->
来标注说明性的文字。
一个简单的机械臂URDF,给大家看下~
<?xml version="1.0"?>
<robot name="simple_arm">
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</visual>
<collision>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="link1">
<visual>
<geometry>
<cylinder radius="0.02" length="0.5"/>
</geometry>
</visual>
<collision>
<geometry>
<cylinder radius="0.02" length="0.5"/>
</geometry>
</collision>
</link>
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.25" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="0" upper="1.57" effort="10" velocity="1"/>
</joint>
</robot>
URDF网上资料很多,具体细节就不赘述了~
MuJoCo导入URDF模型的步骤:
mujuco3.x版本以上支持直接导入urdf,对于所导入的urdf/xml,这里有详细介绍:官网xml格式介绍,非常全
- 首先在你的工作目录下把你的
urdf
文件(假设为robot.urdf
)拷贝过来~ - 在
urdf
文件的开头部分,robot
标签之后添加<mujoco>
标签,如下:
<?xml version="1.0" ?>
<robot name="XXX">
<mujoco>
<compiler
meshdir="meshes/"
balanceinertia="true"
discardvisual="false" />
</mujoco>
可以看到我们添加了<compiler>
标签,它是用于设置内置解析器和编译器的选项,还有一些其他的参数,辛苦整理了一下:
参数 | 类型 | 默认值 | 说明 | 使用示例 |
---|---|---|---|---|
autolimits | [false, true] | true | 影响关节、肌腱等的限制属性。若为“true”,根据范围属性自动推断限制,反之则需要手动指定。 | <compiler autolimits="false"/> |
boundmass | 实数 | 0 | 设置每个物体的最小质量下限。可用于修复质量为零的物体。 | <compiler boundmass="0.1"/> |
boundinertia | 实数 | 0 | 设置每个物体的惯性成分的最小下限。 | <compiler boundinertia="0.01"/> |
settotalmass | 实数 | -1 | 若为正值,编译器将缩放所有物体的质量,使总质量等于该值。 | <compiler settotalmass="5"/> |
balanceinertia | [false, true] | false | 确保惯性矩阵满足特定条件,遇到不满足条件的模型时将自动调整惯性成分。 | <compiler balanceinertia="true"/> |
strippath | [false, true] | false (MJCF) / true (URDF) | 去除文件名中的路径信息,便于跨系统加载模型。 | <compiler strippath="true"/> |
coordinate | [local, global] | local | 定义坐标系,注意“global”选项已被移除。 | <compiler coordinate="local"/> |
angle | [radian, degree] | degree (MJCF) / radian (URDF) | 定义角度单位。所有角度在最终模型中始终以弧度表示。 | <compiler angle="degree"/> |
fitaabb | [false, true] | false | 使用轴对齐边界框(aabb)进行网格拟合;若为“false”,则使用等效惯性盒。 | <compiler fitaabb="true"/> |
eulerseq | 字符串 | xyz | 确定欧拉旋转的顺序,由三个字符(x、y、z, X, Y, Z)组成。 | <compiler eulerseq="zyx"/> |
meshdir | 字符串 | 可选 | 查找网格和高度场文件的目录。 | <compiler meshdir="/path/to/meshes"/> |
texturedir | 字符串 | 可选 | 查找纹理文件的目录。 | <compiler texturedir="/path/to/textures"/> |
assetdir | 字符串 | 可选 | 同时设置meshdir 和texturedir 。 | <compiler assetdir="/path/to/assets"/> |
discardvisual | [false, true] | false (MJCF) / true (URDF) | 丢弃所有纯视觉元素,优化模型的计算效率。 | <compiler discardvisual="true"/> |
convexhull | [false, true] | true | 为所有网格生成凸包,以加速碰撞检测。 | <compiler convexhull="false"/> |
usethread | [false, true] | true | 指定编译器是否以多线程模式运行,当前用于计算执行器的长度范围和加载网格。 | <compiler usethread="true"/> |
fusestatic | [false, true] | false (MJCF) / true (URDF) | 控制静态物体与其父物体合并的优化特性,适用于URDF模型。 | <compiler fusestatic="true"/> |
inertiafromgeom | [false, true, auto] | auto | 控制是否通过物体附带的几何体自动推断质量和惯性。 | <compiler inertiafromgeom="true"/> |
exactmeshinertia | [false, true] | false | 计算网格惯性的算法,若为“true”,则对任意闭合网格几何体精确。 | <compiler exactmeshinertia="true"/> |
alignfree | [false, true] | false | 开启后,带自由关节的物体会自动与惯性框对齐,提高稳定性和速度。 | <compiler alignfree="true"/> |
inertiagrouprange | 整数 | 0 5 | 指定用于推断质量和惯性的几何体组范围。 | <compiler inertiagrouprange="0 3"/> |
- 随后新建
meshes
文件夹,然后把urdf用到的所有模型文件都放入进去如.stl/.dae/.obl/.mtl
注意meshes在同级目录下
- 新建一个python文件,添加代码:
import mujoco
import mujoco.viewer as viewer
# viewer.launch()
viewer.launch_from_path("robot.urdf")
运行代码,即可仿真,但是模型一直剧烈抖动,因为没加<actuator>
标签~