探究Mujoco系列(1):Mujoco的物体是怎么表示的?

我们从这篇文章开始,在代码实战中将有一个系列教程(或者说探索)——那就是Mujoco引擎的研究。


在此之前,先来扫一下盲。也就是我们Mujoco是什么。我们为什么要研究Mujoco?以防止大家不知道。

不过如果对具身智能有一定了解或者熟悉的同学,想必都应该知道它是什么。因为在仿真里会经常用到它。

Mujoco是什么?

Mujoco 是一个物理仿真引擎,主要用于机器人和生物力学模拟。它由斯坦福大学开发,后来被 DeepMind 收购。特点包括高效、精确,支持多体动力学,接触检测,以及实时仿真。应用领域包括机器人控制、AI 研究、生物医学工程等。

image.png

它的核心技能有三个:

  • 算得又快又准:用自家研发的多体动力学算法,能精确计算机械臂、软体机器人这类复杂结构的运动轨迹,连碰撞摩擦都能模拟得像模像样。

  • 实时互动:游戏级的渲染引擎,能让你边调参数边看机器人跳舞,特别适合调试控制算法。

  • 兼容各种脑洞:不管是双足机器人后空翻,还是仿生鱼在虚拟水里扑腾,甚至细胞级的生物力学模型,它都能轻松拿捏。

为啥工程师们都爱用它?

因为它比 MATLAB 更贴近现实,比游戏引擎更懂物理,还支持 Python/C++ 无缝对接。从斯坦福实验室到波士顿动力的机械狗,从 DeepMind 的 AI 训练到假肢设计,Mujoco 几乎成了机器人领域的「行业标配」。

好。那我们这篇文章,主要来介绍Mujoco中,物体是怎么表示的。

主要是对于它的一些基础的数据结构来做介绍。


有关于物体,它的核心主要是两个内容,一个是MjData,还有一个是MjModel。

大家可以来参考这个文档: Types - MuJoCo Documentation

我们这篇文章,主要就来介绍这俩结构体。

1、首先来看MjData:

大家可以直接在这里搜:

image.png

搜出来的第一个,点击后就能看到跳到这个锚点。

那么能够发现,这个数据结构非常非常非常非常地长。

但是个人认为,其中最核心的是这几个:

  //-------------------- 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)

大家也可以从这几个开始学习。

我们下面给出这几个变量含义的详细解释:

  1. xpos:存储每个刚体(body)坐标系的笛卡尔位置,形状为 (nbody x 3),即每个刚体对应 3 个值,分别代表 xyz 坐标。

  2. xquat:存储每个刚体坐标系的笛卡尔方向,使用四元数表示,形状为 (nbody x 4)。四元数是一种用于表示三维旋转的数学工具。

  3. xmat:同样存储每个刚体坐标系的笛卡尔方向,但使用旋转矩阵表示,形状为 (nbody x 9),因为一个 3x3 的旋转矩阵有 9 个元素。

  4. xipos:存储每个刚体质心(center of mass)的笛卡尔位置,形状为 (nbody x 3)

  5. ximat:存储每个刚体惯性张量(inertia tensor)的笛卡尔方向,使用旋转矩阵表示,形状为 (nbody x 9)

  6. xanchor:存储每个关节(joint)锚点的笛卡尔位置,形状为 (njnt x 3)njnt 表示关节的数量。

  7. xaxis:存储每个关节的笛卡尔轴方向,形状为 (njnt x 3)

  8. geom_xpos:存储每个几何体(geom)的笛卡尔位置,形状为 (ngeom x 3)ngeom 表示几何体的数量。

  9. geom_xmat:存储每个几何体的笛卡尔方向,使用旋转矩阵表示,形状为 (ngeom x 9)

  10. site_xpos:存储每个位点(site)的笛卡尔位置,形状为 (nsite x 3)nsite 表示位点的数量。

  11. site_xmat:存储每个位点的笛卡尔方向,使用旋转矩阵表示,形状为 (nsite x 9)

  12. cam_xpos:存储每个相机(camera)的笛卡尔位置,形状为 (ncam x 3)ncam 表示相机的数量。

  13. cam_xmat:存储每个相机的笛卡尔方向,使用旋转矩阵表示,形状为 (ncam x 9)

  14. light_xpos:存储每个光源(light)的笛卡尔位置,形状为 (nlight x 3)nlight 表示光源的数量。

还有一个问题,什么是nbody?(包括像njnt, ncam, nsite之类)。大家其实还是可以去查看的,直接搜索。不过这里呢,直接给大家结论了:

image.png

这里的nbody的含义解释,实际上就是在我们马上要说的mjModel里。

可以看到,实际上它就是一个int。

那在nbody里,它实际上还存放着其他的数据信息。由于实在是太长太长太长了。我们在这里就说了几个最常见的。后面的,我们后续说到的别的部分提到了再说哈。

我们加下来要说以下这个mjModel。

2、mjModel:

点击代码实战——探究Mujoco系列(1):Mujoco的物体是怎么表示的?查看全文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值