as_davenport#
- Rotation.as_davenport(axes, order, degrees=False, *, suppress_warnings=False)[source]#
表示为戴文波特角。
任何方向都可以表示为 3 个基本旋转的组合。
对于欧拉角和戴文波特角,连续的轴必须是正交的 (
axis2与axis1和axis3都正交)。对于欧拉角,axis1或axis3之间还有一种关系,有两种可能性axis1和axis3也正交 (非对称序列)axis1 == axis3(对称序列)
对于戴文波特角,最后这种关系得到了放松 [1],并且只保留了连续正交轴的要求。
为了计算给定轴序列的旋转的戴文波特角,使用了来自 [2] 的算法的略微修改版本。
与欧拉角一样,戴文波特角也存在万向锁问题 [3],即表示失去一个自由度,无法唯一确定第一个和第三个角度。在这种情况下,会发出警告 (除非使用了
suppress_warnings选项),并且第三个角度设置为零。但是,请注意,返回的角度仍然代表正确的旋转。- 参数:
- axesarray_like, shape (…, [1 or 2 or 3], 3) 或 (…, 3)
如果是一维的,则为旋转轴。如果是 N 维的,则描述旋转轴的序列,其中每个 axes[…, i, :] 是第 i 个轴。如果给出多个轴,则第二个轴必须与第一个轴和第三个轴都正交。
- orderstring
如果它属于集合 {‘e’, ‘extrinsic’},则序列将是外在的。如果它属于集合 {‘i’, ‘intrinsic’},则将序列视为内在的。
- degreesboolean, optional
如果此标志为 True,则返回的角度以度为单位,否则以弧度为单位。默认值为 False。
- suppress_warningsboolean, optional
禁用有关万向锁的警告。默认值为 False。
- 返回:
- anglesndarray, shape (…, 3)
形状取决于用于初始化对象的输入的形状。返回的角度的范围是
第一个角度属于 [-180, 180] 度 (含两端)
第三个角度属于 [-180, 180] 度 (含两端)
第二个角度属于一个大小为 180 度的集合,由以下公式给出:
[-abs(lambda), 180 - abs(lambda)],其中lambda是第一个轴和第三个轴之间的角度。
附注
数组 API 标准支持
as_davenport对 NumPy 之外的 Python Array API Standard 兼容后端具有实验性支持。请考虑通过设置环境变量SCIPY_ARRAY_API=1并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备 (或其他功能) 的组合。库
CPU
GPU
NumPy
✅
不适用
CuPy
不适用
⛔
PyTorch
✅
✅
JAX
✅
✅
Dask
⛔
不适用
有关更多信息,请参阅 对数组 API 标准的支持。
参考文献
[1]Shuster, Malcolm & Markley, Landis. (2003). Generalization of the Euler Angles. Journal of the Astronautical Sciences. 51. 123-132. 10.1007/BF03546304.
[2]Bernardes E, Viollet S (2022) Quaternion to Euler angles conversion: A direct, general and computationally efficient method. PLoS ONE 17(11): e0276302. 10.1371/journal.pone.0276302
示例
>>> from scipy.spatial.transform import Rotation as R >>> import numpy as np
戴文波特角是欧拉角的推广,当我们使用规范基轴时
>>> ex = [1, 0, 0] >>> ey = [0, 1, 0] >>> ez = [0, 0, 1]
表示单个旋转
>>> r = R.from_rotvec([0, 0, np.pi/2]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True) array([90., 0., 0.]) >>> r.as_euler('zxy', degrees=True) array([90., 0., 0.]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape (3,)
表示单个旋转的堆叠
>>> r = R.from_rotvec([[0, 0, np.pi/2]]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True) array([[90., 0., 0.]]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape (1, 3)
表示单个对象中的多个旋转
>>> r = R.from_rotvec([ ... [0, 0, 90], ... [45, 0, 0]], degrees=True) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True) array([[90., 0., 0.], [ 0., 45., 0.]]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape (2, 3)