from_davenport#
- static Rotation.from_davenport(axes, order, angles, degrees=False)[source]#
从戴文波特角初始化。
三维空间中的旋转可以用围绕一系列轴的三个旋转序列来表示。
这三个旋转可以在全局参考系(外旋)或以体心参考系(内旋)中进行,后者附着于并随旋转物体一起移动 [1]。
对于欧拉角和戴文波特角,连续的轴必须是正交的(
axis2与axis1和axis3都正交)。对于欧拉角,axis1或axis3之间还有一种关系,有两种可能性axis1和axis3也正交(非对称序列)axis1 == axis3(对称序列)
对于戴文波特角,最后这种关系得到了放松 [2],并且只保留了连续轴正交的要求。
- 参数:
- axesarray_like, shape (3,) 或 (…, [1 或 2 或 3], 3)
如果是一维的,则为旋转轴。如果是二维或更多维度,则描述旋转轴的序列,其中每个 axes[…, i, :] 是第 i 个轴。如果给出多个轴,则第二个轴必须与第一个轴和第三个轴都正交。
- orderstring
如果等于 ‘e’ 或 ‘extrinsic’,则序列将为外旋。如果等于 ‘i’ 或 ‘intrinsic’,则将序列视为内旋。
- anglesfloat 或 array_like, shape (…, [1 或 2 或 3])
以弧度(degrees 为 False)或度(degrees 为 True)指定的角度。 angles 的最后一个维度中的每个角度 i 围绕相应的轴 axis[…, i, :] 旋转。 结果旋转的形状为 np.broadcast_shapes(np.atleast_2d(axes).shape[:-2], np.atleast_1d(angles).shape[:-1]) 因此,无量纲角度仅对单个轴有效。
- degreesbool, optional
如果为 True,则假定给定的角度以度为单位。默认值为 False。
- 返回:
- rotation
Rotation实例 包含由围绕给定轴以给定角度旋转序列表示的旋转的对象。
- rotation
附注
数组 API 标准支持
from_davenport对 Python Array API Standard 兼容的后端具有实验性支持,除了 NumPy 之外。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
✅
PyTorch
✅
✅
JAX
✅
✅
Dask
⛔
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
参考文献
[2]Shuster, Malcolm & Markley, Landis. (2003). Generalization of the Euler Angles. Journal of the Astronautical Sciences. 51. 123-132. 10.1007/BF03546304。
示例
>>> from scipy.spatial.transform import Rotation as R
戴文波特角是欧拉角的推广,当我们使用规范基轴时
>>> ex = [1, 0, 0] >>> ey = [0, 1, 0] >>> ez = [0, 0, 1]
使用给定的轴序列初始化单个旋转
>>> axes = [ez, ey, ex] >>> r = R.from_davenport(axes, 'extrinsic', [90, 0, 0], degrees=True) >>> r.as_quat().shape (4,)
在这种情况下,它等效于欧拉角
>>> r.as_euler('zyx', degrees=True) array([90., 0., -0.])
在一个对象中初始化多个旋转
>>> r = R.from_davenport(axes, 'extrinsic', [[90, 45, 30], [35, 45, 90]], degrees=True) >>> r.as_quat().shape (2, 4)
也可以只使用一个或两个轴
>>> r = R.from_davenport([ez, ex], 'extrinsic', [[90, 45], [35, 45]], degrees=True) >>> r.as_quat().shape (2, 4)
可以使用非规范轴,并且它们不需要被归一化,只要连续的轴是正交的
>>> e1 = [2, 0, 0] >>> e2 = [0, 1, 0] >>> e3 = [1, 0, 1] >>> axes = [e1, e2, e3] >>> r = R.from_davenport(axes, 'extrinsic', [90, 45, 30], degrees=True) >>> r.as_quat() [ 0.701057, 0.430459, -0.092296, 0.560986]