我们从这篇文章开始,在代码实战中将有一个系列教程(或者说探索)——那就是Mujoco引擎的研究。
在此之前,先来扫一下盲。也就是我们Mujoco是什么。我们为什么要研究Mujoco?以防止大家不知道。
不过如果对具身智能有一定了解或者熟悉的同学,想必都应该知道它是什么。因为在仿真里会经常用到它。
Mujoco是什么?
Mujoco 是一个物理仿真引擎,主要用于机器人和生物力学模拟。它由斯坦福大学开发,后来被 DeepMind 收购。特点包括高效、精确,支持多体动力学,接触检测,以及实时仿真。应用领域包括机器人控制、AI 研究、生物医学工程等。
它的核心技能有三个:
-
算得又快又准:用自家研发的多体动力学算法,能精确计算机械臂、软体机器人这类复杂结构的运动轨迹,连碰撞摩擦都能模拟得像模像样。
-
实时互动:游戏级的渲染引擎,能让你边调参数边看机器人跳舞,特别适合调试控制算法。
-
兼容各种脑洞:不管是双足机器人后空翻,还是仿生鱼在虚拟水里扑腾,甚至细胞级的生物力学模型,它都能轻松拿捏。
为啥工程师们都爱用它?
因为它比 MATLAB 更贴近现实,比游戏引擎更懂物理,还支持 Python/C++ 无缝对接。从斯坦福实验室到波士顿动力的机械狗,从 DeepMind 的 AI 训练到假肢设计,Mujoco 几乎成了机器人领域的「行业标配」。
好。那我们这篇文章,主要来介绍Mujoco中,物体是怎么表示的。
主要是对于它的一些基础的数据结构来做介绍。
有关于物体,它的核心主要是两个内容,一个是MjData,还有一个是MjModel。
大家可以来参考这个文档: Types - MuJoCo Documentation
我们这篇文章,主要就来介绍这俩结构体。
1、首先来看MjData:
大家可以直接在这里搜:
搜出来的第一个,点击后就能看到跳到这个锚点。
那么能够发现,这个数据结构非常非常非常非常地长。
但是个人认为,其中最核心的是这几个:
//-------------------- POSITION dependent
// computed by mj_fwdPosition/mj_kinematics
mjtNum* xpos; // Cartesian position of body frame (nbody x 3)
mjtNum* xquat; // Cartesian orientation of body frame (nbody x 4)
mjtNum* xmat; // Cartesian orientation of body frame (nbody x 9)
mjtNum* xipos; // Cartesian position of body com (nbody x 3)
mjtNum* ximat; // Cartesian orientation of body inertia (nbody x 9)
mjtNum* xanchor; // Cartesian position of joint anchor (njnt x 3)
mjtNum* xaxis; // Cartesian joint axis (njnt x 3)
mjtNum* geom_xpos; // Cartesian geom position (ngeom x 3)
mjtNum* geom_xmat; // Cartesian geom orientation (ngeom x 9)
mjtNum* site_xpos; // Cartesian site position (nsite x 3)
mjtNum* site_xmat; // Cartesian site orientation (nsite x 9)
mjtNum* cam_xpos; // Cartesian camera position (ncam x 3)
mjtNum* cam_xmat; // Cartesian camera orientation (ncam x 9)
mjtNum* light_xpos; // Cartesian light position (nlight x 3)
大家也可以从这几个开始学习。
我们下面给出这几个变量含义的详细解释:
-
xpos
:存储每个刚体(body)坐标系的笛卡尔位置,形状为(nbody x 3)
,即每个刚体对应 3 个值,分别代表x
、y
、z
坐标。 -
xquat
:存储每个刚体坐标系的笛卡尔方向,使用四元数表示,形状为(nbody x 4)
。四元数是一种用于表示三维旋转的数学工具。 -
xmat
:同样存储每个刚体坐标系的笛卡尔方向,但使用旋转矩阵表示,形状为(nbody x 9)
,因为一个 3x3 的旋转矩阵有 9 个元素。 -
xipos
:存储每个刚体质心(center of mass)的笛卡尔位置,形状为(nbody x 3)
。 -
ximat
:存储每个刚体惯性张量(inertia tensor)的笛卡尔方向,使用旋转矩阵表示,形状为(nbody x 9)
。 -
xanchor
:存储每个关节(joint)锚点的笛卡尔位置,形状为(njnt x 3)
,njnt
表示关节的数量。 -
xaxis
:存储每个关节的笛卡尔轴方向,形状为(njnt x 3)
。 -
geom_xpos
:存储每个几何体(geom)的笛卡尔位置,形状为(ngeom x 3)
,ngeom
表示几何体的数量。 -
geom_xmat
:存储每个几何体的笛卡尔方向,使用旋转矩阵表示,形状为(ngeom x 9)
。 -
site_xpos
:存储每个位点(site)的笛卡尔位置,形状为(nsite x 3)
,nsite
表示位点的数量。 -
site_xmat
:存储每个位点的笛卡尔方向,使用旋转矩阵表示,形状为(nsite x 9)
。 -
cam_xpos
:存储每个相机(camera)的笛卡尔位置,形状为(ncam x 3)
,ncam
表示相机的数量。 -
cam_xmat
:存储每个相机的笛卡尔方向,使用旋转矩阵表示,形状为(ncam x 9)
。 -
light_xpos
:存储每个光源(light)的笛卡尔位置,形状为(nlight x 3)
,nlight
表示光源的数量。
还有一个问题,什么是nbody?(包括像njnt, ncam, nsite之类)。大家其实还是可以去查看的,直接搜索。不过这里呢,直接给大家结论了:
这里的nbody的含义解释,实际上就是在我们马上要说的mjModel里。
可以看到,实际上它就是一个int。
那在nbody里,它实际上还存放着其他的数据信息。由于实在是太长太长太长了。我们在这里就说了几个最常见的。后面的,我们后续说到的别的部分提到了再说哈。
我们加下来要说以下这个mjModel。