姿态描述一般采用欧拉角,如下所示:

欧拉角有一个弊端,就是存在万向节死锁问题,意思是在某些姿态下,欧拉角的三自由度失去了一个自由度。所以,四元数是姿态描述的另外一种形式,关于四元数的内容,这是一个十分复杂的话题。
四元数是一种扩展了复数概念的超复数系统,由爱尔兰数学家威廉·哈密顿于1843年提出。它由一个实部和三个虚部构成,通常表示为 q = a + bi + cj + dk,其中 a 是实部,b、c、d 是实数系数,而 i、j、k 是满足特定乘法规则(如 i² = j² = k² = ijk = -1)的虚数单位。
四元数的核心优势在于其能简洁、高效地描述三维空间中的旋转。与欧拉角相比,它能避免“万向节锁”问题;与旋转矩阵相比,它仅需四个数值而非九个,计算更高效且不易产生数值误差。在四元数表示旋转时,通常将其规范化为单位四元数,其中实部与旋转角度相关,虚部与旋转轴相关。
正因为这些特性,四元数已成为计算机图形学、机器人学、航空航天和虚拟现实等领域不可或缺的数学工具,广泛应用于相机朝向、关节动画、卫星姿态控制等需要平滑、稳定旋转计算的场景中。它巧妙地在数学抽象与工程应用之间架起了一座桥梁。
更多介绍请移步于四元数相关小节的详细介绍。
PyBullet使用四元数来表示方向,但是由于四元数对人来说不是很直观,所以有两个API可以在四元数和欧拉角之间进行转换。
1、返回四元数[X,Y,Z,W]
getQuaternionFromEuler(eulerAngle, physicsClientId)
2、返回欧拉角[roll, pitch, yaw]
getEulerFromQuaternion (quaternion, physicsClientId)
代码如下所示:
Quaternion = p.getQuaternionFromEuler([0, 0, 0]) # 欧拉角转四元数
Euler = p.getEulerFromQuaternion([0, 0, 0, 1]) # 四元数转欧拉角
print("四元数: ", Quaternion) # 四元数: (0.0, 0.0, 0.0, 1.0)
print("欧拉角: ", Euler) # 欧拉角: (0.0, -0.0, 0.0)