引言
在表示三维空间运动时,常常需要使用欧拉角、旋转矩阵或者四元数来表示当前的旋转姿态。以3×3的旋转矩阵为例,每个矩阵表示了从一组正交坐标基到另一组正交坐标基之间的旋转过程。每个旋转矩阵的行列式为壹。所有3×3旋转矩阵组成了一个9维欧氏空间中的三维流形(manifold)。就像三维地球中的二维地表一样,从一个姿态连续地变换到另一个姿态的过程中,最近的路径是流形上的测地线,而不能打穿地表,连接一条笔直的线条直通地表上另一点。正如同使用线性插值来求解两个已知坐标的中间时刻位置,球面线性插值(Spherical Linear Interpolation, SLERP)用于求解两个已知姿态的中间时刻姿态。
方法
以下介绍了一种使用python来求解球面插值的方法,主要包括三个步骤。
1. 进入python,并导入相关的代码库
import numpy as np from scipy.spatial.transform import Rotation as R from scipy.spatial.transform import Slerp
2. 输入已知的姿态与对应时刻。这里假设初始零时刻姿态为单位矩阵,假设已知姿态时刻为壹时刻。
poses = np.zeros([2,3,3]) poses[0,…] = np.eye(3) poses[1,…] = [[0,-1,0],[1,0,0],[0,0,1]] # 90-degree key_rots = R.from_matrix(poses) key_times = [0,1] slerp = Slerp(key_times, key_rots)
3. 输出中间时刻的姿态。
times = [0, 0.5, 1.0] interp_rots = slerp(times) print(interp_rots.as_matrix()) print(interp_rots.as_quat()) print(interp_rots.as_euler('zxy'))