1. 三维刚体的空间表示
假设空间中的一个物体是刚体。换句话来说,这个物体在空间中不会因为任何的力的作用而产生任何的形变,这使得我们可以简单地将这个物体拆分成两个部分,一个是物体的形状信息,一个是物体的位置信息。
形状信息 :在 Isaac Sim 里面通常以 Prim 进行表示,并且以 Mesh 的方式进行储存,即一些通过一系列的点,以及一些多元组表示的面组成的信息。
作为一个例子,在大多数的 Mesh 中,面均以三角形存储,如一个 Mesh 可以被表示为 [(0, 0, 0), (1, 1, 0), (1, 1, 1)] 以及 [(0, 1, 2)] 来表示,前者表示这个 Mesh 的三个顶点在空间中的坐标,而后者则表示仅存在一个面,这个面由序号 0, 1, 2 的三个顶点组成。
位置信息 :通过两个变量来组成,即 position 和 orientation。

-
平移
-
旋转:欧拉角、旋转矩阵、四元数
对于四元数,在 Isaac Sim 中,默认使用的是
scalar_first的形式,也就是[w, x, y, z]的形式,而我们最常使用的旋转库,scipy.spatial.transform.Rotation默认使用的是vector_first的形式,也就是[x, y, z, w]的形式。
2. World Frame
- World Frame
一般来说,任何一个坐标系都可以通过关于另一个坐标系的平移和旋转来表示。事实上这种通过相对关系来进行的表示并不方便,而是存在一个绝对的基准,这样只维护不同坐标系相对于这个绝对的基准的变换关系。
这里合理的,因此给出定义,World Frame,为世界坐标系,是某个空间内绝对的静止的坐标系。
在 Isaac Sim 中,我们认为 Root,即 get_prim_at_path("/") 所获得的 Prim 表示的坐标系为世界坐标系。
- Local Frame
同时,我们也存在另一种需求,诸如我们想要将一个 Camera 和 Franka hand 进行固连,即让 Camera 随着 Franka hand 而运动,似乎我们只能定义一个 Camera 相对于 Franka hand 的变换,从而使得这个变换为固定值。实际中,我们只需要将 Camera 放置在 Franka hand 的 prim_path 下方,就可以确保 franka hand 在变换的过程中使得 Camera 一起变换。
因此在计算 World Frame 的变换的过程中,事实上是通过链式进行传播,将若干 Local Frame 的变换组合在一起而得到的。
3. Isaac Sim 的 API
Isaac Sim 在提供了仿真平台的同时,大概还是给出了一些比较不错的接口的,即之前事实上提到过的,Isaac Sim XFormPrim。在这里给出程序示例:
python
from omni.isaac.core.prims import XFormPrim
from scipy.spatial.transform import Rotation as R
object_xform = XFormPrim("/World/object")
position, orientation = object_xform.get_world_pose()
position[2] += 2.0
orientation_R = R.from_quat(orientation[[1, 2, 3, 0]]) * R.from_euler("xyz", np.array([90,0,0]), degrees=True)
orientation = orientation_R.as_quat()[[3, 0, 1, 2]]
object_xform.set_world_pose(position=position, orientation=orientation)